New bsim3soi version 4.0

This commit is contained in:
dwarning 2008-04-16 20:14:09 +00:00
parent ecd45d7ce3
commit c2d79e44b6
28 changed files with 24032 additions and 41 deletions

View File

@ -0,0 +1,29 @@
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.

View File

@ -3,29 +3,29 @@
noinst_LIBRARIES = libbsim3soi.a
libbsim3soi_a_SOURCES = \
b3soi.c \
b3soiacld.c \
b3soiask.c \
b3soicheck.c \
b3soicvtest.c \
b3soidel.c \
b3soidest.c \
b3soigetic.c \
b3soild.c \
b3soimask.c \
b3soimdel.c \
b3soimpar.c \
b3soinoi.c \
b3soipar.c \
b3soipzld.c \
b3soiset.c \
b3soitemp.c \
b3soitrunc.c \
b3soidef.h \
b3soiext.h \
b3soiinit.c \
b3soiinit.h \
b3soiitf.h
b4soi.c \
b4soiacld.c \
b4soiask.c \
b4soicheck.c \
b4soicvtest.c \
b4soidel.c \
b4soidest.c \
b4soigetic.c \
b4soild.c \
b4soimask.c \
b4soimdel.c \
b4soimpar.c \
b4soinoi.c \
b4soipar.c \
b4soipzld.c \
b4soiset.c \
b4soitemp.c \
b4soitrunc.c \
b4soidef.h \
b4soiext.h \
b4soiinit.c \
b4soiinit.h \
b4soiitf.h

View File

@ -0,0 +1,958 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "devdefs.h"
#include "b4soidef.h"
#include "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( "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"),
IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "BJT 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( "nf", B4SOI_NF, IF_REAL , "Number of fingers"),
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"),
/* 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( "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 */
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( "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( "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"),
IOP( "vtho", B4SOI_MOD_VTH0, IF_REAL,"Threshold voltage"),
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( "ute", B4SOI_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"),
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"),
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( "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( "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( "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( "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"),
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 */
IOP( "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 curent in inversion"),
IOP( "betagb1", B4SOI_MOD_BETAGB1, IF_REAL, "Second Vox dependent parameter for gate currnt 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( "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 */
/* 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( "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( "lvth0", B4SOI_MOD_LVTH0, IF_REAL,"Length dependence of vto"),
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( "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( "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( "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( "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 amoin"),
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( "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( "wvth0", B4SOI_MOD_WVTH0, IF_REAL,"Width dependence of vto"),
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( "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( "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( "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( "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 amoin"),
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"),
/* 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( "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( "pngate", B4SOI_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"),
IOP( "pvth0", B4SOI_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"),
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( "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( "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( "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( "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 amoin"),
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 */
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);

View File

@ -0,0 +1,812 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soiacld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "b4soidef.h"
#include "sperror.h"
#include "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;
double gcrgd, gcrgg, gcrgs, gcrgb, gcrg;
double xcgmgmb, xcgmdb, xcgmsb, xcgmeb, xcdgmb, xcsgmb, xcegmb;
double geltd;
double gigg, gigd, gigs, gigb, gige, gigT;
/* 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 = model->B4SOInextModel)
{
for (here = model->B4SOIinstances; here!= NULL;
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
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;
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;
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.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);
}

View File

@ -0,0 +1,337 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soiask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "b4soidef.h"
#include "sperror.h"
#include "suffix.h"
int
B4SOIask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
IFvalue *select)
{
B4SOIinstance *here = (B4SOIinstance*)inst;
switch(which)
{ case B4SOI_L:
value->rValue = here->B4SOIl;
return(OK);
case B4SOI_W:
value->rValue = here->B4SOIw;
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_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;
return(OK);
case B4SOI_DRAINCONDUCT:
value->rValue = here->B4SOIdrainConductance;
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;
return(OK);
case B4SOI_IBS:
value->rValue = here->B4SOIibs;
return(OK);
case B4SOI_IBD:
value->rValue = here->B4SOIibd;
return(OK);
case B4SOI_ISUB:
value->rValue = here->B4SOIiii;
return(OK);
case B4SOI_IGIDL:
value->rValue = here->B4SOIigidl;
return(OK);
case B4SOI_IGS:
value->rValue = here->B4SOIIgs;
return(OK);
case B4SOI_IGD:
value->rValue = here->B4SOIIgd;
return(OK);
case B4SOI_IGB:
value->rValue = here->B4SOIIgb;
return(OK);
case B4SOI_IGCS:
value->rValue = here->B4SOIIgcs;
return(OK);
case B4SOI_IGCD:
value->rValue = here->B4SOIIgcd;
return(OK);
case B4SOI_GM:
value->rValue = here->B4SOIgm;
return(OK);
case B4SOI_GMID:
value->rValue = here->B4SOIgm/here->B4SOIcd;
return(OK);
case B4SOI_GDS:
value->rValue = here->B4SOIgds;
return(OK);
case B4SOI_GMBS:
value->rValue = here->B4SOIgmbs;
return(OK);
case B4SOI_GBD:
value->rValue = here->B4SOIgjdb;
return(OK);
case B4SOI_GBS:
value->rValue = here->B4SOIgjsb;
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;
return(OK);
case B4SOI_CBSB:
value->rValue = here->B4SOIcbsb;
return(OK);
case B4SOI_VON:
value->rValue = here->B4SOIvon;
return(OK);
case B4SOI_VDSAT:
value->rValue = here->B4SOIvdsat;
return(OK);
case B4SOI_QBS:
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbs);
return(OK);
case B4SOI_QBD:
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd);
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,924 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soicheck.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "b4soidef.h"
#include "trandefs.h"
#include "const.h"
#include "sperror.h"
#include "devdefs.h"
#include "suffix.h"
int
B4SOIcheckModel(B4SOImodel *model, B4SOIinstance *here, CKTcircuit *ckt)
{
struct b4soiSizeDependParam *pParam;
int Fatal_Flag = 0;
FILE *fplog;
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->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);
}
}
/* v2.2.3 */
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 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;
}
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);
}
/* v3.0 */
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;
}
/* 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->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->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->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->B4SOIvoxh < 0.0)
{ fprintf(fplog, "Warning: Voxh = %g is negative.\n",
model->B4SOIvoxh);
printf("Warning: Voxh = %g is negative.\n", model->B4SOIvoxh);
}
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);
}
/* 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);
}
/* 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);
}
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->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 (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");
}
}/* 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);
}

View File

@ -0,0 +1,95 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soicvtest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "b4soidef.h"
#include "trandefs.h"
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "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 = model->B4SOInextModel)
{ /* loop through all the instances of the model */
for (here = model->B4SOIinstances; here != NULL ;
here=here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
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);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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, b3soidel.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* File: b4soidel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "b4soidef.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int
B4SOIdelete(GENmodel *inModel, IFuid name, GENinstance **inInst)
{
B4SOIinstance **fast = (B4SOIinstance**)inInst;
B4SOImodel *model = (B4SOImodel*)inModel;
B4SOIinstance **prev = NULL;
B4SOIinstance *here;
for (; model ; model = model->B4SOInextModel)
{ prev = &(model->B4SOIinstances);
for (here = *prev; here ; here = *prev)
{ if (here->B4SOIname == name || (fast && here==*fast))
{ *prev= here->B4SOInextInstance;
FREE(here);
return(OK);
}
prev = &(here->B4SOInextInstance);
}
}
return(E_NODEV);
}

View File

@ -0,0 +1,41 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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, b3soidest.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* File: b4soidest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "b4soidef.h"
#include "suffix.h"
void
B4SOIdestroy(GENmodel **inModel)
{
B4SOImodel **model = (B4SOImodel**)inModel;
B4SOIinstance *here;
B4SOIinstance *prev = NULL;
B4SOImodel *mod = *model;
B4SOImodel *oldmod = NULL;
for (; mod ; mod = mod->B4SOInextModel)
{ if(oldmod) FREE(oldmod);
oldmod = mod;
prev = (B4SOIinstance *)NULL;
for (here = mod->B4SOIinstances; here; here = here->B4SOInextInstance)
{ if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);
}
if(oldmod) FREE(oldmod);
*model = NULL;
return;
}

View File

@ -0,0 +1,53 @@
/**********
Copyright 2005 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h)
File: b4soiext.h
**********/
#ifdef __STDC__
extern int B4SOIacLoad(GENmodel *,CKTcircuit*);
extern int B4SOIask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int B4SOIconvTest(GENmodel *,CKTcircuit*);
extern int B4SOIdelete(GENmodel*,IFuid,GENinstance**);
extern void B4SOIdestroy(GENmodel**);
extern int B4SOIgetic(GENmodel*,CKTcircuit*);
extern int B4SOIload(GENmodel*,CKTcircuit*);
extern int B4SOImAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
extern int B4SOImDelete(GENmodel**,IFuid,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*);
#else /* stdc */
extern int B4SOIacLoad();
extern int B4SOIdelete();
extern void B4SOIdestroy();
extern int B4SOIgetic();
extern int B4SOIload();
extern int B4SOImDelete();
extern int B4SOIask();
extern int B4SOImAsk();
extern int B4SOIconvTest();
extern int B4SOItemp();
extern int B4SOImParam();
extern void B4SOImosCap();
extern int B4SOIparam();
extern int B4SOIpzLoad();
extern int B4SOIsetup();
extern int B4SOItrunc();
extern int B4SOInoise();
extern int B4SOIunsetup();
#endif /* stdc */

View File

@ -0,0 +1,57 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soigetic.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "b4soidef.h"
#include "sperror.h"
#include "suffix.h"
int
B4SOIgetic(GENmodel *inModel, CKTcircuit *ckt)
{
B4SOImodel *model = (B4SOImodel*)inModel;
B4SOIinstance *here;
for (; model ; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here; here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
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);
}

View File

@ -0,0 +1,83 @@
#include "config.h"
#include "devdefs.h"
#include "b4soiitf.h"
#include "b4soiext.h"
#include "b4soiinit.h"
SPICEdev B4SOIinfo = {
{ "B4SOI",
"Berkeley SOI MOSFET model version 4.0",
&B4SOInSize,
&B4SOInSize,
B4SOInames,
&B4SOIpTSize,
B4SOIpTable,
&B4SOImPTSize,
B4SOImPTable,
#ifdef XSPICE
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
/*--------------------------- End of SDB fix -------------------------*/
#endif
DEV_DEFAULT
},
/* DEVparam */ B4SOIparam,
/* DEVmodParam */ B4SOImParam,
/* DEVload */ B4SOIload,
/* DEVsetup */ B4SOIsetup,
/* DEVunsetup */ B4SOIunsetup,
/* DEVpzSetup */ B4SOIsetup,
/* DEVtemperature*/ B4SOItemp,
/* DEVtrunc */ B4SOItrunc,
/* DEVfindBranch */ NULL,
/* DEVacLoad */ B4SOIacLoad,
/* DEVaccept */ NULL,
/* DEVdestroy */ B4SOIdestroy,
/* DEVmodDelete */ B4SOImDelete,
/* DEVdelete */ B4SOIdelete,
/* 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,
#ifdef CIDER
/* DEVdump */ NULL,
/* DEVacct */ NULL,
#endif
/* DEVinstSize */ &B4SOIiSize,
/* DEVmodSize */ &B4SOImSize
};
SPICEdev *
get_b4soi_info (void)
{
return &B4SOIinfo;
}

View File

@ -0,0 +1,13 @@
#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

View File

@ -0,0 +1,15 @@
/**********
Copyright 2005 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiitf.h)
File: b4soiitf.h
**********/
#ifndef DEV_B4SOI
#define DEV_B4SOI
#include "b4soiext.h"
SPICEdev *get_b4soi_info (void);
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soimdel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "b4soidef.h"
#include "sperror.h"
#include "suffix.h"
int
B4SOImDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
{
B4SOImodel **model = (B4SOImodel**)inModel;
B4SOImodel *modfast = (B4SOImodel*)kill;
B4SOIinstance *here;
B4SOIinstance *prev = NULL;
B4SOImodel **oldmod;
oldmod = model;
for (; *model ; model = &((*model)->B4SOInextModel))
{ if ((*model)->B4SOImodName == modname ||
(modfast && *model == modfast))
goto delgot;
oldmod = model;
}
return(E_NOMOD);
delgot:
*oldmod = (*model)->B4SOInextModel; /* cut deleted device out of list */
for (here = (*model)->B4SOIinstances; here; here = here->B4SOInextInstance)
{ if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);
FREE(*model);
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,579 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soinoi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "b4soidef.h"
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "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
*/
extern void NevalSrc();
extern double Nintegrate();
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 * pParam->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;
char name[N_MXVLNTH];
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;
int i;
/* 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 = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here != NULL;
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
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++)
{ (void) sprintf(name, "onoise.%s%s",
here->B4SOIname,
B4SOInNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **) NULL);
/* we've added one more plot */
}
break;
case INT_NOIZ:
for (i = 0; i < B4SOINSRCS; i++)
{ (void) sprintf(name, "onoise_total.%s%s",
here->B4SOIname,
B4SOInNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **) NULL);
/* we've added one more plot */
(void) sprintf(name, "inoise_total.%s%s",
here->B4SOIname,
B4SOInNames[i]);
data->namelist = (IFuid *) trealloc(
(char *) data->namelist,
(data->numPlots + 1)
* sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
(void **)NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
switch (mode)
{ case N_DENS:
if (model->B4SOItnoiMod == 0) /* v4.0 */
{ if (model->B4SOIrdsMod == 0)
{ gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance;
}
else
{ gspr = here->B4SOIgstot;
gdpr = here->B4SOIgdtot;
}
}
else
{ 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);
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 * here->B4SOIm);
NevalSrc(&noizDens[B4SOIRSNOIZ],
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
here->B4SOIsNodePrime, here->B4SOIsNode,
gspr * here->B4SOIm);
if ((here->B4SOIrgateMod == 1) ||
(here->B4SOIrgateMod == 2))
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd);
}
else if (here->B4SOIrgateMod == 3)
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNodeMid,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd);
}
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);
NevalSrc(&noizDens[B4SOIRBDBNOIZ],
&lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIdbNode,
here->B4SOIgrbdb);
}
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,
1/ here->B4SOIrbodyext +
1/ pParam->B4SOIrbody);
}
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)))
* model->B4SOIntnoi );
break;
/* v2.2.3 bug fix */
case 1:
T0 = here->B4SOIgm + here->B4SOIgmbs +
here->B4SOIgds;
T0 *= T0;
esat = 2.0 * pParam->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;
T1 = npart_beta * (here->B4SOIgm
+ here->B4SOIgmbs) + here->B4SOIgds;
T2 = T1 * T1 * here->B4SOIVdseff /
here->B4SOIcd;
NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
(T2 - igsquare));
break;
case 2:
NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
model->B4SOIntnoi *
(2.0 / 3.0 * fabs(here->B4SOIgm
+ here->B4SOIgds
+ here->B4SOIgmbs)));
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] *= 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] *=
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;
}
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp);
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp;
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] *= (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) * here->B4SOIm);
NevalSrc(&noizDens[B4SOIIGDNOIZ],
&lnNdens[B4SOIIGDNOIZ], ckt, SHOTNOISE,
here->B4SOIgNode, here->B4SOIdNodePrime,
(here->B4SOIIgd + here->B4SOIIgcd) * here->B4SOIm);
NevalSrc(&noizDens[B4SOIIGBNOIZ],
&lnNdens[B4SOIIGBNOIZ], ckt, SHOTNOISE,
here->B4SOIgNode, here->B4SOIbNode,
here->B4SOIig * here->B4SOIm);
/* 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 * here->B4SOIm);
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * fabs(here->B4SOIibd) * here->B4SOIm);
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);
}

View File

@ -0,0 +1,225 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soipar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "ifsim.h"
#include "b4soidef.h"
#include "sperror.h"
#include "suffix.h"
int
B4SOIparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
B4SOIinstance *here = (B4SOIinstance*)inst;
switch(param)
{ case B4SOI_W:
here->B4SOIw = value->rValue;
here->B4SOIwGiven = TRUE;
break;
case B4SOI_L:
here->B4SOIl = value->rValue;
here->B4SOIlGiven = TRUE;
break;
case B4SOI_M:
here->B4SOIm = value->rValue;
here->B4SOImGiven = TRUE;
break;
case B4SOI_AS:
here->B4SOIsourceArea = value->rValue;
here->B4SOIsourceAreaGiven = TRUE;
break;
case B4SOI_AD:
here->B4SOIdrainArea = value->rValue;
here->B4SOIdrainAreaGiven = TRUE;
break;
case B4SOI_PS:
here->B4SOIsourcePerimeter = value->rValue;
here->B4SOIsourcePerimeterGiven = TRUE;
break;
case B4SOI_PD:
here->B4SOIdrainPerimeter = value->rValue;
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_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;
case 4:
here->B4SOIicVES = *(value->v.vec.rVec+3);
here->B4SOIicVESGiven = TRUE;
case 3:
here->B4SOIicVBS = *(value->v.vec.rVec+2);
here->B4SOIicVBSGiven = TRUE;
case 2:
here->B4SOIicVGS = *(value->v.vec.rVec+1);
here->B4SOIicVGSGiven = TRUE;
case 1:
here->B4SOIicVDS = *(value->v.vec.rVec);
here->B4SOIicVDSGiven = TRUE;
break;
default:
return(E_BADPARM);
}
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,158 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soipzld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "complex.h"
#include "sperror.h"
#include "b4soidef.h"
#include "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;
for (; model != NULL; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here!= NULL;
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
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);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,53 @@
/*** B4SOI 11/30/2005 Xuemei (Jane) Xi Release ***/
/**********
* Copyright 2005 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.
* File: b4soitrunc.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "b4soidef.h"
#include "sperror.h"
#include "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 = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here != NULL;
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme)
continue;
#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);
}

View File

@ -89,7 +89,7 @@ int add_udn(int,Evt_Udn_Info_t **);
#include "bsim4v3/bsim4v3itf.h"
#include "bsim4v4/bsim4v4itf.h"
#include "bsim4v5/bsim4v5itf.h"
#include "bsim3soi/b3soiitf.h"
#include "bsim3soi/b4soiitf.h"
#include "bsim3soi_pd/b3soipditf.h"
#include "bsim3soi_fd/b3soifditf.h"
#include "bsim3soi_dd/b3soidditf.h"
@ -195,7 +195,7 @@ spice_init_devices(void)
DEVices[ 9] = get_bsim3v1a_info();
DEVices[10] = get_bsim3v1s_info();
DEVices[11] = get_bsim3v32_info();
DEVices[12] = get_b3soi_info();
DEVices[12] = get_b4soi_info();
DEVices[13] = get_bsim4_info();
DEVices[14] = get_bsim4v2_info();
DEVices[15] = get_bsim4v3_info();
@ -294,12 +294,12 @@ SPICEdev ** devices(void)
#ifdef ADMS
#define DEVICES_USED {"asrc", "bjt", "bjt2", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim3soipd", "bsim3soifd", "bsim3soidd", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"}
#else
#define DEVICES_USED {"asrc", "bjt", "bjt2", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim3soipd", "bsim3soifd", "bsim3soidd", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"}
#endif

View File

@ -113,14 +113,14 @@ INP2M (void *ckt, INPtables * tab, card * current)
INPgetMod (ckt, model, &thismodel, tab); /* get pointer to the model */
if (thismodel != NULL)
{
if ((thismodel->INPmodType != INPtypelook ("B3SOI")) &&
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD"))
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 9, 29-31 B3SOI(PD | FD | DD) can have 7 nodes") return;
LITERR ("only level 55-58: B3SOI(PD|FD|DD) and B4SOI can have 7 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD model, allocate the 7th node */
@ -140,8 +140,8 @@ INP2M (void *ckt, INPtables * tab, card * current)
/*saj*/
}
else
{ /* 7th token is a model - only have 6 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B3SOI")) &&
{ /* 7th token is a model - only have 6 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
@ -149,10 +149,10 @@ INP2M (void *ckt, INPtables * tab, card * current)
)
{
/* if model is not variable node B3SOIPD/FD/DD or STAG model, error! */
LITERR ("only level 9, 29-31 B3SOI(PD | FD | DD) and STAG (SOI3) can have 6 nodes") return;
LITERR ("only level 55-58,60: B3SOI(PD|FD|DD), B4SOI and STAG (SOI3) can have 6 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 6th node */
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 6th node */
INPtermInsert (ckt, &nname5, tab, &node5);
INPtermInsert (ckt, &nname6, tab, &node6);
model = nname7;
@ -160,8 +160,8 @@ INP2M (void *ckt, INPtables * tab, card * current)
}
}
else
{ /* 6th token is a model - only have 5 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B3SOI")) &&
{ /* 6th token is a model - only have 5 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
@ -169,10 +169,10 @@ INP2M (void *ckt, INPtables * tab, card * current)
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 9, 29-31 B3SOI(PD | FD | DD) and STAG (SOI3) can have 5 nodes") return;
LITERR ("only level 55-58,60: B3SOI(PD|FD|DD), B4SOI and STAG (SOI3) can have 5 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 5th node */
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 5th node */
INPtermInsert (ckt, &nname5, tab, &node5);
model = nname6; /* make model point to the correct token */
}
@ -211,7 +211,7 @@ INP2M (void *ckt, INPtables * tab, card * current)
&& thismodel->INPmodType != INPtypelook ("BSIM2")
&& thismodel->INPmodType != INPtypelook ("BSIM3")
&& thismodel->INPmodType != INPtypelook ("BSIM3v32")
&& thismodel->INPmodType != INPtypelook ("B3SOI")
&& thismodel->INPmodType != INPtypelook ("B4SOI")
&& thismodel->INPmodType != INPtypelook ("B3SOIPD")
&& thismodel->INPmodType != INPtypelook ("B3SOIFD")
&& thismodel->INPmodType != INPtypelook ("B3SOIDD")
@ -263,7 +263,7 @@ INP2M (void *ckt, INPtables * tab, card * current)
IFC (bindNode, (ckt, fast, 3, node3));
IFC (bindNode, (ckt, fast, 4, node4));
/*use type not thismodel->INPmodType as it might not exist!*/
if ((type == INPtypelook ("B3SOI")) ||
if ((type == INPtypelook ("B4SOI")) ||
(type == INPtypelook ("B3SOIPD")) ||
(type == INPtypelook ("B3SOIFD")) ||
(type == INPtypelook ("B3SOIDD")) ||

View File

@ -391,11 +391,11 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
}
break;
case 58:
type = INPtypelook("B3SOI");
type = INPtypelook("B4SOI");
if (type < 0) {
err =
INPmkTemp
("Device type B3SOI V3.0 not available in this binary\n");
("Device type B4SOI V4.0 not available in this binary\n");
}
break;
case 60: