update `bsim3soi' aka `b4soi'

This commit is contained in:
dwarning 2012-05-20 00:26:39 +02:00
parent 5bb4c56165
commit 1c4f960b45
24 changed files with 6585 additions and 5496 deletions

View File

@ -15,15 +15,15 @@ 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.
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.
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.
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.
the software on any copy or modification of such made available
to others.

View File

@ -3,29 +3,29 @@
noinst_LTLIBRARIES = libbsim4soi.la
libbsim4soi_la_SOURCES = \
b4soi.c \
b4soiacld.c \
b4soiask.c \
b4soicheck.c \
b4soicvtest.c \
b4soidel.c \
b4soidest.c \
b4soigetic.c \
b4soild.c \
b4soimask.c \
b4soimdel.c \
b4soimpar.c \
b4soinoi.c \
b4soipar.c \
b4soipzld.c \
b4soiset.c \
b4soitemp.c \
b4soitrunc.c \
b4soidef.h \
b4soiext.h \
b4soiinit.c \
b4soiinit.h \
b4soiitf.h
b4soi.c \
b4soiacld.c \
b4soiask.c \
b4soicheck.c \
b4soicvtest.c \
b4soidel.c \
b4soidest.c \
b4soigetic.c \
b4soild.c \
b4soimask.c \
b4soimdel.c \
b4soimpar.c \
b4soinoi.c \
b4soipar.c \
b4soipzld.c \
b4soiset.c \
b4soitemp.c \
b4soitrunc.c \
b4soidef.h \
b4soiext.h \
b4soiinit.c \
b4soiinit.h \
b4soiitf.h

View File

@ -1,5 +1,5 @@
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -7,11 +7,13 @@
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soi.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
* File: b4soi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
* Modified by Tanvir Morshed 12/16/2010
**********/
#include "ngspice/ngspice.h"
@ -46,7 +48,7 @@ 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( "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"),
@ -78,8 +80,8 @@ OP( "debug2", B4SOI_DEBUG2, IF_REAL, "DebugOut2"),
OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"),
#endif
IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "DEBUG on/off flag"),
IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "DEBUG on/off flag"),
IOP( "rth0", B4SOI_RTH0, IF_REAL, "Instance Thermal Resistance"),
IOP( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"),
IOP( "nrb", B4SOI_NRB, IF_REAL, "Number of squares in body"),
@ -236,6 +238,8 @@ IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness
IOP( "xj", B4SOI_MOD_XJ, IF_REAL, "Junction Depth"),
IOP( "rth0", B4SOI_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"),
IOP( "cth0", B4SOI_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"),
IOP( "cfrcoeff", B4SOI_MOD_CFRCOEFF, IF_REAL, "Fringe Cap parameter"), /* v4.4 */
IOP( "egidl", B4SOI_MOD_EGIDL, IF_REAL, "GIDL first parameter"),
IOP( "agidl", B4SOI_MOD_AGIDL, IF_REAL, "GIDL second parameter"),
IOP( "bgidl", B4SOI_MOD_BGIDL, IF_REAL, "GIDL third parameter"),
@ -267,8 +271,8 @@ IOP( "pbswg", B4SOI_MOD_PBSWGS, IF_REAL, "Source(gate side) sidewall junction ca
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( "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 */
@ -539,7 +543,7 @@ IOP( "xgl", B4SOI_MOD_XGL, IF_REAL, "Variation in Ldrawn"),
/* 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 */
IOP( "rdsmod", B4SOI_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"), /* v4.0 */
/* v4.1 */
IOP( "fdmod", B4SOI_MOD_FDMOD, IF_INTEGER, "Improved dVbi model selector"),
@ -1114,10 +1118,10 @@ char *B4SOInames[] = {
"Charge",
};
int B4SOInSize = NUMELEMS(B4SOInames);
int B4SOIpTSize = NUMELEMS(B4SOIpTable);
int B4SOImPTSize = NUMELEMS(B4SOImPTable);
int B4SOIiSize = sizeof(B4SOIinstance);
int B4SOImSize = sizeof(B4SOImodel);
int B4SOInSize = NUMELEMS(B4SOInames);
int B4SOIpTSize = NUMELEMS(B4SOIpTable);
int B4SOImPTSize = NUMELEMS(B4SOImPTable);
int B4SOIiSize = sizeof(B4SOIinstance);
int B4SOImSize = sizeof(B4SOImodel);

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -6,6 +7,7 @@
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiacld.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
* File: b4soiacld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
@ -21,7 +23,9 @@
int
B4SOIacLoad(GENmodel *inModel, CKTcircuit *ckt)
B4SOIacLoad(
GENmodel *inModel,
CKTcircuit *ckt)
{
register B4SOImodel *model = (B4SOImodel*)inModel;
register B4SOIinstance *here;
@ -76,18 +80,19 @@ double m;
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;
{ 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;
FwdSum = Gm + Gmbs + Gme; /* v3.0 */
RevSum = 0.0;
cbgb = here->B4SOIcbgb;
cbsb = here->B4SOIcbsb;
@ -120,7 +125,7 @@ double m;
gigd = here->B4SOIgigd;
gigT = model->B4SOItype * here->B4SOIgigT;
/* v4.1 */
/* v4.1 */
gigpg = here->B4SOIgigpg;
gigpp = here->B4SOIgigpp;
@ -132,7 +137,7 @@ double m;
gbbe = -here->B4SOIgbes;
if (here->B4SOIrbodyMod) { /* v4.0 */
gbbdp = -here->B4SOIgiigidld;
gbbdp = -here->B4SOIgiigidld;
gbbb = -here->B4SOIgbgiigbpb;
}
@ -140,10 +145,10 @@ double m;
gddpg = -here->B4SOIgjdg;
gddpdp = -here->B4SOIgjdd;
if (!here->B4SOIrbodyMod) /* v4.0 */
gddpb = -here->B4SOIgjdb;
else
gddpb = here->B4SOIgiigidlb;
if (!here->B4SOIrbodyMod) /* v4.0 */
gddpb = -here->B4SOIgjdb;
else
gddpb = here->B4SOIgiigidlb;
gddpT = -model->B4SOItype * here->B4SOIgjdT;
@ -153,16 +158,16 @@ double m;
gsspg = -here->B4SOIgjsg;
gsspdp = -here->B4SOIgjsd;
if (!here->B4SOIrbodyMod) /* v4.0 */
gsspb = -here->B4SOIgjsb;
else
gsspb = 0.0;
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;
gppb = -here->B4SOIgbpbs;
gppp = -here->B4SOIgbpps;
gTtg = here->B4SOIgtempg;
@ -204,7 +209,7 @@ double m;
sxpart = 0.6;
dxpart = 0.4;
/* v3.1 for RF */
/* v3.1 for RF */
if (here->B4SOIrgateMod == 2)
T0 = *(ckt->CKTstates[0] + here->B4SOIvges)
- *(ckt->CKTstates[0] + here->B4SOIvgs);
@ -221,19 +226,19 @@ double m;
}
else
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
/* v3.1 for RF end*/
/* v3.1 for RF end*/
}
else
{ Gm = -here->B4SOIgm;
Gmbs = -here->B4SOIgmbs;
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 */
FwdSum = 0.0;
RevSum = -Gm - Gmbs - Gme; /* v3.0 */
cdgb = - (here->B4SOIcdgb + here->B4SOIcggb + here->B4SOIcbgb);
cdsb = - (here->B4SOIcddb + here->B4SOIcgdb + here->B4SOIcbdb);
@ -269,7 +274,7 @@ double m;
gigpg = here->B4SOIgigpg;/* bugfix_snps for setting gigpg gigpp*/
gigpp = here->B4SOIgigpp;
gbbg = -here->B4SOIgbgs;
gbbb = -here->B4SOIgbbs;
gbbp = -here->B4SOIgbps;
@ -287,10 +292,10 @@ double m;
gddpg = -here->B4SOIgjsg;
gddpsp = -here->B4SOIgjsd;
if (!here->B4SOIrbodyMod) /* v4.0 */
gddpb = -here->B4SOIgjsb;
else
gddpb = 0.0;
if (!here->B4SOIrbodyMod) /* v4.0 */
gddpb = -here->B4SOIgjsb;
else
gddpb = 0.0;
gddpT = -model->B4SOItype * here->B4SOIgjsT;
@ -300,10 +305,10 @@ double m;
gsspg = -here->B4SOIgjdg;
gsspsp = -here->B4SOIgjdd;
if (!here->B4SOIrbodyMod) /* v4.0 */
gsspb = -here->B4SOIgjdb;
else
gsspb = here->B4SOIgiigidlb;
if (!here->B4SOIrbodyMod) /* v4.0 */
gsspb = -here->B4SOIgjdb;
else
gsspb = here->B4SOIgiigidlb;
gsspT = -model->B4SOItype * here->B4SOIgjdT;
@ -353,7 +358,7 @@ double m;
sxpart = 0.4;
dxpart = 0.6;
/* v3.1 for RF */
/* v3.1 for RF */
if (here->B4SOIrgateMod == 2)
T0 = *(ckt->CKTstates[0] + here->B4SOIvges)
- *(ckt->CKTstates[0] + here->B4SOIvgs);
@ -371,28 +376,28 @@ double m;
else
gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
/* v3.1 RF end*/
/* v3.1 RF end*/
}
if (!model->B4SOIrdsMod) {
gdpr=here->B4SOIdrainConductance;
gspr=here->B4SOIsourceConductance;
}
else gdpr = gspr = 0.0;
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;
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
GEoverlapCap = here->pParam->B4SOIcgeo;
EDextrinsicCap = here->B4SOIgcde;
ESextrinsicCap = here->B4SOIgcse;
/* v3.1 added for RF */
/* v3.1 added for RF */
if (here->B4SOIrgateMod == 3)
{
xcgmgmb = (GDoverlapCap + GSoverlapCap + GEoverlapCap ) * omega;
@ -408,10 +413,10 @@ double m;
xcdeb = (cdeb - EDextrinsicCap) * omega;
xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega;
xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap)
* omega;
* omega;
xcesb = -ESextrinsicCap * omega;
xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb))
* omega;
* omega;
xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega;
@ -440,23 +445,23 @@ double m;
xcTt = cTt * omega;
}
else
{
else
{
xcedb = -EDextrinsicCap * omega;
xcdeb = (cdeb - EDextrinsicCap) * omega;
xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega;
xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap)
* omega;
* omega;
xcesb = -ESextrinsicCap * omega;
xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb))
* omega;
* omega;
xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega;
xcegb = (- GEoverlapCap) * omega;
xceT = ceT * omega;
xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap)
* omega;
* omega;
xcgdb = (cgdb - GDoverlapCap ) * omega;
xcgsb = (cgsb - GSoverlapCap) * omega;
xcgeb = (- GEoverlapCap) * omega;
@ -477,11 +482,11 @@ double m;
xcbT = cbT * omega;
xcTt = cTt * omega;
/* v3.1 */
/* v3.1 */
xcdgmb = xcsgmb = xcegmb = 0.0;
xcgmgmb = xcgmdb = xcgmsb = xcgmeb =0.0;
}
}
if (here->B4SOImode >= 0) { /* v4.0 */
if (!here->B4SOIrbodyMod) {
@ -496,16 +501,16 @@ double m;
xcjdbdp = here->B4SOIcjdb * omega;
xcjsbsp = here->B4SOIcjsb * omega;
xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb)
+ xcjdbdp;
+ xcjdbdp;
xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb)
+ xcjsbsp;
+ xcjsbsp;
xcdbdb = -here->B4SOIcjdb * omega;
xcsbsb = -here->B4SOIcjsb * omega;
xcbdb = here->B4SOIcbdb * omega - xcdbdb;
xcbsb = here->B4SOIcbsb * omega - xcsbsb;
}
}
else {
}
else {
if (!here->B4SOIrbodyMod) {
xcjdbdp = xcjsbsp = 0.0;
xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb);
@ -518,18 +523,18 @@ double m;
xcjdbdp = here->B4SOIcjsb * omega;
xcjsbsp = here->B4SOIcjdb * omega;
xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb)
+ xcjdbdp;
+ xcjdbdp;
xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb)
+ xcjsbsp;
+ xcjsbsp;
xcdbdb = -here->B4SOIcjsb * omega;
xcsbsb = -here->B4SOIcjdb * omega;
xcbdb = here->B4SOIcbsb * omega - xcdbdb;
xcbsb = here->B4SOIcbdb * omega - xcsbsb;
}
}
}
if (model->B4SOIrdsMod == 1)
if (model->B4SOIrdsMod == 1)
{ gstot = here->B4SOIgstot;
gstotd = here->B4SOIgstotd;
gstotg = here->B4SOIgstotg;
@ -547,13 +552,13 @@ double m;
gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0;
}
m = here->B4SOIm;
m = here->B4SOIm;
/* v3.1 for RF */
/* v3.1 for RF */
geltd = here->B4SOIgrgeltd;
if (here->B4SOIrgateMod == 1)
{
*(here->B4SOIGEgePtr) += m * geltd;
*(here->B4SOIGEgePtr) += m * geltd;
*(here->B4SOIGgePtr) -= m * geltd;
*(here->B4SOIGEgPtr) -= m * geltd;
*(here->B4SOIGgPtr) += m * (geltd + gigg + gIgtotg); /* v3.1.1 bug fix */
@ -569,14 +574,14 @@ double m;
*(here->B4SOIGEgPtr) += m * gcrgg;
*(here->B4SOIGEdpPtr) += m * gcrgd;
*(here->B4SOIGEspPtr) += m * gcrgs;
if (here->B4SOIsoiMod != 2) /* v3.2 */
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 */
if (here->B4SOIsoiMod != 2) /* v3.2 */
*(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */
}
@ -593,7 +598,7 @@ double m;
*(here->B4SOIGMgPtr) += m * gcrgg;
*(here->B4SOIGMspPtr) += m * gcrgs;
*(here->B4SOIGMspPtr +1) += m * xcgmsb;
if (here->B4SOIsoiMod != 2) /* v3.2 */
if (here->B4SOIsoiMod != 2) /* v3.2 */
*(here->B4SOIGMbPtr) += m * gcrgb;
*(here->B4SOIGMePtr +1) += m * xcgmeb;
@ -605,7 +610,7 @@ double m;
*(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 */
if (here->B4SOIsoiMod != 2) /* v3.2 */
*(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */
}
else
@ -613,20 +618,20 @@ double m;
*(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 */
if (here->B4SOIsoiMod != 2) /* v3.2 */
*(here->B4SOIGbPtr) += m * (gigb + gIgtotb); /* v3.1.1 bug fix */
}
/* v3.1 for RF end*/
/* 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);
}
if (here->B4SOIsoiMod != 2) {
(*(here->B4SOIDbPtr) += m * gdtotb);
(*(here->B4SOISbPtr) += m * gstotb);
}
}
*(here->B4SOIEdpPtr +1) += m * xcedb;
@ -660,13 +665,13 @@ double m;
*(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) -= xcdgb + xcddb + xcdsb + xcdeb;
+ xcdgmb; */
*(here->B4SOIDPbPtr +1) -= m * -xcdbb; /* v4.0 */
/* *(here->B4SOISPbPtr +1) -= xcsgb + xcsdb + xcssb + xcseb
+ xcsgmb; */
+ xcsgmb; */
*(here->B4SOISPbPtr +1) -= m * -xcsbb; /* v4.0 */
*(here->B4SOIBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb);
}
@ -701,17 +706,17 @@ double m;
*(here->B4SOIDPgPtr) += m * (Gm + gddpg - gIdtotg -gdtotg); /* v4.0 */
*(here->B4SOIDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum - gIdtotd
- gdtotd); /* v4.0 */
- gdtotd); /* v4.0 */
*(here->B4SOIDPspPtr) -= m * (gds + FwdSum - gddpsp + gIdtots
+ gdtots); /* v4.0 */
+ 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 */
+ gstotd); /* v4.0 */
*(here->B4SOISPspPtr) += m * (gspr + gds + FwdSum + gsspsp - gIstots
- gstots); /* v4.0 */
- gstots); /* v4.0 */
*(here->B4SOISPsPtr) -= m * (gspr + gstot);
@ -724,9 +729,9 @@ double m;
*(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 */
/* v4.0 */
*(here->B4SOIDPbPtr) -= m * ((-gddpb - Gmbs) + gIdtotb + gdtotb);
/* v4.0 */
/* v4.0 */
}
/* v3.1 */
@ -778,11 +783,11 @@ double m;
/* v4.0 */
if (here->B4SOIrbodyMod)
{
(*(here->B4SOIDPdbPtr + 1) -= m * xcjdbdp);
(*(here->B4SOIDPdbPtr) -= m * here->B4SOIGGjdb);
/* 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);
@ -806,8 +811,7 @@ double m;
(*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb
+ here->B4SOIgrbdb));
}
}
if (here->B4SOIdebugMod != 0)
{

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -20,12 +21,15 @@
#include "ngspice/devdefs.h"
#include "b4soidef.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
B4SOIask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
B4SOIask(
CKTcircuit *ckt,
GENinstance *inst,
int which,
IFvalue *value,
IFvalue *select)
{
B4SOIinstance *here = (B4SOIinstance*)inst;
@ -81,9 +85,6 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_QB:
value->rValue = here->B4SOIqbulk;
return(OK);
case B4SOI_QG:
value->rValue = here->B4SOIqgate;
return(OK);
case B4SOI_QD:
value->rValue = here->B4SOIqdrn;
return(OK);
@ -188,7 +189,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_AGBCP2:
value->rValue = here->B4SOIagbcp2;
return(OK); /* v4.1 for BC improvement */
case B4SOI_AGBCPD: /* v4.0 */
case B4SOI_AGBCPD: /* v4.0 */
value->rValue = here->B4SOIagbcpd;
return(OK);
case B4SOI_AEBCP:
@ -291,7 +292,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_IGIDL:
value->rValue = here->B4SOIigidl;
return(OK);
case B4SOI_IGISL:
case B4SOI_IGISL:
value->rValue = here->B4SOIigisl;
return(OK);
case B4SOI_IGS:
@ -368,9 +369,6 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_QBD:
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd);
return(OK);
case B4SOI_DEBUG:
value->iValue = here->B4SOIdebugMod;
return(OK);
#ifdef B4SOI_DEBUG_OUT
case B4SOI_DEBUG1:
value->rValue = here->B4SOIdebug1;

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -25,8 +26,9 @@
int
B4SOIconvTest(GENmodel *inModel, CKTcircuit *ckt)
B4SOIconvTest(
GENmodel *inModel,
CKTcircuit *ckt)
{
register B4SOImodel *model = (B4SOImodel*)inModel;
register B4SOIinstance *here;
@ -38,19 +40,21 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
{ /* loop through all the instances of the model */
for (here = model->B4SOIinstances; here != NULL ;
here=here->B4SOInextInstance)
{ vbs = model->B4SOItype
* (*(ckt->CKTrhsOld+here->B4SOIbNode)
- *(ckt->CKTrhsOld+here->B4SOIsNodePrime));
{
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));
* (*(ckt->CKTrhsOld+here->B4SOIgNode)
- *(ckt->CKTrhsOld+here->B4SOIsNodePrime));
vds = model->B4SOItype
* (*(ckt->CKTrhsOld+here->B4SOIdNodePrime)
- *(ckt->CKTrhsOld+here->B4SOIsNodePrime));
* (*(ckt->CKTrhsOld+here->B4SOIdNodePrime)
- *(ckt->CKTrhsOld+here->B4SOIsNodePrime));
vbd = vbs - vds;
vgd = vgs - vds;
vgdo = *(ckt->CKTstate0 + here->B4SOIvgs)
- *(ckt->CKTstate0 + here->B4SOIvds);
- *(ckt->CKTstate0 + here->B4SOIvds);
delvbs = vbs - *(ckt->CKTstate0 + here->B4SOIvbs);
delvbd = vbd - *(ckt->CKTstate0 + here->B4SOIvbd);
delvgs = vgs - *(ckt->CKTstate0 + here->B4SOIvgs);
@ -59,33 +63,33 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
cd = here->B4SOIcd;
if (here->B4SOImode >= 0)
{ cdhat = cd - here->B4SOIgjdb * delvbd
+ here->B4SOIgmbs * delvbs + here->B4SOIgm * delvgs
+ here->B4SOIgds * delvds;
{ 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;
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;
{ tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd))
+ ckt->CKTabstol;
if (fabs(cdhat - cd) >= tol)
{ ckt->CKTnoncon++;
{ ckt->CKTnoncon++;
return(OK);
}
cbs = here->B4SOIcjs;
cbd = here->B4SOIcjd;
cbhat = cbs + cbd + here->B4SOIgjdb * delvbd
+ here->B4SOIgjsb * delvbs;
+ here->B4SOIgjsb * delvbs;
tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd))
+ ckt->CKTabstol;
+ ckt->CKTabstol;
if (fabs(cbhat - (cbs + cbd)) > tol)
{ ckt->CKTnoncon++;
{ ckt->CKTnoncon++;
return(OK);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -22,8 +23,10 @@
int
B4SOIdelete(GENmodel *inModel, IFuid name, GENinstance **inInst)
B4SOIdelete(
GENmodel *inModel,
IFuid name,
GENinstance **inInst)
{
B4SOIinstance **fast = (B4SOIinstance**)inInst;
B4SOImodel *model = (B4SOImodel*)inModel;
@ -33,8 +36,8 @@ 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;
{ if (here->B4SOIname == name || (fast && here==*fast))
{ *prev= here->B4SOInextInstance;
FREE(here);
return(OK);
}

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -19,8 +20,8 @@
#include "ngspice/suffix.h"
void
B4SOIdestroy(GENmodel **inModel)
B4SOIdestroy(
GENmodel **inModel)
{
B4SOImodel **model = (B4SOImodel**)inModel;
B4SOIinstance *here;
@ -31,9 +32,11 @@ B4SOImodel *oldmod = NULL;
for (; mod ; mod = mod->B4SOInextModel)
{ if(oldmod) FREE(oldmod);
oldmod = mod;
prev = NULL;
prev = (B4SOIinstance *)NULL;
for (here = mod->B4SOIinstances; here; here = here->B4SOInextInstance)
{ if(prev) FREE(prev);
{
if (here->B4SOIowner != ARCHme) continue;
if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);

View File

@ -3,6 +3,7 @@ Copyright 2010 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h)
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
File: b4soiext.h
**********/

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -22,33 +23,36 @@
int
B4SOIgetic(GENmodel *inModel, CKTcircuit *ckt)
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->B4SOIicVBSGiven)
{ here->B4SOIicVBS = *(ckt->CKTrhs + here->B4SOIbNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
{
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);
{ here->B4SOIicVDS = *(ckt->CKTrhs + here->B4SOIdNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
}
if (!here->B4SOIicVGSGiven)
{ here->B4SOIicVGS = *(ckt->CKTrhs + here->B4SOIgNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
{ here->B4SOIicVGS = *(ckt->CKTrhs + here->B4SOIgNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
}
if (!here->B4SOIicVESGiven)
{ here->B4SOIicVES = *(ckt->CKTrhs + here->B4SOIeNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
{ here->B4SOIicVES = *(ckt->CKTrhs + here->B4SOIeNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
}
if (!here->B4SOIicVPSGiven)
{ here->B4SOIicVPS = *(ckt->CKTrhs + here->B4SOIpNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
{ here->B4SOIicVPS = *(ckt->CKTrhs + here->B4SOIpNode)
- *(ckt->CKTrhs + here->B4SOIsNode);
}
}
}

View File

@ -7,7 +7,7 @@
SPICEdev B4SOIinfo = {
{ "B4SOI",
"Berkeley SOI MOSFET model version 4.3.1",
"Berkeley SOI MOSFET model version 4.4.0",
&B4SOInSize,
&B4SOInSize,
@ -18,7 +18,7 @@ SPICEdev B4SOIinfo = {
&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 */
@ -33,9 +33,9 @@ SPICEdev B4SOIinfo = {
NULL, /* This is a SPICE device, it has no MIF info data */
/*--------------------------- End of SDB fix -------------------------*/
#endif
DEV_DEFAULT
DEV_DEFAULT
},
/* DEVparam */ B4SOIparam,

View File

@ -1,7 +1,9 @@
/**********
Copyright 2009 Regents of the University of California. All rights reserved.
Copyright 2010 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiitf.h)
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
File: b4soiitf.h
**********/

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
/** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -11,9 +12,11 @@
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
* Modified by Tanvir Morshed 12/16/2010
**********/
#include "ngspice/ngspice.h"
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/devdefs.h"
@ -29,9 +32,7 @@ int which,
IFvalue *value)
{
B4SOImodel *model = (B4SOImodel *)inst;
NG_IGNORE(ckt);
switch(which)
{ case B4SOI_MOD_MOBMOD:
value->iValue = model->B4SOImobMod;
@ -59,61 +60,61 @@ IFvalue *value)
case B4SOI_MOD_TOX :
value->rValue = model->B4SOItox;
return(OK);
case B4SOI_MOD_TOXP :
case B4SOI_MOD_TOXP :
value->rValue = model->B4SOItoxp;
return(OK);
case B4SOI_MOD_LEFFEOT :
case B4SOI_MOD_LEFFEOT :
value->rValue = model->B4SOIleffeot;
return(OK);
case B4SOI_MOD_WEFFEOT :
case B4SOI_MOD_WEFFEOT :
value->rValue = model->B4SOIweffeot;
return(OK);
case B4SOI_MOD_VDDEOT :
case B4SOI_MOD_VDDEOT :
value->rValue = model->B4SOIvddeot;
return(OK);
case B4SOI_MOD_TEMPEOT :
case B4SOI_MOD_TEMPEOT :
value->rValue = model->B4SOItempeot;
return(OK);
case B4SOI_MOD_ADOS :
case B4SOI_MOD_ADOS :
value->rValue = model->B4SOIados;
return(OK);
case B4SOI_MOD_BDOS :
case B4SOI_MOD_BDOS :
value->rValue = model->B4SOIbdos;
return(OK);
case B4SOI_MOD_EPSRGATE:
value->rValue = model->B4SOIepsrgate;
return(OK);
value->rValue = model->B4SOIepsrgate;
return(OK);
case B4SOI_MOD_PHIG:
value->rValue = model->B4SOIphig;
return(OK);
value->rValue = model->B4SOIphig;
return(OK);
case B4SOI_MOD_EASUB:
value->rValue = model->B4SOIeasub;
return(OK);
return(OK);
case B4SOI_MOD_TOXM :
value->rValue = model->B4SOItoxm;
return(OK); /* v3.2 */
/*4.1*/
case B4SOI_MOD_EOT :
/*4.1*/
case B4SOI_MOD_EOT :
value->rValue = model->B4SOIeot;
return(OK);
case B4SOI_MOD_EPSROX :
return(OK);
case B4SOI_MOD_EPSROX :
value->rValue = model->B4SOIepsrox;
return(OK);
case B4SOI_MOD_EPSRSUB:
case B4SOI_MOD_EPSRSUB:
value->rValue = model->B4SOIepsrsub;
return(OK);
case B4SOI_MOD_NI0SUB:
case B4SOI_MOD_NI0SUB:
value->rValue = model->B4SOIni0sub;
return(OK);
case B4SOI_MOD_BG0SUB:
case B4SOI_MOD_BG0SUB:
value->rValue = model->B4SOIbg0sub;
return(OK);
case B4SOI_MOD_TBGASUB:
case B4SOI_MOD_TBGASUB:
value->rValue = model->B4SOItbgasub;
return(OK);
case B4SOI_MOD_TBGBSUB:
case B4SOI_MOD_TBGBSUB:
value->rValue = model->B4SOItbgbsub;
return(OK);
/* v2.2.3 */
@ -272,69 +273,69 @@ IFvalue *value)
case B4SOI_MOD_UTE:
value->rValue = model->B4SOIute;
return(OK);
/*4.1 mobmod=4*/
/*4.1 mobmod=4*/
case B4SOI_MOD_UD:
value->rValue = model->B4SOIud;
return(OK);
value->rValue = model->B4SOIud;
return(OK);
case B4SOI_MOD_LUD:
value->rValue = model->B4SOIlud;
return(OK);
value->rValue = model->B4SOIlud;
return(OK);
case B4SOI_MOD_WUD:
value->rValue = model->B4SOIwud;
return(OK);
value->rValue = model->B4SOIwud;
return(OK);
case B4SOI_MOD_PUD:
value->rValue = model->B4SOIpud;
return(OK);
value->rValue = model->B4SOIpud;
return(OK);
case B4SOI_MOD_UD1:
value->rValue = model->B4SOIud1;
return(OK);
value->rValue = model->B4SOIud1;
return(OK);
case B4SOI_MOD_LUD1:
value->rValue = model->B4SOIlud1;
return(OK);
value->rValue = model->B4SOIlud1;
return(OK);
case B4SOI_MOD_WUD1:
value->rValue = model->B4SOIwud1;
return(OK);
value->rValue = model->B4SOIwud1;
return(OK);
case B4SOI_MOD_PUD1:
value->rValue = model->B4SOIpud1;
return(OK);
case B4SOI_MOD_EU:
value->rValue = model->B4SOIeu;
value->rValue = model->B4SOIpud1;
return(OK);
case B4SOI_MOD_EU:
value->rValue = model->B4SOIeu;
return(OK);
case B4SOI_MOD_LEU:
value->rValue = model->B4SOIleu;
case B4SOI_MOD_LEU:
value->rValue = model->B4SOIleu;
return(OK);
case B4SOI_MOD_WEU:
value->rValue = model->B4SOIweu;
case B4SOI_MOD_WEU:
value->rValue = model->B4SOIweu;
return(OK);
case B4SOI_MOD_PEU:
value->rValue = model->B4SOIpeu;
case B4SOI_MOD_PEU:
value->rValue = model->B4SOIpeu;
return(OK);
case B4SOI_MOD_UCS:
value->rValue = model->B4SOIucs;
case B4SOI_MOD_UCS:
value->rValue = model->B4SOIucs;
return(OK);
case B4SOI_MOD_LUCS:
value->rValue = model->B4SOIlucs;
case B4SOI_MOD_LUCS:
value->rValue = model->B4SOIlucs;
return(OK);
case B4SOI_MOD_WUCS:
value->rValue = model->B4SOIwucs;
case B4SOI_MOD_WUCS:
value->rValue = model->B4SOIwucs;
return(OK);
case B4SOI_MOD_PUCS:
value->rValue = model->B4SOIpucs;
case B4SOI_MOD_PUCS:
value->rValue = model->B4SOIpucs;
return(OK);
case B4SOI_MOD_UCSTE:
case B4SOI_MOD_UCSTE:
value->rValue = model->B4SOIucste;
return(OK);
case B4SOI_MOD_LUCSTE:
case B4SOI_MOD_LUCSTE:
value->rValue = model->B4SOIlucste;
return(OK);
case B4SOI_MOD_WUCSTE:
case B4SOI_MOD_WUCSTE:
value->rValue = model->B4SOIwucste;
return(OK);
case B4SOI_MOD_PUCSTE:
case B4SOI_MOD_PUCSTE:
value->rValue = model->B4SOIpucste;
return(OK);
return(OK);
case B4SOI_MOD_VOFF:
value->rValue = model->B4SOIvoff;
return(OK);
@ -437,7 +438,7 @@ IFvalue *value)
case B4SOI_MOD_TSI:
value->rValue = model->B4SOItsi;
return(OK);
case B4SOI_MOD_ETSI:
case B4SOI_MOD_ETSI:
value->rValue = model->B4SOIetsi;
return(OK);
case B4SOI_MOD_RTH0:
@ -474,7 +475,7 @@ IFvalue *value)
value->rValue = model->B4SOIxtund;
return(OK);
case B4SOI_MOD_TT:
case B4SOI_MOD_TT:
value->rValue = model->B4SOItt;
return(OK);
case B4SOI_MOD_VSDTH:
@ -510,22 +511,22 @@ IFvalue *value)
case B4SOI_MOD_RSH:
value->rValue = model->B4SOIsheetResistance;
return(OK);
case B4SOI_MOD_PBSWGS: /* v4.0 */
case B4SOI_MOD_PBSWGS: /* v4.0 */
value->rValue = model->B4SOIGatesidewallJctSPotential;
return(OK);
case B4SOI_MOD_PBSWGD: /* v4.0 */
case B4SOI_MOD_PBSWGD: /* v4.0 */
value->rValue = model->B4SOIGatesidewallJctDPotential;
return(OK);
case B4SOI_MOD_MJSWGS: /* v4.0 */
case B4SOI_MOD_MJSWGS: /* v4.0 */
value->rValue = model->B4SOIbodyJctGateSideSGradingCoeff;
return(OK);
case B4SOI_MOD_MJSWGD: /* v4.0 */
case B4SOI_MOD_MJSWGD: /* v4.0 */
value->rValue = model->B4SOIbodyJctGateSideDGradingCoeff;
return(OK);
case B4SOI_MOD_CJSWGS: /* v4.0 */
case B4SOI_MOD_CJSWGS: /* v4.0 */
value->rValue = model->B4SOIunitLengthGateSidewallJctCapS;
return(OK);
case B4SOI_MOD_CJSWGD: /* v4.0 */
case B4SOI_MOD_CJSWGD: /* v4.0 */
value->rValue = model->B4SOIunitLengthGateSidewallJctCapD;
return(OK);
case B4SOI_MOD_CSDESW:
@ -726,10 +727,10 @@ IFvalue *value)
case B4SOI_MOD_TII:
value->rValue = model->B4SOItii;
return(OK);
/*4.1 Iii model*/
case B4SOI_MOD_TVBCI:
/*4.1 Iii model*/
case B4SOI_MOD_TVBCI:
value->rValue = model->B4SOItvbci;
return(OK);
return(OK);
case B4SOI_MOD_LII:
value->rValue = model->B4SOIlii;
return(OK);
@ -748,8 +749,8 @@ IFvalue *value)
case B4SOI_MOD_FBJTII:
value->rValue = model->B4SOIfbjtii;
return(OK);
/*4.1 Iii model*/
case B4SOI_MOD_EBJTII:
/*4.1 Iii model*/
case B4SOI_MOD_EBJTII:
value->rValue = model->B4SOIebjtii;
return(OK);
case B4SOI_MOD_CBJTII:
@ -767,61 +768,61 @@ IFvalue *value)
case B4SOI_MOD_ESATII:
value->rValue = model->B4SOIesatii;
return(OK);
case B4SOI_MOD_NTUNS: /* v4.0 */
case B4SOI_MOD_NTUNS: /* v4.0 */
value->rValue = model->B4SOIntun;
return(OK);
case B4SOI_MOD_NTUND: /* v4.0 */
case B4SOI_MOD_NTUND: /* v4.0 */
value->rValue = model->B4SOIntund;
return(OK);
case B4SOI_MOD_NRECF0S: /* v4.0 */
case B4SOI_MOD_NRECF0S: /* v4.0 */
value->rValue = model->B4SOInrecf0;
return(OK);
case B4SOI_MOD_NRECF0D: /* v4.0 */
case B4SOI_MOD_NRECF0D: /* v4.0 */
value->rValue = model->B4SOInrecf0d;
return(OK);
case B4SOI_MOD_NRECR0S: /* v4.0 */
case B4SOI_MOD_NRECR0S: /* v4.0 */
value->rValue = model->B4SOInrecr0;
return(OK);
case B4SOI_MOD_NRECR0D: /* v4.0 */
case B4SOI_MOD_NRECR0D: /* v4.0 */
value->rValue = model->B4SOInrecr0d;
return(OK);
case B4SOI_MOD_ISBJT:
value->rValue = model->B4SOIisbjt;
return(OK);
case B4SOI_MOD_IDBJT: /* v4.0 */
case B4SOI_MOD_IDBJT: /* v4.0 */
value->rValue = model->B4SOIidbjt;
return(OK);
case B4SOI_MOD_ISDIF:
value->rValue = model->B4SOIisdif;
return(OK);
case B4SOI_MOD_IDDIF: /* v4.0 */
case B4SOI_MOD_IDDIF: /* v4.0 */
value->rValue = model->B4SOIiddif;
return(OK);
case B4SOI_MOD_ISREC:
value->rValue = model->B4SOIisrec;
return(OK);
case B4SOI_MOD_IDREC: /* v4.0 */
case B4SOI_MOD_IDREC: /* v4.0 */
value->rValue = model->B4SOIidrec;
return(OK);
case B4SOI_MOD_ISTUN:
value->rValue = model->B4SOIistun;
return(OK);
case B4SOI_MOD_IDTUN: /* v4.0 */
case B4SOI_MOD_IDTUN: /* v4.0 */
value->rValue = model->B4SOIidtun;
return(OK);
case B4SOI_MOD_LN:
value->rValue = model->B4SOIln;
return(OK);
case B4SOI_MOD_VREC0S: /* v4.0 */
case B4SOI_MOD_VREC0S: /* v4.0 */
value->rValue = model->B4SOIvrec0;
return(OK);
case B4SOI_MOD_VREC0D: /* v4.0 */
case B4SOI_MOD_VREC0D: /* v4.0 */
value->rValue = model->B4SOIvrec0d;
return(OK);
case B4SOI_MOD_VTUN0S: /* v4.0 */
case B4SOI_MOD_VTUN0S: /* v4.0 */
value->rValue = model->B4SOIvtun0;
return(OK);
case B4SOI_MOD_VTUN0D: /* v4.0 */
case B4SOI_MOD_VTUN0D: /* v4.0 */
value->rValue = model->B4SOIvtun0d;
return(OK);
case B4SOI_MOD_NBJT:
@ -839,10 +840,10 @@ IFvalue *value)
case B4SOI_MOD_AELY:
value->rValue = model->B4SOIaely;
return(OK);
case B4SOI_MOD_AHLIS: /* v4.0 */
case B4SOI_MOD_AHLIS: /* v4.0 */
value->rValue = model->B4SOIahli;
return(OK);
case B4SOI_MOD_AHLID: /* v4.0 */
case B4SOI_MOD_AHLID: /* v4.0 */
value->rValue = model->B4SOIahlid;
return(OK);
case B4SOI_MOD_RBODY:
@ -896,7 +897,10 @@ IFvalue *value)
case B4SOI_MOD_DLBG:
value->rValue = model->B4SOIdlbg;
return(OK);
/* v4.4 */
case B4SOI_MOD_CFRCOEFF:
value->rValue = model->B4SOIcfrcoeff;
return(OK);
case B4SOI_MOD_EGIDL:
value->rValue = model->B4SOIegidl;
return(OK);
@ -918,8 +922,8 @@ IFvalue *value)
case B4SOI_MOD_FGIDL:
value->rValue = model->B4SOIfgidl;
return(OK);
case B4SOI_MOD_EGISL:
case B4SOI_MOD_EGISL:
value->rValue = model->B4SOIegisl;
return(OK);
case B4SOI_MOD_AGISL:
@ -939,8 +943,8 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_FGISL:
value->rValue = model->B4SOIfgisl;
return(OK);
return(OK);
case B4SOI_MOD_FDMOD:
value->rValue = model->B4SOIfdMod;
return(OK);
@ -949,7 +953,7 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_CDSBS:
value->rValue = model->B4SOIcdsbs;
return(OK);
return(OK);
case B4SOI_MOD_MINVCV:
value->rValue = model->B4SOIminvcv;
@ -962,7 +966,7 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_PMINVCV:
value->rValue = model->B4SOIpminvcv;
return(OK);
return(OK);
case B4SOI_MOD_VOFFCV:
value->rValue = model->B4SOIvoffcv;
return(OK);
@ -974,7 +978,7 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_PVOFFCV:
value->rValue = model->B4SOIpvoffcv;
return(OK);
return(OK);
/* v3.0 */
case B4SOI_MOD_SOIMOD:
value->iValue = model->B4SOIsoiMod;
@ -1207,11 +1211,11 @@ IFvalue *value)
/* v4.0 end */
/* v3.2 */
case B4SOI_MOD_FNOIMOD :
value->iValue = model->B4SOIfnoiMod;
return(OK);
case B4SOI_MOD_TNOIMOD :
value->iValue = model->B4SOItnoiMod;
case B4SOI_MOD_FNOIMOD :
value->iValue = model->B4SOIfnoiMod;
return(OK);
case B4SOI_MOD_TNOIMOD :
value->iValue = model->B4SOItnoiMod;
case B4SOI_MOD_TNOIA:
value->rValue = model->B4SOItnoia;
return(OK);
@ -1234,10 +1238,10 @@ IFvalue *value)
value->iValue = model->B4SOIrgateMod;
return(OK);
case B4SOI_MOD_XRCRG1:
value->rValue = model->B4SOIxrcrg1; /* Changed from iValue to rvalue */
value->rValue = model->B4SOIxrcrg1;
return(OK);
case B4SOI_MOD_XRCRG2:
value->rValue = model->B4SOIxrcrg2; /* Changed from iValue to rvalue */
value->rValue = model->B4SOIxrcrg2;
return(OK);
case B4SOI_MOD_RSHG:
value->rValue = model->B4SOIrshg;
@ -1257,15 +1261,15 @@ IFvalue *value)
case B4SOI_MOD_MTRLMOD :
value->iValue = model->B4SOImtrlMod;
return(OK);
case B4SOI_MOD_VGSTCVMOD:
case B4SOI_MOD_VGSTCVMOD:
value->iValue = model->B4SOIvgstcvMod;
return(OK);
case B4SOI_MOD_GIDLMOD :
value->iValue = model->B4SOIgidlMod;
return(OK);
case B4SOI_MOD_IIIMOD :
case B4SOI_MOD_IIIMOD :
value->iValue = model->B4SOIiiiMod;
return(OK);
return(OK);
/* v3.0 */
case B4SOI_MOD_IGBMOD:
value->iValue = model->B4SOIigbMod;
@ -1441,7 +1445,7 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_LNSD:
value->rValue = model->B4SOIlnsd;
return(OK);
return(OK);
case B4SOI_MOD_LVTH0:
value->rValue = model->B4SOIlvth0;
return(OK);
@ -1613,8 +1617,8 @@ IFvalue *value)
case B4SOI_MOD_LFBJTII:
value->rValue = model->B4SOIlfbjtii;
return(OK);
/*4.1 Iii model*/
case B4SOI_MOD_LEBJTII:
/*4.1 Iii model*/
case B4SOI_MOD_LEBJTII:
value->rValue = model->B4SOIlebjtii;
return(OK);
case B4SOI_MOD_LCBJTII:
@ -1680,8 +1684,8 @@ IFvalue *value)
case B4SOI_MOD_LFGIDL:
value->rValue = model->B4SOIlfgidl;
return(OK);
case B4SOI_MOD_LAGISL:
case B4SOI_MOD_LAGISL:
value->rValue = model->B4SOIlagisl;
return(OK);
case B4SOI_MOD_LBGISL:
@ -1701,11 +1705,11 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_LFGISL:
value->rValue = model->B4SOIlfgisl;
return(OK);
case B4SOI_MOD_LNTUNS: /* v4.0 */
return(OK);
case B4SOI_MOD_LNTUNS: /* v4.0 */
value->rValue = model->B4SOIlntun;
return(OK);
case B4SOI_MOD_LNTUND: /* v4.0 */
case B4SOI_MOD_LNTUND: /* v4.0 */
value->rValue = model->B4SOIlntund;
return(OK);
case B4SOI_MOD_LNDIODES: /* v4.0 */
@ -1714,40 +1718,40 @@ IFvalue *value)
case B4SOI_MOD_LNDIODED: /* v4.0 */
value->rValue = model->B4SOIlndioded;
return(OK);
case B4SOI_MOD_LNRECF0S: /* v4.0 */
case B4SOI_MOD_LNRECF0S: /* v4.0 */
value->rValue = model->B4SOIlnrecf0;
return(OK);
case B4SOI_MOD_LNRECF0D: /* v4.0 */
case B4SOI_MOD_LNRECF0D: /* v4.0 */
value->rValue = model->B4SOIlnrecf0d;
return(OK);
case B4SOI_MOD_LNRECR0S: /* v4.0 */
case B4SOI_MOD_LNRECR0S: /* v4.0 */
value->rValue = model->B4SOIlnrecr0;
return(OK);
case B4SOI_MOD_LNRECR0D: /* v4.0 */
case B4SOI_MOD_LNRECR0D: /* v4.0 */
value->rValue = model->B4SOIlnrecr0d;
return(OK);
case B4SOI_MOD_LISBJT:
value->rValue = model->B4SOIlisbjt;
return(OK);
case B4SOI_MOD_LIDBJT: /* v4.0 */
case B4SOI_MOD_LIDBJT: /* v4.0 */
value->rValue = model->B4SOIlidbjt;
return(OK);
case B4SOI_MOD_LISDIF:
value->rValue = model->B4SOIlisdif;
return(OK);
case B4SOI_MOD_LIDDIF: /* v4.0 */
case B4SOI_MOD_LIDDIF: /* v4.0 */
value->rValue = model->B4SOIliddif;
return(OK);
case B4SOI_MOD_LISREC:
value->rValue = model->B4SOIlisrec;
return(OK);
case B4SOI_MOD_LIDREC: /* v4.0 */
case B4SOI_MOD_LIDREC: /* v4.0 */
value->rValue = model->B4SOIlidrec;
return(OK);
case B4SOI_MOD_LISTUN:
value->rValue = model->B4SOIlistun;
return(OK);
case B4SOI_MOD_LIDTUN: /* v4.0 */
case B4SOI_MOD_LIDTUN: /* v4.0 */
value->rValue = model->B4SOIlidtun;
return(OK);
case B4SOI_MOD_LVREC0S: /* v4.0 */
@ -1774,13 +1778,13 @@ IFvalue *value)
case B4SOI_MOD_LAELY:
value->rValue = model->B4SOIlaely;
return(OK);
case B4SOI_MOD_LAHLIS: /* v4.0 */
case B4SOI_MOD_LAHLIS: /* v4.0 */
value->rValue = model->B4SOIlahli;
return(OK);
case B4SOI_MOD_LAHLID: /* v4.0 */
case B4SOI_MOD_LAHLID: /* v4.0 */
value->rValue = model->B4SOIlahlid;
return(OK);
/* CV Model */
/* CV Model */
case B4SOI_MOD_LVSDFB:
value->rValue = model->B4SOIlvsdfb;
return(OK);
@ -2105,8 +2109,8 @@ IFvalue *value)
case B4SOI_MOD_WFBJTII:
value->rValue = model->B4SOIwfbjtii;
return(OK);
/*4.1 Iii model*/
case B4SOI_MOD_WEBJTII:
/*4.1 Iii model*/
case B4SOI_MOD_WEBJTII:
value->rValue = model->B4SOIwebjtii;
return(OK);
case B4SOI_MOD_WCBJTII:
@ -2165,47 +2169,47 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_WRGIDL:
value->rValue = model->B4SOIwrgidl;
return(OK);
return(OK);
case B4SOI_MOD_WKGIDL:
value->rValue = model->B4SOIwkgidl;
return(OK);
case B4SOI_MOD_WFGIDL:
value->rValue = model->B4SOIwfgidl;
return(OK);
case B4SOI_MOD_WAGISL:
case B4SOI_MOD_WAGISL:
value->rValue = model->B4SOIwagisl;
return(OK);
case B4SOI_MOD_WBGISL:
value->rValue = model->B4SOIwbgisl;
return(OK);
case B4SOI_MOD_WCGISL:
value->rValue = model->B4SOIwcgisl;
return(OK);
case B4SOI_MOD_WEGISL:
value->rValue = model->B4SOIwegisl;
return(OK);
case B4SOI_MOD_WRGISL:
value->rValue = model->B4SOIwrgisl;
return(OK);
return(OK);
case B4SOI_MOD_WKGISL:
value->rValue = model->B4SOIwkgisl;
return(OK);
case B4SOI_MOD_WFGISL:
value->rValue = model->B4SOIwfgisl;
return(OK);
case B4SOI_MOD_WNTUNS: /* v4.0 */
case B4SOI_MOD_WNTUNS: /* v4.0 */
value->rValue = model->B4SOIwntun;
return(OK);
case B4SOI_MOD_WNTUND: /* v4.0 */
case B4SOI_MOD_WNTUND: /* v4.0 */
value->rValue = model->B4SOIwntund;
return(OK);
case B4SOI_MOD_WNDIODES: /* v4.0 */
@ -2214,40 +2218,40 @@ IFvalue *value)
case B4SOI_MOD_WNDIODED: /* v4.0 */
value->rValue = model->B4SOIwndioded;
return(OK);
case B4SOI_MOD_WNRECF0S: /* v4.0 */
case B4SOI_MOD_WNRECF0S: /* v4.0 */
value->rValue = model->B4SOIwnrecf0;
return(OK);
case B4SOI_MOD_WNRECF0D: /* v4.0 */
case B4SOI_MOD_WNRECF0D: /* v4.0 */
value->rValue = model->B4SOIwnrecf0d;
return(OK);
case B4SOI_MOD_WNRECR0S: /* v4.0 */
case B4SOI_MOD_WNRECR0S: /* v4.0 */
value->rValue = model->B4SOIwnrecr0;
return(OK);
case B4SOI_MOD_WNRECR0D: /* v4.0 */
case B4SOI_MOD_WNRECR0D: /* v4.0 */
value->rValue = model->B4SOIwnrecr0d;
return(OK);
case B4SOI_MOD_WISBJT:
value->rValue = model->B4SOIwisbjt;
return(OK);
case B4SOI_MOD_WIDBJT: /* v4.0 */
case B4SOI_MOD_WIDBJT: /* v4.0 */
value->rValue = model->B4SOIwidbjt;
return(OK);
case B4SOI_MOD_WISDIF:
value->rValue = model->B4SOIwisdif;
return(OK);
case B4SOI_MOD_WIDDIF: /* v4.0 */
case B4SOI_MOD_WIDDIF: /* v4.0 */
value->rValue = model->B4SOIwiddif;
return(OK);
case B4SOI_MOD_WISREC:
value->rValue = model->B4SOIwisrec;
return(OK);
case B4SOI_MOD_WIDREC: /* v4.0 */
case B4SOI_MOD_WIDREC: /* v4.0 */
value->rValue = model->B4SOIwidrec;
return(OK);
case B4SOI_MOD_WISTUN:
value->rValue = model->B4SOIwistun;
return(OK);
case B4SOI_MOD_WIDTUN: /* v4.0 */
case B4SOI_MOD_WIDTUN: /* v4.0 */
value->rValue = model->B4SOIwidtun;
return(OK);
case B4SOI_MOD_WVREC0S: /* v4.0 */
@ -2274,13 +2278,13 @@ IFvalue *value)
case B4SOI_MOD_WAELY:
value->rValue = model->B4SOIwaely;
return(OK);
case B4SOI_MOD_WAHLIS: /* v4.0 */
case B4SOI_MOD_WAHLIS: /* v4.0 */
value->rValue = model->B4SOIwahli;
return(OK);
case B4SOI_MOD_WAHLID: /* v4.0 */
case B4SOI_MOD_WAHLID: /* v4.0 */
value->rValue = model->B4SOIwahlid;
return(OK);
/* CV Model */
/* CV Model */
case B4SOI_MOD_WVSDFB:
value->rValue = model->B4SOIwvsdfb;
return(OK);
@ -2606,8 +2610,8 @@ IFvalue *value)
case B4SOI_MOD_PFBJTII:
value->rValue = model->B4SOIpfbjtii;
return(OK);
/*4.1 Iii model*/
case B4SOI_MOD_PEBJTII:
/*4.1 Iii model*/
case B4SOI_MOD_PEBJTII:
value->rValue = model->B4SOIpebjtii;
return(OK);
case B4SOI_MOD_PCBJTII:
@ -2622,7 +2626,7 @@ IFvalue *value)
case B4SOI_MOD_PMBJTII:
value->rValue = model->B4SOIpmbjtii;
return(OK);
case B4SOI_MOD_PBETA0:
value->rValue = model->B4SOIpbeta0;
return(OK);
@ -2674,8 +2678,8 @@ IFvalue *value)
case B4SOI_MOD_PFGIDL:
value->rValue = model->B4SOIpfgidl;
return(OK);
case B4SOI_MOD_PAGISL:
case B4SOI_MOD_PAGISL:
value->rValue = model->B4SOIpagisl;
return(OK);
case B4SOI_MOD_PBGISL:
@ -2695,42 +2699,42 @@ IFvalue *value)
return(OK);
case B4SOI_MOD_PFGISL:
value->rValue = model->B4SOIpfgisl;
return(OK);
case B4SOI_MOD_PNTUNS: /* v4.0 */
return(OK);
case B4SOI_MOD_PNTUNS: /* v4.0 */
value->rValue = model->B4SOIpntun;
return(OK);
case B4SOI_MOD_PNTUND: /* v4.0 */
case B4SOI_MOD_PNTUND: /* v4.0 */
value->rValue = model->B4SOIpntund;
return(OK);
case B4SOI_MOD_PNDIODES: /* v4.0 */
case B4SOI_MOD_PNDIODES: /* v4.0 */
value->rValue = model->B4SOIpndiode;
return(OK);
case B4SOI_MOD_PNDIODED: /* v4.0 */
case B4SOI_MOD_PNDIODED: /* v4.0 */
value->rValue = model->B4SOIpndioded;
return(OK);
case B4SOI_MOD_PNRECF0S: /* v4.0 */
case B4SOI_MOD_PNRECF0S: /* v4.0 */
value->rValue = model->B4SOIpnrecf0;
return(OK);
case B4SOI_MOD_PNRECF0D: /* v4.0 */
case B4SOI_MOD_PNRECF0D: /* v4.0 */
value->rValue = model->B4SOIpnrecf0d;
return(OK);
case B4SOI_MOD_PNRECR0S: /* v4.0 */
case B4SOI_MOD_PNRECR0S: /* v4.0 */
value->rValue = model->B4SOIpnrecr0;
return(OK);
case B4SOI_MOD_PNRECR0D: /* v4.0 */
case B4SOI_MOD_PNRECR0D: /* v4.0 */
value->rValue = model->B4SOIpnrecr0d;
return(OK);
case B4SOI_MOD_PISBJT:
value->rValue = model->B4SOIpisbjt;
return(OK);
case B4SOI_MOD_PIDBJT: /* v4.0 */
case B4SOI_MOD_PIDBJT: /* v4.0 */
value->rValue = model->B4SOIpidbjt;
return(OK);
case B4SOI_MOD_PISDIF:
value->rValue = model->B4SOIpisdif;
return(OK);
case B4SOI_MOD_PIDDIF: /* v4.0 */
case B4SOI_MOD_PIDDIF: /* v4.0 */
value->rValue = model->B4SOIpiddif;
return(OK);
case B4SOI_MOD_PISREC:
@ -2742,7 +2746,7 @@ IFvalue *value)
case B4SOI_MOD_PISTUN:
value->rValue = model->B4SOIpistun;
return(OK);
case B4SOI_MOD_PIDTUN: /* v4.0 */
case B4SOI_MOD_PIDTUN: /* v4.0 */
value->rValue = model->B4SOIpidtun;
return(OK);
case B4SOI_MOD_PVREC0S: /* v4.0 */
@ -2769,13 +2773,13 @@ IFvalue *value)
case B4SOI_MOD_PAELY:
value->rValue = model->B4SOIpaely;
return(OK);
case B4SOI_MOD_PAHLIS: /* v4.0 */
case B4SOI_MOD_PAHLIS: /* v4.0 */
value->rValue = model->B4SOIpahli;
return(OK);
case B4SOI_MOD_PAHLID: /* v4.0 */
case B4SOI_MOD_PAHLID: /* v4.0 */
value->rValue = model->B4SOIpahlid;
return(OK);
/* CV Model */
/* CV Model */
case B4SOI_MOD_PVSDFB:
value->rValue = model->B4SOIpvsdfb;
return(OK);

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -35,7 +36,7 @@ B4SOImodel **oldmod;
for (; *model ; model = &((*model)->B4SOInextModel))
{ if ((*model)->B4SOImodName == modname ||
(modfast && *model == modfast))
goto delgot;
goto delgot;
oldmod = model;
}
return(E_NOMOD);
@ -43,7 +44,9 @@ B4SOImodel **oldmod;
delgot:
*oldmod = (*model)->B4SOInextModel; /* cut deleted device out of list */
for (here = (*model)->B4SOIinstances; here; here = here->B4SOInextInstance)
{ if(prev) FREE(prev);
{
if (here->B4SOIowner != ARCHme) continue;
if(prev) FREE(prev);
prev = here;
}
if(prev) FREE(prev);

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -6,11 +7,13 @@
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimpar.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
* File: b4soimpar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
* Modified by Tanvir Morshed 12/16/2010
**********/
#include "ngspice/ngspice.h"
@ -30,8 +33,7 @@ GENmodel *inMod)
B4SOImodel *mod = (B4SOImodel*)inMod;
switch(param)
{
case B4SOI_MOD_MOBMOD :
case B4SOI_MOD_MOBMOD :
mod->B4SOImobMod = value->iValue;
mod->B4SOImobModGiven = TRUE;
break;
@ -61,19 +63,19 @@ GENmodel *inMod)
mod->B4SOIversion = value->rValue;
mod->B4SOIversionGiven = TRUE;
break;
case B4SOI_MOD_MTRLMOD :
case B4SOI_MOD_MTRLMOD :
mod->B4SOImtrlMod = value->iValue;
mod->B4SOImtrlModGiven = TRUE;
break;
case B4SOI_MOD_VGSTCVMOD :
case B4SOI_MOD_VGSTCVMOD :
mod->B4SOIvgstcvMod = value->iValue;
mod->B4SOIvgstcvModGiven = TRUE;
break;
case B4SOI_MOD_GIDLMOD :
break;
case B4SOI_MOD_GIDLMOD :
mod->B4SOIgidlMod = value->iValue;
mod->B4SOIgidlModGiven = TRUE;
break;
case B4SOI_MOD_IIIMOD :
case B4SOI_MOD_IIIMOD :
mod->B4SOIiiiMod = value->iValue;
mod->B4SOIiiiModGiven = TRUE;
break;
@ -110,48 +112,48 @@ GENmodel *inMod)
mod->B4SOIbdosGiven = TRUE;
break;
case B4SOI_MOD_EPSRGATE:
mod->B4SOIepsrgate = value->rValue;
mod->B4SOIepsrgateGiven = TRUE;
break;
mod->B4SOIepsrgate = value->rValue;
mod->B4SOIepsrgateGiven = TRUE;
break;
case B4SOI_MOD_PHIG:
mod->B4SOIphig = value->rValue;
mod->B4SOIphigGiven = TRUE;
break;
mod->B4SOIphig = value->rValue;
mod->B4SOIphigGiven = TRUE;
break;
case B4SOI_MOD_EASUB:
mod->B4SOIeasub = value->rValue;
mod->B4SOIeasubGiven = TRUE;
break;
break;
case B4SOI_MOD_TOXM :
mod->B4SOItoxm = value->rValue;
mod->B4SOItoxmGiven = TRUE;
break; /* v3.2 */
/*4.1 */
case B4SOI_MOD_EOT :
/*4.1 */
case B4SOI_MOD_EOT :
mod->B4SOIeot = value->rValue;
mod->B4SOIeotGiven = TRUE;
break;
case B4SOI_MOD_EPSROX :
case B4SOI_MOD_EPSROX :
mod->B4SOIepsrox = value->rValue;
mod->B4SOIepsroxGiven = TRUE;
break;
case B4SOI_MOD_EPSRSUB:
case B4SOI_MOD_EPSRSUB:
mod->B4SOIepsrsub = value->rValue;
mod->B4SOIepsrsubGiven = TRUE;
break;
case B4SOI_MOD_NI0SUB:
case B4SOI_MOD_NI0SUB:
mod->B4SOIni0sub = value->rValue;
mod->B4SOIni0subGiven = TRUE;
break;
case B4SOI_MOD_BG0SUB:
case B4SOI_MOD_BG0SUB:
mod->B4SOIbg0sub = value->rValue;
mod->B4SOIbg0subGiven = TRUE;
break;
case B4SOI_MOD_TBGASUB:
case B4SOI_MOD_TBGASUB:
mod->B4SOItbgasub = value->rValue;
mod->B4SOItbgasubGiven = TRUE;
break;
case B4SOI_MOD_TBGBSUB:
case B4SOI_MOD_TBGBSUB:
mod->B4SOItbgbsub = value->rValue;
mod->B4SOItbgbsubGiven = TRUE;
break;
@ -220,21 +222,21 @@ GENmodel *inMod)
case B4SOI_MOD_NPEAK:
mod->B4SOInpeak = value->rValue;
mod->B4SOInpeakGiven = TRUE;
/* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
/* if (mod->B4SOInpeak > 1.0e20)
mod->B4SOInpeak *= 1.0e-6; */
/* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
/* if (mod->B4SOInpeak > 1.0e20)
mod->B4SOInpeak *= 1.0e-6; */
break;
case B4SOI_MOD_NSD:
mod->B4SOInsd = value->rValue;
mod->B4SOInsdGiven = TRUE;
/* if (mod->B4SOInsd > 1.0e23)
mod->B4SOInsd *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
mod->B4SOInsd *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
break;
case B4SOI_MOD_NGATE:
mod->B4SOIngate = value->rValue;
mod->B4SOIngateGiven = TRUE;
/* if (mod->B4SOIngate > 1.0e23)
mod->B4SOIngate *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
/* if (mod->B4SOIngate > 1.0e23)
mod->B4SOIngate *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
break;
case B4SOI_MOD_GAMMA1:
mod->B4SOIgamma1 = value->rValue;
@ -288,7 +290,7 @@ GENmodel *inMod)
mod->B4SOIlpe0 = value->rValue;
mod->B4SOIlpe0Given = TRUE;
break;
case B4SOI_MOD_LPEB: /* v4.0 for Vth */
case B4SOI_MOD_LPEB: /* v4.0 for Vth */
mod->B4SOIlpeb = value->rValue;
mod->B4SOIlpebGiven = TRUE;
break;
@ -373,82 +375,82 @@ case B4SOI_MOD_UD:
mod->B4SOIud = value->rValue;
mod->B4SOIudGiven = TRUE;
break;
case B4SOI_MOD_LUD:
case B4SOI_MOD_LUD:
mod->B4SOIlud = value->rValue;
mod->B4SOIludGiven = TRUE;
break;
case B4SOI_MOD_WUD:
case B4SOI_MOD_WUD:
mod->B4SOIwud = value->rValue;
mod->B4SOIwudGiven = TRUE;
break;
case B4SOI_MOD_PUD:
case B4SOI_MOD_PUD:
mod->B4SOIpud = value->rValue;
mod->B4SOIpudGiven = TRUE;
break;
case B4SOI_MOD_UD1:
case B4SOI_MOD_UD1:
mod->B4SOIud1 = value->rValue;
mod->B4SOIud1Given = TRUE;
break;
case B4SOI_MOD_LUD1:
case B4SOI_MOD_LUD1:
mod->B4SOIlud1 = value->rValue;
mod->B4SOIlud1Given = TRUE;
break;
case B4SOI_MOD_WUD1:
case B4SOI_MOD_WUD1:
mod->B4SOIwud1 = value->rValue;
mod->B4SOIwud1Given = TRUE;
break;
case B4SOI_MOD_PUD1:
case B4SOI_MOD_PUD1:
mod->B4SOIpud1 = value->rValue;
mod->B4SOIpud1Given = TRUE;
break;
case B4SOI_MOD_EU:
case B4SOI_MOD_EU:
mod->B4SOIeu = value->rValue;
mod->B4SOIeuGiven = TRUE;
break;
case B4SOI_MOD_LEU:
case B4SOI_MOD_LEU:
mod->B4SOIleu = value->rValue;
mod->B4SOIleuGiven = TRUE;
break;
case B4SOI_MOD_WEU:
case B4SOI_MOD_WEU:
mod->B4SOIweu = value->rValue;
mod->B4SOIweuGiven = TRUE;
break;
case B4SOI_MOD_PEU:
case B4SOI_MOD_PEU:
mod->B4SOIpeu = value->rValue;
mod->B4SOIpeuGiven = TRUE;
break;
case B4SOI_MOD_UCS:
case B4SOI_MOD_UCS:
mod->B4SOIucs = value->rValue;
mod->B4SOIucsGiven = TRUE;
break;
case B4SOI_MOD_LUCS:
break;
case B4SOI_MOD_LUCS:
mod->B4SOIlucs = value->rValue;
mod->B4SOIlucsGiven = TRUE;
break;
case B4SOI_MOD_WUCS:
break;
case B4SOI_MOD_WUCS:
mod->B4SOIwucs = value->rValue;
mod->B4SOIwucsGiven = TRUE;
break;
case B4SOI_MOD_PUCS:
break;
case B4SOI_MOD_PUCS:
mod->B4SOIpucs = value->rValue;
mod->B4SOIpucsGiven = TRUE;
break; /* Bug fix # 31 Jul09 */
case B4SOI_MOD_UCSTE:
break; /* Bug fix # 31 Jul09 */
case B4SOI_MOD_UCSTE:
mod->B4SOIucste = value->rValue;
mod->B4SOIucsteGiven = TRUE;
break;
case B4SOI_MOD_LUCSTE:
break;
case B4SOI_MOD_LUCSTE:
mod->B4SOIlucste = value->rValue;
mod->B4SOIlucsteGiven = TRUE;
break;
case B4SOI_MOD_WUCSTE:
break;
case B4SOI_MOD_WUCSTE:
mod->B4SOIwucste = value->rValue;
mod->B4SOIwucsteGiven = TRUE;
break;
case B4SOI_MOD_PUCSTE:
break;
case B4SOI_MOD_PUCSTE:
mod->B4SOIpucste = value->rValue;
mod->B4SOIpucsteGiven = TRUE;
break;
break;
case B4SOI_MOD_VOFF:
mod->B4SOIvoff = value->rValue;
mod->B4SOIvoffGiven = TRUE;
@ -582,7 +584,7 @@ case B4SOI_MOD_UD:
mod->B4SOItsi = value->rValue;
mod->B4SOItsiGiven = TRUE;
break;
case B4SOI_MOD_ETSI :
case B4SOI_MOD_ETSI :
mod->B4SOIetsi = value->rValue;
mod->B4SOIetsiGiven = TRUE;
break;
@ -606,6 +608,10 @@ case B4SOI_MOD_UD:
mod->B4SOIcth0 = value->rValue;
mod->B4SOIcth0Given = TRUE;
break;
case B4SOI_MOD_CFRCOEFF : /* v4.4 */
mod->B4SOIcfrcoeff = value->rValue;
mod->B4SOIcfrcoeffGiven = TRUE;
break;
case B4SOI_MOD_EGIDL :
mod->B4SOIegidl = value->rValue;
mod->B4SOIegidlGiven = TRUE;
@ -634,8 +640,8 @@ case B4SOI_MOD_UD:
mod->B4SOIfgidl = value->rValue;
mod->B4SOIfgidlGiven = TRUE;
break;
case B4SOI_MOD_EGISL :
case B4SOI_MOD_EGISL :
mod->B4SOIegisl = value->rValue;
mod->B4SOIegislGiven = TRUE;
break;
@ -666,7 +672,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_FDMOD :
/* mod->B4SOIfdMod = value->rValue; v4.2 */
mod->B4SOIfdMod = value->iValue;
mod->B4SOIfdModGiven = TRUE;
mod->B4SOIfdModGiven = TRUE;
break;
case B4SOI_MOD_VSCE :
mod->B4SOIvsce = value->rValue;
@ -675,7 +681,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_CDSBS :
mod->B4SOIcdsbs = value->rValue;
mod->B4SOIcdsbsGiven = TRUE;
break;
break;
case B4SOI_MOD_MINVCV:
mod->B4SOIminvcv = value->rValue;
mod->B4SOIminvcvGiven = TRUE;
@ -708,7 +714,7 @@ case B4SOI_MOD_UD:
mod->B4SOIpvoffcv = value->rValue;
mod->B4SOIpvoffcvGiven = TRUE;
break;
case B4SOI_MOD_NDIODES : /* v4.0 */
mod->B4SOIndiode = value->rValue;
mod->B4SOIndiodeGiven = TRUE;
@ -794,27 +800,27 @@ case B4SOI_MOD_UD:
mod->B4SOIsheetResistance = value->rValue;
mod->B4SOIsheetResistanceGiven = TRUE;
break;
case B4SOI_MOD_PBSWGS : /* v4.0 */
case B4SOI_MOD_PBSWGS : /* v4.0 */
mod->B4SOIGatesidewallJctSPotential = value->rValue;
mod->B4SOIGatesidewallJctSPotentialGiven = TRUE;
break;
case B4SOI_MOD_PBSWGD : /* v4.0 */
case B4SOI_MOD_PBSWGD : /* v4.0 */
mod->B4SOIGatesidewallJctDPotential = value->rValue;
mod->B4SOIGatesidewallJctDPotentialGiven = TRUE;
break;
case B4SOI_MOD_MJSWGS : /* v4.0 */
case B4SOI_MOD_MJSWGS : /* v4.0 */
mod->B4SOIbodyJctGateSideSGradingCoeff = value->rValue;
mod->B4SOIbodyJctGateSideSGradingCoeffGiven = TRUE;
break;
case B4SOI_MOD_MJSWGD : /* v4.0 */
case B4SOI_MOD_MJSWGD : /* v4.0 */
mod->B4SOIbodyJctGateSideDGradingCoeff = value->rValue;
mod->B4SOIbodyJctGateSideDGradingCoeffGiven = TRUE;
break;
case B4SOI_MOD_CJSWGS : /* v4.0 */
case B4SOI_MOD_CJSWGS : /* v4.0 */
mod->B4SOIunitLengthGateSidewallJctCapS = value->rValue;
mod->B4SOIunitLengthGateSidewallJctCapSGiven = TRUE;
break;
case B4SOI_MOD_CJSWGD : /* v4.0 */
case B4SOI_MOD_CJSWGD : /* v4.0 */
mod->B4SOIunitLengthGateSidewallJctCapD = value->rValue;
mod->B4SOIunitLengthGateSidewallJctCapDGiven = TRUE;
break;
@ -1139,7 +1145,7 @@ case B4SOI_MOD_UD:
mod->B4SOIxrcrg2 = value->rValue;
mod->B4SOIxrcrg2Given = TRUE;
break;
case B4SOI_MOD_RSHG :
case B4SOI_MOD_RSHG :
mod->B4SOIrshg = value->rValue;
mod->B4SOIrshgGiven = TRUE;
break;
@ -1173,8 +1179,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_RBDB :
mod->B4SOIrbdb = value->rValue;
mod->B4SOIrbdbGiven = TRUE;
break; /* Bug fix # 31 Jul 09 */
case B4SOI_MOD_RBSB :
break; /* Bug fix # 31 Jul 09 */
case B4SOI_MOD_RBSB :
mod->B4SOIrbsb = value->rValue;
mod->B4SOIrbsbGiven = TRUE;
break;
@ -1333,7 +1339,7 @@ case B4SOI_MOD_UD:
/* v4.0 */
/* v4.0 stress effect */
/* v4.0 stress effect */
case B4SOI_MOD_SAREF :
mod->B4SOIsaref = value->rValue;
mod->B4SOIsarefGiven = TRUE;
@ -1409,8 +1415,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_LODK2 :
mod->B4SOIlodk2 = value->rValue;
mod->B4SOIlodk2Given = TRUE;
break; /* Bug fix # 31 Jul 09*/
case B4SOI_MOD_STETA0 :
break; /* Bug fix # 31 Jul 09*/
case B4SOI_MOD_STETA0 :
mod->B4SOIsteta0 = value->rValue;
mod->B4SOIsteta0Given = TRUE;
break;
@ -1419,17 +1425,17 @@ case B4SOI_MOD_UD:
mod->B4SOIlodeta0Given = TRUE;
break;
/* v4.0 stress effect end */
/* v4.0 stress effect end */
/* v3.2 */
case B4SOI_MOD_FNOIMOD :
mod->B4SOIfnoiMod = value->iValue;
mod->B4SOIfnoiModGiven = TRUE;
break;
case B4SOI_MOD_TNOIMOD :
mod->B4SOItnoiMod = value->iValue;
mod->B4SOItnoiModGiven = TRUE;
break;
/* v3.2 */
case B4SOI_MOD_FNOIMOD :
mod->B4SOIfnoiMod = value->iValue;
mod->B4SOIfnoiModGiven = TRUE;
break;
case B4SOI_MOD_TNOIMOD :
mod->B4SOItnoiMod = value->iValue;
mod->B4SOItnoiModGiven = TRUE;
break;
case B4SOI_MOD_TNOIA :
mod->B4SOItnoia = value->rValue;
mod->B4SOItnoiaGiven = TRUE;
@ -1451,7 +1457,7 @@ case B4SOI_MOD_UD:
mod->B4SOIntnoiGiven = TRUE;
break;
/* v3.2 end */
/* v3.2 end */
/* v2.0 release */
case B4SOI_MOD_K1W1 :
@ -1490,7 +1496,7 @@ case B4SOI_MOD_UD:
mod->B4SOItii = value->rValue;
mod->B4SOItiiGiven = TRUE;
break;
case B4SOI_MOD_TVBCI :
case B4SOI_MOD_TVBCI :
mod->B4SOItvbci = value->rValue;
mod->B4SOItvbciGiven = TRUE;
break;
@ -1518,8 +1524,8 @@ case B4SOI_MOD_UD:
mod->B4SOIfbjtii = value->rValue;
mod->B4SOIfbjtiiGiven = TRUE;
break;
/*4.1 Iii model*/
case B4SOI_MOD_EBJTII :
/*4.1 Iii model*/
case B4SOI_MOD_EBJTII :
mod->B4SOIebjtii = value->rValue;
mod->B4SOIebjtiiGiven = TRUE;
break;
@ -1543,27 +1549,27 @@ case B4SOI_MOD_UD:
mod->B4SOIesatii = value->rValue;
mod->B4SOIesatiiGiven = TRUE;
break;
case B4SOI_MOD_NTUNS : /* v4.0 */
case B4SOI_MOD_NTUNS : /* v4.0 */
mod->B4SOIntun = value->rValue;
mod->B4SOIntunGiven = TRUE;
break;
case B4SOI_MOD_NTUND : /* v4.0 */
case B4SOI_MOD_NTUND : /* v4.0 */
mod->B4SOIntund = value->rValue;
mod->B4SOIntundGiven = TRUE;
break;
case B4SOI_MOD_NRECF0S : /* v4.0 */
case B4SOI_MOD_NRECF0S : /* v4.0 */
mod->B4SOInrecf0 = value->rValue;
mod->B4SOInrecf0Given = TRUE;
break;
case B4SOI_MOD_NRECF0D : /* v4.0 */
case B4SOI_MOD_NRECF0D : /* v4.0 */
mod->B4SOInrecf0d = value->rValue;
mod->B4SOInrecf0dGiven = TRUE;
break;
case B4SOI_MOD_NRECR0S : /* v4.0 */
case B4SOI_MOD_NRECR0S : /* v4.0 */
mod->B4SOInrecr0 = value->rValue;
mod->B4SOInrecr0Given = TRUE;
break;
case B4SOI_MOD_NRECR0D : /* v4.0 */
case B4SOI_MOD_NRECR0D : /* v4.0 */
mod->B4SOInrecr0d = value->rValue;
mod->B4SOInrecr0dGiven = TRUE;
break;
@ -1571,7 +1577,7 @@ case B4SOI_MOD_UD:
mod->B4SOIisbjt = value->rValue;
mod->B4SOIisbjtGiven = TRUE;
break;
case B4SOI_MOD_IDBJT : /* v4.0 */
case B4SOI_MOD_IDBJT : /* v4.0 */
mod->B4SOIidbjt = value->rValue;
mod->B4SOIidbjtGiven = TRUE;
break;
@ -1579,7 +1585,7 @@ case B4SOI_MOD_UD:
mod->B4SOIisdif = value->rValue;
mod->B4SOIisdifGiven = TRUE;
break;
case B4SOI_MOD_IDDIF : /* v4.0 */
case B4SOI_MOD_IDDIF : /* v4.0 */
mod->B4SOIiddif = value->rValue;
mod->B4SOIiddifGiven = TRUE;
break;
@ -1587,7 +1593,7 @@ case B4SOI_MOD_UD:
mod->B4SOIisrec = value->rValue;
mod->B4SOIisrecGiven = TRUE;
break;
case B4SOI_MOD_IDREC : /* v4.0 */
case B4SOI_MOD_IDREC : /* v4.0 */
mod->B4SOIidrec = value->rValue;
mod->B4SOIidrecGiven = TRUE;
break;
@ -1595,7 +1601,7 @@ case B4SOI_MOD_UD:
mod->B4SOIistun = value->rValue;
mod->B4SOIistunGiven = TRUE;
break;
case B4SOI_MOD_IDTUN : /* v4.0 */
case B4SOI_MOD_IDTUN : /* v4.0 */
mod->B4SOIidtun = value->rValue;
mod->B4SOIidtunGiven = TRUE;
break;
@ -1603,19 +1609,19 @@ case B4SOI_MOD_UD:
mod->B4SOIln = value->rValue;
mod->B4SOIlnGiven = TRUE;
break;
case B4SOI_MOD_VREC0S : /* v4.0 */
case B4SOI_MOD_VREC0S : /* v4.0 */
mod->B4SOIvrec0 = value->rValue;
mod->B4SOIvrec0Given = TRUE;
break;
case B4SOI_MOD_VREC0D : /* v4.0 */
case B4SOI_MOD_VREC0D : /* v4.0 */
mod->B4SOIvrec0d = value->rValue;
mod->B4SOIvrec0dGiven = TRUE;
break;
case B4SOI_MOD_VTUN0S : /* v4.0 */
case B4SOI_MOD_VTUN0S : /* v4.0 */
mod->B4SOIvtun0 = value->rValue;
mod->B4SOIvtun0Given = TRUE;
break;
case B4SOI_MOD_VTUN0D : /* v4.0 */
case B4SOI_MOD_VTUN0D : /* v4.0 */
mod->B4SOIvtun0d = value->rValue;
mod->B4SOIvtun0dGiven = TRUE;
break;
@ -1639,11 +1645,11 @@ case B4SOI_MOD_UD:
mod->B4SOIaely = value->rValue;
mod->B4SOIaelyGiven = TRUE;
break;
case B4SOI_MOD_AHLIS : /* v4.0 */
case B4SOI_MOD_AHLIS : /* v4.0 */
mod->B4SOIahli = value->rValue;
mod->B4SOIahliGiven = TRUE;
break;
case B4SOI_MOD_AHLID : /* v4.0 */
case B4SOI_MOD_AHLID : /* v4.0 */
mod->B4SOIahlid = value->rValue;
mod->B4SOIahlidGiven = TRUE;
break;
@ -1933,7 +1939,7 @@ case B4SOI_MOD_UD:
mod->B4SOIllpe0 = value->rValue;
mod->B4SOIllpe0Given = TRUE;
break;
case B4SOI_MOD_LLPEB: /* v4.0 for Vth */
case B4SOI_MOD_LLPEB: /* v4.0 for Vth */
mod->B4SOIllpeb = value->rValue;
mod->B4SOIllpebGiven = TRUE;
break;
@ -2117,8 +2123,8 @@ case B4SOI_MOD_UD:
mod->B4SOIlfbjtii = value->rValue;
mod->B4SOIlfbjtiiGiven = TRUE;
break;
/*4.1 Iii model*/
case B4SOI_MOD_LEBJTII :
/*4.1 Iii model*/
case B4SOI_MOD_LEBJTII :
mod->B4SOIlebjtii = value->rValue;
mod->B4SOIlebjtiiGiven = TRUE;
break;
@ -2138,7 +2144,7 @@ case B4SOI_MOD_UD:
mod->B4SOIlmbjtii = value->rValue;
mod->B4SOIlmbjtiiGiven = TRUE;
break;
case B4SOI_MOD_LBETA0 :
mod->B4SOIlbeta0 = value->rValue;
mod->B4SOIlbeta0Given = TRUE;
@ -2207,8 +2213,8 @@ case B4SOI_MOD_UD:
mod->B4SOIlfgidl = value->rValue;
mod->B4SOIlfgidlGiven = TRUE;
break;
case B4SOI_MOD_LAGISL :
case B4SOI_MOD_LAGISL :
mod->B4SOIlagisl = value->rValue;
mod->B4SOIlagislGiven = TRUE;
break;
@ -2236,35 +2242,35 @@ case B4SOI_MOD_UD:
mod->B4SOIlfgisl = value->rValue;
mod->B4SOIlfgislGiven = TRUE;
break;
case B4SOI_MOD_LNTUNS : /* v4.0 */
case B4SOI_MOD_LNTUNS : /* v4.0 */
mod->B4SOIlntun = value->rValue;
mod->B4SOIlntunGiven = TRUE;
break;
case B4SOI_MOD_LNTUND : /* v4.0 */
case B4SOI_MOD_LNTUND : /* v4.0 */
mod->B4SOIlntund = value->rValue;
mod->B4SOIlntundGiven = TRUE;
break;
case B4SOI_MOD_LNDIODES : /* v4.0 */
case B4SOI_MOD_LNDIODES : /* v4.0 */
mod->B4SOIlndiode = value->rValue;
mod->B4SOIlndiodeGiven = TRUE;
break;
case B4SOI_MOD_LNDIODED : /* v4.0 */
case B4SOI_MOD_LNDIODED : /* v4.0 */
mod->B4SOIlndioded = value->rValue;
mod->B4SOIlndiodedGiven = TRUE;
break;
case B4SOI_MOD_LNRECF0S : /* v4.0 */
case B4SOI_MOD_LNRECF0S : /* v4.0 */
mod->B4SOIlnrecf0 = value->rValue;
mod->B4SOIlnrecf0Given = TRUE;
break;
case B4SOI_MOD_LNRECF0D : /* v4.0 */
case B4SOI_MOD_LNRECF0D : /* v4.0 */
mod->B4SOIlnrecf0d = value->rValue;
mod->B4SOIlnrecf0dGiven = TRUE;
break;
case B4SOI_MOD_LNRECR0S : /* v4.0 */
case B4SOI_MOD_LNRECR0S : /* v4.0 */
mod->B4SOIlnrecr0 = value->rValue;
mod->B4SOIlnrecr0Given = TRUE;
break;
case B4SOI_MOD_LNRECR0D : /* v4.0 */
case B4SOI_MOD_LNRECR0D : /* v4.0 */
mod->B4SOIlnrecr0d = value->rValue;
mod->B4SOIlnrecr0dGiven = TRUE;
break;
@ -2272,7 +2278,7 @@ case B4SOI_MOD_UD:
mod->B4SOIlisbjt = value->rValue;
mod->B4SOIlisbjtGiven = TRUE;
break;
case B4SOI_MOD_LIDBJT : /* v4.0 */
case B4SOI_MOD_LIDBJT : /* v4.0 */
mod->B4SOIlidbjt = value->rValue;
mod->B4SOIlidbjtGiven = TRUE;
break;
@ -2280,7 +2286,7 @@ case B4SOI_MOD_UD:
mod->B4SOIlisdif = value->rValue;
mod->B4SOIlisdifGiven = TRUE;
break;
case B4SOI_MOD_LIDDIF : /* v4.0 */
case B4SOI_MOD_LIDDIF : /* v4.0 */
mod->B4SOIliddif = value->rValue;
mod->B4SOIliddifGiven = TRUE;
break;
@ -2288,7 +2294,7 @@ case B4SOI_MOD_UD:
mod->B4SOIlisrec = value->rValue;
mod->B4SOIlisrecGiven = TRUE;
break;
case B4SOI_MOD_LIDREC : /* v4.0 */
case B4SOI_MOD_LIDREC : /* v4.0 */
mod->B4SOIlidrec = value->rValue;
mod->B4SOIlidrecGiven = TRUE;
break;
@ -2296,7 +2302,7 @@ case B4SOI_MOD_UD:
mod->B4SOIlistun = value->rValue;
mod->B4SOIlistunGiven = TRUE;
break;
case B4SOI_MOD_LIDTUN : /* v4.0 */
case B4SOI_MOD_LIDTUN : /* v4.0 */
mod->B4SOIlidtun = value->rValue;
mod->B4SOIlidtunGiven = TRUE;
break;
@ -2332,11 +2338,11 @@ case B4SOI_MOD_UD:
mod->B4SOIlaely = value->rValue;
mod->B4SOIlaelyGiven = TRUE;
break;
case B4SOI_MOD_LAHLIS : /* v4.0 */
case B4SOI_MOD_LAHLIS : /* v4.0 */
mod->B4SOIlahli = value->rValue;
mod->B4SOIlahliGiven = TRUE;
break;
case B4SOI_MOD_LAHLID : /* v4.0 */
case B4SOI_MOD_LAHLID : /* v4.0 */
mod->B4SOIlahlid = value->rValue;
mod->B4SOIlahlidGiven = TRUE;
break;
@ -2352,7 +2358,7 @@ case B4SOI_MOD_UD:
break;
/* v3.1 for RF end */
/* CV Model */
/* CV Model */
case B4SOI_MOD_LVSDFB :
mod->B4SOIlvsdfb = value->rValue;
mod->B4SOIlvsdfbGiven = TRUE;
@ -2599,7 +2605,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwlpe0 = value->rValue;
mod->B4SOIwlpe0Given = TRUE;
break;
case B4SOI_MOD_WLPEB: /* v4.0 for Vth */
case B4SOI_MOD_WLPEB: /* v4.0 for Vth */
mod->B4SOIwlpeb = value->rValue;
mod->B4SOIwlpebGiven = TRUE;
break;
@ -2783,8 +2789,8 @@ case B4SOI_MOD_UD:
mod->B4SOIwfbjtii = value->rValue;
mod->B4SOIwfbjtiiGiven = TRUE;
break;
/*4.1 Iii model*/
case B4SOI_MOD_WEBJTII :
/*4.1 Iii model*/
case B4SOI_MOD_WEBJTII :
mod->B4SOIwebjtii = value->rValue;
mod->B4SOIwebjtiiGiven = TRUE;
break;
@ -2804,7 +2810,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwmbjtii = value->rValue;
mod->B4SOIwmbjtiiGiven = TRUE;
break;
case B4SOI_MOD_WBETA0 :
mod->B4SOIwbeta0 = value->rValue;
mod->B4SOIwbeta0Given = TRUE;
@ -2873,44 +2879,44 @@ case B4SOI_MOD_UD:
mod->B4SOIwfgidl = value->rValue;
mod->B4SOIwfgidlGiven = TRUE;
break;
case B4SOI_MOD_WAGISL :
case B4SOI_MOD_WAGISL :
mod->B4SOIwagisl = value->rValue;
mod->B4SOIwagislGiven = TRUE;
break;
case B4SOI_MOD_WBGISL :
mod->B4SOIwbgisl = value->rValue;
mod->B4SOIwbgislGiven = TRUE;
break;
case B4SOI_MOD_WCGISL :
mod->B4SOIwcgisl = value->rValue;
mod->B4SOIwcgislGiven = TRUE;
break;
case B4SOI_MOD_WEGISL :
mod->B4SOIwegisl = value->rValue;
mod->B4SOIwegislGiven = TRUE;
break;
case B4SOI_MOD_WRGISL :
mod->B4SOIwrgisl = value->rValue;
mod->B4SOIwrgislGiven = TRUE;
break;
case B4SOI_MOD_WKGISL :
mod->B4SOIwkgisl = value->rValue;
mod->B4SOIwkgislGiven = TRUE;
break;
case B4SOI_MOD_WFGISL :
mod->B4SOIwfgisl = value->rValue;
mod->B4SOIwfgislGiven = TRUE;
break;
case B4SOI_MOD_WNTUNS : /* v4.0 */
mod->B4SOIwntun = value->rValue;
mod->B4SOIwntunGiven = TRUE;
@ -2927,19 +2933,19 @@ case B4SOI_MOD_UD:
mod->B4SOIwndioded = value->rValue;
mod->B4SOIwndiodedGiven = TRUE;
break;
case B4SOI_MOD_WNRECF0S : /* v4.0 */
case B4SOI_MOD_WNRECF0S : /* v4.0 */
mod->B4SOIwnrecf0 = value->rValue;
mod->B4SOIwnrecf0Given = TRUE;
break;
case B4SOI_MOD_WNRECF0D : /* v4.0 */
case B4SOI_MOD_WNRECF0D : /* v4.0 */
mod->B4SOIwnrecf0d = value->rValue;
mod->B4SOIwnrecf0dGiven = TRUE;
break;
case B4SOI_MOD_WNRECR0S : /* v4.0 */
case B4SOI_MOD_WNRECR0S : /* v4.0 */
mod->B4SOIwnrecr0 = value->rValue;
mod->B4SOIwnrecr0Given = TRUE;
break;
case B4SOI_MOD_WNRECR0D : /* v4.0 */
case B4SOI_MOD_WNRECR0D : /* v4.0 */
mod->B4SOIwnrecr0d = value->rValue;
mod->B4SOIwnrecr0dGiven = TRUE;
break;
@ -2947,7 +2953,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwisbjt = value->rValue;
mod->B4SOIwisbjtGiven = TRUE;
break;
case B4SOI_MOD_WIDBJT : /* v4.0 */
case B4SOI_MOD_WIDBJT : /* v4.0 */
mod->B4SOIwidbjt = value->rValue;
mod->B4SOIwidbjtGiven = TRUE;
break;
@ -2955,7 +2961,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwisdif = value->rValue;
mod->B4SOIwisdifGiven = TRUE;
break;
case B4SOI_MOD_WIDDIF : /* v4.0 */
case B4SOI_MOD_WIDDIF : /* v4.0 */
mod->B4SOIwiddif = value->rValue;
mod->B4SOIwiddifGiven = TRUE;
break;
@ -2963,7 +2969,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwisrec = value->rValue;
mod->B4SOIwisrecGiven = TRUE;
break;
case B4SOI_MOD_WIDREC : /* v4.0 */
case B4SOI_MOD_WIDREC : /* v4.0 */
mod->B4SOIwidrec = value->rValue;
mod->B4SOIwidrecGiven = TRUE;
break;
@ -2971,7 +2977,7 @@ case B4SOI_MOD_UD:
mod->B4SOIwistun = value->rValue;
mod->B4SOIwistunGiven = TRUE;
break;
case B4SOI_MOD_WIDTUN : /* v4.0 */
case B4SOI_MOD_WIDTUN : /* v4.0 */
mod->B4SOIwidtun = value->rValue;
mod->B4SOIwidtunGiven = TRUE;
break;
@ -3007,11 +3013,11 @@ case B4SOI_MOD_UD:
mod->B4SOIwaely = value->rValue;
mod->B4SOIwaelyGiven = TRUE;
break;
case B4SOI_MOD_WAHLIS : /* v4.0 */
case B4SOI_MOD_WAHLIS : /* v4.0 */
mod->B4SOIwahli = value->rValue;
mod->B4SOIwahliGiven = TRUE;
break;
case B4SOI_MOD_WAHLID : /* v4.0 */
case B4SOI_MOD_WAHLID : /* v4.0 */
mod->B4SOIwahlid = value->rValue;
mod->B4SOIwahlidGiven = TRUE;
break;
@ -3027,7 +3033,7 @@ case B4SOI_MOD_UD:
break;
/* v3.1 for RF end */
/* CV Model */
/* CV Model */
case B4SOI_MOD_WVSDFB :
mod->B4SOIwvsdfb = value->rValue;
mod->B4SOIwvsdfbGiven = TRUE;
@ -3274,7 +3280,7 @@ case B4SOI_MOD_UD:
mod->B4SOIplpe0 = value->rValue;
mod->B4SOIplpe0Given = TRUE;
break;
case B4SOI_MOD_PLPEB: /* v4.0 for Vth */
case B4SOI_MOD_PLPEB: /* v4.0 for Vth */
mod->B4SOIplpeb = value->rValue;
mod->B4SOIplpebGiven = TRUE;
break;
@ -3458,8 +3464,8 @@ case B4SOI_MOD_UD:
mod->B4SOIpfbjtii = value->rValue;
mod->B4SOIpfbjtiiGiven = TRUE;
break;
/*4.1 Iii model*/
case B4SOI_MOD_PEBJTII :
/*4.1 Iii model*/
case B4SOI_MOD_PEBJTII :
mod->B4SOIpebjtii = value->rValue;
mod->B4SOIpebjtiiGiven = TRUE;
break;
@ -3547,8 +3553,8 @@ case B4SOI_MOD_UD:
mod->B4SOIpfgidl = value->rValue;
mod->B4SOIpfgidlGiven = TRUE;
break;
case B4SOI_MOD_PAGISL :
case B4SOI_MOD_PAGISL :
mod->B4SOIpagisl = value->rValue;
mod->B4SOIpagislGiven = TRUE;
break;
@ -3575,36 +3581,36 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_PFGISL :
mod->B4SOIpfgisl = value->rValue;
mod->B4SOIpfgislGiven = TRUE;
break;
case B4SOI_MOD_PNTUNS : /* v4.0 */
break;
case B4SOI_MOD_PNTUNS : /* v4.0 */
mod->B4SOIpntun = value->rValue;
mod->B4SOIpntunGiven = TRUE;
break;
case B4SOI_MOD_PNTUND : /* v4.0 */
case B4SOI_MOD_PNTUND : /* v4.0 */
mod->B4SOIpntund = value->rValue;
mod->B4SOIpntundGiven = TRUE;
break;
case B4SOI_MOD_PNDIODES : /* v4.0 */
case B4SOI_MOD_PNDIODES : /* v4.0 */
mod->B4SOIpndiode = value->rValue;
mod->B4SOIpndiodeGiven = TRUE;
break;
case B4SOI_MOD_PNDIODED : /* v4.0 */
case B4SOI_MOD_PNDIODED : /* v4.0 */
mod->B4SOIpndioded = value->rValue;
mod->B4SOIpndiodedGiven = TRUE;
break;
case B4SOI_MOD_PNRECF0S : /* v4.0 */
case B4SOI_MOD_PNRECF0S : /* v4.0 */
mod->B4SOIpnrecf0 = value->rValue;
mod->B4SOIpnrecf0Given = TRUE;
break;
case B4SOI_MOD_PNRECF0D : /* v4.0 */
case B4SOI_MOD_PNRECF0D : /* v4.0 */
mod->B4SOIpnrecf0d = value->rValue;
mod->B4SOIpnrecf0dGiven = TRUE;
break;
case B4SOI_MOD_PNRECR0S : /* v4.0 */
case B4SOI_MOD_PNRECR0S : /* v4.0 */
mod->B4SOIpnrecr0 = value->rValue;
mod->B4SOIpnrecr0Given = TRUE;
break;
case B4SOI_MOD_PNRECR0D : /* v4.0 */
case B4SOI_MOD_PNRECR0D : /* v4.0 */
mod->B4SOIpnrecr0d = value->rValue;
mod->B4SOIpnrecr0dGiven = TRUE;
break;
@ -3612,7 +3618,7 @@ case B4SOI_MOD_UD:
mod->B4SOIpisbjt = value->rValue;
mod->B4SOIpisbjtGiven = TRUE;
break;
case B4SOI_MOD_PIDBJT : /* v4.0 */
case B4SOI_MOD_PIDBJT : /* v4.0 */
mod->B4SOIpidbjt = value->rValue;
mod->B4SOIpidbjtGiven = TRUE;
break;
@ -3620,7 +3626,7 @@ case B4SOI_MOD_UD:
mod->B4SOIpisdif = value->rValue;
mod->B4SOIpisdifGiven = TRUE;
break;
case B4SOI_MOD_PIDDIF : /* v4.0 */
case B4SOI_MOD_PIDDIF : /* v4.0 */
mod->B4SOIpiddif = value->rValue;
mod->B4SOIpiddifGiven = TRUE;
break;
@ -3628,7 +3634,7 @@ case B4SOI_MOD_UD:
mod->B4SOIpisrec = value->rValue;
mod->B4SOIpisrecGiven = TRUE;
break;
case B4SOI_MOD_PIDREC : /* v4.0 */
case B4SOI_MOD_PIDREC : /* v4.0 */
mod->B4SOIpidrec = value->rValue;
mod->B4SOIpidrecGiven = TRUE;
break;
@ -3636,7 +3642,7 @@ case B4SOI_MOD_UD:
mod->B4SOIpistun = value->rValue;
mod->B4SOIpistunGiven = TRUE;
break;
case B4SOI_MOD_PIDTUN : /* v4.0 */
case B4SOI_MOD_PIDTUN : /* v4.0 */
mod->B4SOIpidtun = value->rValue;
mod->B4SOIpidtunGiven = TRUE;
break;
@ -3672,11 +3678,11 @@ case B4SOI_MOD_UD:
mod->B4SOIpaely = value->rValue;
mod->B4SOIpaelyGiven = TRUE;
break;
case B4SOI_MOD_PAHLIS : /* v4.0 */
case B4SOI_MOD_PAHLIS : /* v4.0 */
mod->B4SOIpahli = value->rValue;
mod->B4SOIpahliGiven = TRUE;
break;
case B4SOI_MOD_PAHLID : /* v4.0 */
case B4SOI_MOD_PAHLID : /* v4.0 */
mod->B4SOIpahlid = value->rValue;
mod->B4SOIpahlidGiven = TRUE;
break;
@ -3692,7 +3698,7 @@ case B4SOI_MOD_UD:
break;
/* v3.1 for RF end */
/* CV Model */
/* CV Model */
case B4SOI_MOD_PVSDFB :
mod->B4SOIpvsdfb = value->rValue;
mod->B4SOIpvsdfbGiven = TRUE;
@ -3719,7 +3725,7 @@ case B4SOI_MOD_UD:
break; /* v3.2 */
/* Added for binning - END */
/* 4.0 backward compatibility */
/* 4.0 backward compatibility */
case B4SOI_MOD_NLX:
mod->B4SOInlx = value->rValue;
mod->B4SOInlxGiven = TRUE;

View File

@ -1,4 +1,5 @@
/** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -45,14 +46,12 @@
Flicker noise = Unified model
*/
static double
B4SOIEval1ovFNoise(
double vds,
B4SOImodel *model,
B4SOIinstance *here,
double freq,
double temp)
double freq, double temp)
{
struct b4soiSizeDependParam *pParam;
double cd, esat, DelClm, EffFreq, N0, Nl;
@ -104,8 +103,6 @@ CKTcircuit *ckt,
Ndata *data,
double *OnDens)
{
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob;
register B4SOImodel *model = (B4SOImodel *)inModel;
register B4SOIinstance *here;
struct b4soiSizeDependParam *pParam;
@ -127,103 +124,110 @@ double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */
int i;
double m;
/* define the names of the noise sources */
static char *B4SOInNames[B4SOINSRCS] =
{ /* Note that we have to keep the order */
".rd", /* noise due to rd */
/* consistent with the index definitions */
".rs", /* noise due to rs */
/* in B4SOIdefs.h */
".rg", /* noise due to rgeltd, v3.2 */
".id", /* noise due to id */
".1overf", /* flicker (1/f) noise */
".fb_ibs", /* noise due to floating body by ibs */
".fb_ibd", /* noise due to floating body by ibd */
".igs", /* shot noise due to IGS, v3.2 */
".igd", /* shot noise due to IGD, v3.2 */
".igb", /* shot noise due to IGB, v3.2 */
".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 */
"" /* total transistor noise */
};
for (; model != NULL; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here != NULL;
here = here->B4SOInextInstance)
{ 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 */
{ for (here = model->B4SOIinstances; here != NULL;
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme) continue;
if (job->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 = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
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 = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
m = here->B4SOIm;
(void) sprintf(name, "inoise_total.%s%s",
here->B4SOIname,
B4SOInNames[i]);
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 = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
switch (mode)
{ case N_DENS:
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
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 = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
(void) sprintf(name, "inoise_total.%s%s",
here->B4SOIname,
B4SOInNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid)) (ckt,
&(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
switch (mode)
{ case N_DENS:
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
tempRatioSH = here->B4SOITempSH / ckt->CKTtemp;
else
tempRatioSH = 1.0;
/*v4.2 implementing limit on Vdseffovcd*/
if (here->B4SOIcd != 0)
{
Vdseffovcd = here->B4SOIVdseff / here->B4SOIcd;
if (Vdseffovcd >= 1.0e9) Vdseffovcd = 1.0e9 ;
}
else
Vdseffovcd = 1.0e9;
/* if (model->B4SOItnoiMod == 0) */ /* v4.0 */ /* v4.2 bugfix: consider tnoiMod = 2*/
if (model->B4SOItnoiMod != 1)
{ if (model->B4SOIrdsMod == 0)
/*v4.2 implementing limit on Vdseffovcd*/
if (here->B4SOIcd != 0)
{
Vdseffovcd = here->B4SOIVdseff / here->B4SOIcd;
if (Vdseffovcd >= 1.0e9) Vdseffovcd = 1.0e9 ;
}
else
Vdseffovcd = 1.0e9;
/* if (model->B4SOItnoiMod == 0) *//* v4.0 */ /* v4.2 bugfix: consider tnoiMod = 2*/
if (model->B4SOItnoiMod != 1)
{ if (model->B4SOIrdsMod == 0)
{ gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance;
}
@ -234,24 +238,24 @@ int i;
}
else
{
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat
/ pParam->B4SOIleff;
T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 +
T5 * model->B4SOItnoia *
pParam->B4SOIleff);
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat
/ pParam->B4SOIleff;
T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 +
T5 * model->B4SOItnoia *
pParam->B4SOIleff);
npart_theta = model->B4SOIrnoib * (1.0 +
T5 * model->B4SOItnoib *
pParam->B4SOIleff);
T5 * model->B4SOItnoib *
pParam->B4SOIleff);
/* v4.2 bugfix: implement bugfix from bsim4.6.2 */
/* v4.2 bugfix: implement bugfix from bsim4.6.2 */
if(npart_theta > 0.9)
npart_theta = 0.9;
if(npart_theta > 0.9 * npart_beta)
npart_theta = 0.9 * npart_beta;
if (model->B4SOIrdsMod == 0)
{ gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance;
@ -261,144 +265,144 @@ int i;
gdpr = here->B4SOIgdtot;
}
if ( (*(ckt->CKTstates[0] + here->B4SOIvds))
>= 0.0 )
>= 0.0 )
gspr = gspr * (1.0 + npart_theta
* npart_theta * gspr
* npart_theta * gspr
/ here->B4SOIidovVds);
else
gdpr = gdpr * (1.0 + npart_theta
* npart_theta * gdpr
* npart_theta * gdpr
/ here->B4SOIidovVds);
}
NevalSrc(&noizDens[B4SOIRDNOIZ],
&lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE,
here->B4SOIdNodePrime, here->B4SOIdNode,
gdpr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
NevalSrc(&noizDens[B4SOIRDNOIZ],
&lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE,
here->B4SOIdNodePrime, here->B4SOIdNode,
gdpr * tempRatioSH * m); /* v4.2 self-heating temp */
NevalSrc(&noizDens[B4SOIRSNOIZ],
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
here->B4SOIsNodePrime, here->B4SOIsNode,
gspr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
NevalSrc(&noizDens[B4SOIRSNOIZ],
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
here->B4SOIsNodePrime, here->B4SOIsNode,
gspr * tempRatioSH * m); /* v4.2 self-heating temp */
/* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/
/* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/
/* if ((here->B4SOIrgateMod == 1) ||
(here->B4SOIrgateMod == 2)) */
if (here->B4SOIrgateMod == 1)
(here->B4SOIrgateMod == 2)) */
if (here->B4SOIrgateMod == 1)
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
here->B4SOIgNodeExt,
here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */
}
else if (here->B4SOIrgateMod == 2) /*v4.2*/
else if (here->B4SOIrgateMod == 2) /*v4.2*/
{
T0 = 1.0 + here->B4SOIgrgeltd/here->B4SOIgcrg;
T1 = T0 * T0;
NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd/T1 * tempRatioSH * here->B4SOIm); /*v4.2*/
here->B4SOIgNodeExt,
here->B4SOIgrgeltd/T1 * tempRatioSH * m); /*v4.2*/
}
else if (here->B4SOIrgateMod == 3)
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNodeMid,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
here->B4SOIgNodeExt,
here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */
}
else
{ noizDens[B4SOIRGNOIZ] = 0.0;
lnNdens[B4SOIRGNOIZ] =
log(MAX(noizDens[B4SOIRGNOIZ],
N_MINLOG));
N_MINLOG));
}
if (here->B4SOIrbodyMod)
{
NevalSrc(&noizDens[B4SOIRBSBNOIZ],
if (here->B4SOIrbodyMod)
{
NevalSrc(&noizDens[B4SOIRBSBNOIZ],
&lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIsbNode,
here->B4SOIgrbsb * here->B4SOIm);
here->B4SOIgrbsb * m);
NevalSrc(&noizDens[B4SOIRBDBNOIZ],
&lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIdbNode,
here->B4SOIgrbdb * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
}
here->B4SOIgrbdb * tempRatioSH * m); /* v4.2 self-heating temp */
}
else
{ noizDens[B4SOIRBSBNOIZ] = 0.0;
noizDens[B4SOIRBDBNOIZ] = 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],
if (here->B4SOIbodyMod == 1)
{
NevalSrc(&noizDens[B4SOIRBODYNOIZ],
&lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIpNode,
tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */
pParam->B4SOIrbody) * here->B4SOIm);
}
pParam->B4SOIrbody) * m);
}
else
{ noizDens[B4SOIRBODYNOIZ] = 0.0;
lnNdens[B4SOIRBODYNOIZ] =
log(MAX(noizDens[B4SOIRBODYNOIZ], N_MINLOG));
}
}
switch( model->B4SOItnoiMod )
{
case 0:
NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
(here->B4SOIueff
* fabs(here->B4SOIqinv
{
case 0:
NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
(here->B4SOIueff
* fabs(here->B4SOIqinv
/ (pParam->B4SOIleff
* pParam->B4SOIleff
+ here->B4SOIueff*fabs
(here->B4SOIqinv)
* here->B4SOIrds)))
* tempRatioSH /* v4.2 self-heating temp */
* model->B4SOIntnoi * here->B4SOIm);
break;
* model->B4SOIntnoi * m );
break;
/* v2.2.3 bug fix */
case 1:
T0 = here->B4SOIgm + here->B4SOIgmbs +
here->B4SOIgds;
T0 *= T0;
esat = 2.0 * here->B4SOIvsattemp /
here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat /
pParam->B4SOIleff;
T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 +
T5 * model->B4SOItnoia *
pParam->B4SOIleff);
case 1:
T0 = here->B4SOIgm + here->B4SOIgmbs +
here->B4SOIgds;
T0 *= T0;
esat = 2.0 * here->B4SOIvsattemp /
here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat /
pParam->B4SOIleff;
T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 +
T5 * model->B4SOItnoia *
pParam->B4SOIleff);
npart_theta = model->B4SOIrnoib * (1.0 +
T5 * model->B4SOItnoib *
pParam->B4SOIleff);
/*igsquare = npart_theta * npart_theta *
T0 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/
igsquare = npart_theta * npart_theta * T0 * Vdseffovcd;
T5 * model->B4SOItnoib *
pParam->B4SOIleff);
/*igsquare = npart_theta * npart_theta *
T0 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/
igsquare = npart_theta * npart_theta * T0 * Vdseffovcd;
T1 = npart_beta * (here->B4SOIgm
+ here->B4SOIgmbs) + here->B4SOIgds;
/*T2 = T1 * T1 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/
T2 = T1 * T1 * Vdseffovcd;
T2 = T1 * T1 * Vdseffovcd;
NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
/* (T2 - igsquare)); */
(T2 - igsquare) * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
break;
/* (T2 - igsquare)); */
(T2 - igsquare) * tempRatioSH * m); /* v4.2 self-heating temp */
break;
case 2:
NevalSrc(&noizDens[B4SOIIDNOIZ],
@ -406,33 +410,33 @@ int i;
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
model->B4SOIntnoi *
model->B4SOIntnoi *
tempRatioSH * /* v4.2 self-heating temp */
(2.0 / 3.0 * fabs(here->B4SOIgm
+ here->B4SOIgds
+ here->B4SOIgmbs)) * here->B4SOIm);
+ here->B4SOIgmbs)) * m);
break;
}
}
NevalSrc(&noizDens[B4SOIFLNOIZ], NULL,
ckt, N_GAIN, here->B4SOIdNodePrime,
here->B4SOIsNodePrime, (double) 0.0);
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 {
{ 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)))
@ -440,188 +444,188 @@ int i;
* pow(pParam->B4SOIleff,
model->B4SOIbf) * model->B4SOIcox);
break;
}
case 1:
vgs = *(ckt->CKTstates[0] + here->B4SOIvgs);
vds = *(ckt->CKTstates[0] + here->B4SOIvds);
if (vds < 0.0)
{ vds = -vds;
vgs = vgs + vds;
}
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, here->B4SOITempSH);
else
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp); /*v4.2 implementing SH temp */
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * here->B4SOITempSH;
else
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */
T11 = pParam->B4SOIweff * here->B4SOInf
* pParam->B4SOIleff
* pow(data->freq, model->B4SOIef)
* 1.0e10 * here->B4SOInstar
* here->B4SOInstar ;
Swi = T10 / T11 * here->B4SOIcd
* here->B4SOIcd;
T1 = Swi + Ssi;
if (T1 > 0.0)
}
case 1:
vgs = *(ckt->CKTstates[0] + here->B4SOIvgs);
vds = *(ckt->CKTstates[0] + here->B4SOIvds);
if (vds < 0.0)
{ vds = -vds;
vgs = vgs + vds;
}
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, here->B4SOITempSH);
else
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp); /*v4.2 implementing SH temp */
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * here->B4SOITempSH;
else
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */
T11 = pParam->B4SOIweff * here->B4SOInf
* pParam->B4SOIleff
* pow(data->freq, model->B4SOIef)
* 1.0e10 * here->B4SOInstar
* here->B4SOInstar ;
Swi = T10 / T11 * here->B4SOIcd
* here->B4SOIcd;
T1 = Swi + Ssi;
if (T1 > 0.0)
noizDens[B4SOIFLNOIZ] *= (Ssi
* Swi) / T1;
else
* Swi) / T1;
else
noizDens[B4SOIFLNOIZ] *= 0.0;
break;
}
break;
}
lnNdens[B4SOIFLNOIZ] =
log(MAX(noizDens[B4SOIFLNOIZ], N_MINLOG));
lnNdens[B4SOIFLNOIZ] =
log(MAX(noizDens[B4SOIFLNOIZ], N_MINLOG));
/* v3.2 for gate tunneling shot noise */
NevalSrc(&noizDens[B4SOIIGSNOIZ],
/* v3.2 for gate tunneling shot noise */
NevalSrc(&noizDens[B4SOIIGSNOIZ],
&lnNdens[B4SOIIGSNOIZ], ckt, SHOTNOISE,
here->B4SOIgNode, here->B4SOIsNodePrime,
(here->B4SOIIgs + here->B4SOIIgcs) * here->B4SOIm);
(here->B4SOIIgs + here->B4SOIIgcs) * m);
NevalSrc(&noizDens[B4SOIIGDNOIZ],
NevalSrc(&noizDens[B4SOIIGDNOIZ],
&lnNdens[B4SOIIGDNOIZ], ckt, SHOTNOISE,
here->B4SOIgNode, here->B4SOIdNodePrime,
(here->B4SOIIgd + here->B4SOIIgcd) * here->B4SOIm);
(here->B4SOIIgd + here->B4SOIIgcd) * m);
NevalSrc(&noizDens[B4SOIIGBNOIZ],
NevalSrc(&noizDens[B4SOIIGBNOIZ],
&lnNdens[B4SOIIGBNOIZ], ckt, SHOTNOISE,
here->B4SOIgNode, here->B4SOIbNode,
here->B4SOIig * here->B4SOIm);
/* v3.2 for gate tunneling shot noise end */
here->B4SOIig * m);
/* v3.2 for gate tunneling shot noise end */
/* Low frequency excess noise due to FBE */
/* NevalSrc(&noizDens[B4SOIFBNOIZ],
&lnNdens[B4SOIFBNOIZ], ckt, SHOTNOISE,
here->B4SOIsNodePrime, here->B4SOIbNode,
/* 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_IBSNOIZ],
&lnNdens[B4SOIFB_IBSNOIZ], ckt, SHOTNOISE,
here->B4SOIsNodePrime, here->B4SOIbNode,
model->B4SOInoif * here->B4SOIibs * m);
/* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
/* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * fabs(here->B4SOIibd)); */ /*v4.2*/
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * (here->B4SOIibd) * m); /*v4.2 extra fabs()removed */
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
+ noizDens[B4SOIRSNOIZ]
+ noizDens[B4SOIRGNOIZ]
+ noizDens[B4SOIIDNOIZ]
+ noizDens[B4SOIFLNOIZ]
/* + noizDens[B4SOIFBNOIZ] */
+ noizDens[B4SOIFB_IBSNOIZ]
+ noizDens[B4SOIFB_IBDNOIZ]
+ noizDens[B4SOIIGSNOIZ]
+ noizDens[B4SOIIGDNOIZ]
+ noizDens[B4SOIIGBNOIZ]
+ noizDens[B4SOIRBSBNOIZ]
+ noizDens[B4SOIRBDBNOIZ]
+ noizDens[B4SOIRBODYNOIZ];
lnNdens[B4SOITOTNOIZ] =
log(MAX(noizDens[B4SOITOTNOIZ], N_MINLOG));
model->B4SOInoif * (here->B4SOIibd) * here->B4SOIm); /*v4.2 extra fabs()removed */
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
+ noizDens[B4SOIRSNOIZ]
+ noizDens[B4SOIRGNOIZ]
+ noizDens[B4SOIIDNOIZ]
+ noizDens[B4SOIFLNOIZ]
/* + noizDens[B4SOIFBNOIZ] */
+ noizDens[B4SOIFB_IBSNOIZ]
+ noizDens[B4SOIFB_IBDNOIZ]
+ noizDens[B4SOIIGSNOIZ]
+ noizDens[B4SOIIGDNOIZ]
+ noizDens[B4SOIIGBNOIZ]
+ noizDens[B4SOIRBSBNOIZ]
+ noizDens[B4SOIRBDBNOIZ]
+ noizDens[B4SOIRBODYNOIZ];
lnNdens[B4SOITOTNOIZ] =
log(MAX(noizDens[B4SOITOTNOIZ], N_MINLOG));
*OnDens += noizDens[B4SOITOTNOIZ];
*OnDens += noizDens[B4SOITOTNOIZ];
if (data->delFreq == 0.0)
{ /* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
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];
}
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 ==
job->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 (job->NStpsSm != 0)
{ here->B4SOInVar[OUTNOIZ][i]
+= tempOnoise;
here->B4SOInVar[OUTNOIZ][B4SOITOTNOIZ]
+= tempOnoise;
here->B4SOInVar[INNOIZ][i]
+= tempInoise;
here->B4SOInVar[INNOIZ][B4SOITOTNOIZ]
+= tempInoise;
/* 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 (job->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 */
}
}
}
if (data->prtSummary)
{ for (i = 0; i < B4SOINSRCS; i++)
{ /* print a summary report */
data->outpVector[data->outNumber++]
= noizDens[i];
}
}
break;
case INT_NOIZ:
/* already calculated, just output */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ for (i = 0; i < B4SOINSRCS; i++)
{ data->outpVector[data->outNumber++]
= here->B4SOInVar[OUTNOIZ][i];
data->outpVector[data->outNumber++]
= here->B4SOInVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
} /* for model */
return(OK);

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -27,9 +28,9 @@ GENinstance *inst,
IFvalue *select)
{
B4SOIinstance *here = (B4SOIinstance*)inst;
NG_IGNORE(select);
switch(param)
{ case B4SOI_W:
here->B4SOIw = value->rValue;
@ -39,7 +40,7 @@ IFvalue *select)
here->B4SOIl = value->rValue;
here->B4SOIlGiven = TRUE;
break;
case B4SOI_M:
case B4SOI_M:
here->B4SOIm = value->rValue;
here->B4SOImGiven = TRUE;
break;
@ -213,19 +214,19 @@ IFvalue *select)
case 5:
here->B4SOIicVPS = *(value->v.vec.rVec+4);
here->B4SOIicVPSGiven = TRUE;
break; /* v4.2 bugfix */
break; /* v4.2 bugfix */
case 4:
here->B4SOIicVES = *(value->v.vec.rVec+3);
here->B4SOIicVESGiven = TRUE;
break; /* v4.2 bugfix */
break; /* v4.2 bugfix */
case 3:
here->B4SOIicVBS = *(value->v.vec.rVec+2);
here->B4SOIicVBSGiven = TRUE;
break; /* v4.2 bugfix */
break; /* v4.2 bugfix */
case 2:
here->B4SOIicVGS = *(value->v.vec.rVec+1);
here->B4SOIicVGSGiven = TRUE;
break; /* v4.2 bugfix */
break; /* v4.2 bugfix */
case 1:
here->B4SOIicVDS = *(value->v.vec.rVec);
here->B4SOIicVDSGiven = TRUE;

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -14,6 +15,7 @@
**********/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "ngspice/complex.h"
#include "ngspice/sperror.h"
@ -23,8 +25,8 @@
int
B4SOIpzLoad(
GENmodel *inModel,
register CKTcircuit *ckt,
register SPcomplex *s)
CKTcircuit *ckt,
SPcomplex *s)
{
register B4SOImodel *model = (B4SOImodel*)inModel;
register B4SOIinstance *here;
@ -41,12 +43,13 @@ 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;
{ Gm = here->B4SOIgm;
Gmbs = here->B4SOIgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
cggb = here->B4SOIcggb;
cgsb = here->B4SOIcgsb;
cgdb = here->B4SOIcgdb;
@ -59,11 +62,11 @@ double m;
cdsb = here->B4SOIcdsb;
cddb = here->B4SOIcddb;
}
else
{ Gm = -here->B4SOIgm;
Gmbs = -here->B4SOIgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
else
{ Gm = -here->B4SOIgm;
Gmbs = -here->B4SOIgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
cggb = here->B4SOIcggb;
cgsb = here->B4SOIcgdb;
cgdb = here->B4SOIcgsb;
@ -85,10 +88,10 @@ double m;
capbd= here->B4SOIcapbd;
capbs= here->B4SOIcapbs;
#endif
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
#ifdef BULKCODE
GBoverlapCap = here->pParam->B4SOIcgbo;
GBoverlapCap = here->pParam->B4SOIcgbo;
#endif
xcdgb = (cdgb - GDoverlapCap);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
@ -23,7 +24,7 @@
int
B4SOItrunc(
GENmodel *inModel,
register CKTcircuit *ckt,
CKTcircuit *ckt,
double *timeStep)
{
register B4SOImodel *model = (B4SOImodel*)inModel;
@ -35,8 +36,9 @@ register B4SOIinstance *here;
for (; model != NULL; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here != NULL;
here = here->B4SOInextInstance)
{
here = here->B4SOInextInstance)
{
if (here->B4SOIowner != ARCHme) continue;
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
@ -45,7 +47,7 @@ register B4SOIinstance *here;
CKTterr(here->B4SOIqd,ckt,timeStep);
#ifdef STEPDEBUG
if(debugtemp != *timeStep)
{ printf("device %s reduces step from %g to %g\n",
{ printf("device %s reduces step from %g to %g\n",
here->B4SOIname,debugtemp,*timeStep);
}
#endif /* STEPDEBUG */