28 changed files with 24032 additions and 41 deletions
-
29src/spicelib/devices/bsim3soi/BsimTerms_use
-
46src/spicelib/devices/bsim3soi/Makefile.am
-
958src/spicelib/devices/bsim3soi/b4soi.c
-
812src/spicelib/devices/bsim3soi/b4soiacld.c
-
337src/spicelib/devices/bsim3soi/b4soiask.c
-
924src/spicelib/devices/bsim3soi/b4soicheck.c
-
95src/spicelib/devices/bsim3soi/b4soicvtest.c
-
3556src/spicelib/devices/bsim3soi/b4soidef.h
-
41src/spicelib/devices/bsim3soi/b4soidel.c
-
41src/spicelib/devices/bsim3soi/b4soidest.c
-
53src/spicelib/devices/bsim3soi/b4soiext.h
-
57src/spicelib/devices/bsim3soi/b4soigetic.c
-
83src/spicelib/devices/bsim3soi/b4soiinit.c
-
13src/spicelib/devices/bsim3soi/b4soiinit.h
-
15src/spicelib/devices/bsim3soi/b4soiitf.h
-
6573src/spicelib/devices/bsim3soi/b4soild.c
-
2332src/spicelib/devices/bsim3soi/b4soimask.c
-
47src/spicelib/devices/bsim3soi/b4soimdel.c
-
3154src/spicelib/devices/bsim3soi/b4soimpar.c
-
579src/spicelib/devices/bsim3soi/b4soinoi.c
-
225src/spicelib/devices/bsim3soi/b4soipar.c
-
158src/spicelib/devices/bsim3soi/b4soipzld.c
-
2350src/spicelib/devices/bsim3soi/b4soiset.c
-
1506src/spicelib/devices/bsim3soi/b4soitemp.c
-
53src/spicelib/devices/bsim3soi/b4soitrunc.c
-
8src/spicelib/devices/dev.c
-
24src/spicelib/parser/inp2m.c
-
4src/spicelib/parser/inpdomod.c
@ -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. |
||||
@ -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); |
||||
|
|
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
@ -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 */ |
||||
|
} |
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
3556
src/spicelib/devices/bsim3soi/b4soidef.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -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; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -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 */ |
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -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; |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -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 |
||||
@ -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 |
||||
|
|
||||
6573
src/spicelib/devices/bsim3soi/b4soild.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2332
src/spicelib/devices/bsim3soi/b4soimask.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
3154
src/spicelib/devices/bsim3soi/b4soimpar.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -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); |
||||
|
} |
||||
|
|
||||
|
|
||||
2350
src/spicelib/devices/bsim3soi/b4soiset.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1506
src/spicelib/devices/bsim3soi/b4soitemp.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue