diff --git a/src/spicelib/devices/bsim3soi/BsimTerms_use b/src/spicelib/devices/bsim3soi/BsimTerms_use index 938ec7b36..63b833726 100644 --- a/src/spicelib/devices/bsim3soi/BsimTerms_use +++ b/src/spicelib/devices/bsim3soi/BsimTerms_use @@ -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. diff --git a/src/spicelib/devices/bsim3soi/Makefile.am b/src/spicelib/devices/bsim3soi/Makefile.am index b30d8d425..438ebd6e2 100644 --- a/src/spicelib/devices/bsim3soi/Makefile.am +++ b/src/spicelib/devices/bsim3soi/Makefile.am @@ -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 diff --git a/src/spicelib/devices/bsim3soi/b4soi.c b/src/spicelib/devices/bsim3soi/b4soi.c index ec82ff3e4..f4b660698 100644 --- a/src/spicelib/devices/bsim3soi/b4soi.c +++ b/src/spicelib/devices/bsim3soi/b4soi.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soiacld.c b/src/spicelib/devices/bsim3soi/b4soiacld.c index 68d4d3268..3f8c3ec5d 100644 --- a/src/spicelib/devices/bsim3soi/b4soiacld.c +++ b/src/spicelib/devices/bsim3soi/b4soiacld.c @@ -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) { diff --git a/src/spicelib/devices/bsim3soi/b4soiask.c b/src/spicelib/devices/bsim3soi/b4soiask.c index 9778b1608..b08de9525 100644 --- a/src/spicelib/devices/bsim3soi/b4soiask.c +++ b/src/spicelib/devices/bsim3soi/b4soiask.c @@ -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; diff --git a/src/spicelib/devices/bsim3soi/b4soicheck.c b/src/spicelib/devices/bsim3soi/b4soicheck.c index 9b4fbafba..15d97ed2d 100644 --- a/src/spicelib/devices/bsim3soi/b4soicheck.c +++ b/src/spicelib/devices/bsim3soi/b4soicheck.c @@ -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, b3soicheck.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. + * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu. * File: b4soicheck.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Tanvir Morshed 09/22/2009 * Modified by Tanvir Morshed 12/31/2009 + * Modified by Tanvir Morshed 12/16/2010 **********/ #include "ngspice/ngspice.h" @@ -23,8 +26,10 @@ #include "ngspice/suffix.h" int -B4SOIcheckModel(B4SOImodel *model, B4SOIinstance *here, CKTcircuit *ckt) - +B4SOIcheckModel( +B4SOImodel *model, +B4SOIinstance *here, +CKTcircuit *ckt) { struct b4soiSizeDependParam *pParam; int Fatal_Flag = 0; @@ -34,33 +39,33 @@ FILE *fplog; if ((fplog = fopen("b4soiv1check.log", "w")) != NULL) { pParam = here->pParam; - fprintf(fplog, "B4SOIV3 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->B4SOImodName); - fprintf(fplog, "W = %g, L = %g\n", here->B4SOIw, here->B4SOIl); + fprintf(fplog, "B4SOIV3 Parameter Check\n"); + fprintf(fplog, "Model = %s\n", model->B4SOImodName); + fprintf(fplog, "W = %g, L = %g\n", here->B4SOIw, here->B4SOIl); if (pParam->B4SOIlpe0 < -pParam->B4SOIleff) - { fprintf(fplog, "Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->B4SOIlpe0); - printf("Fatal: Lpe0 = %g is less than -Leff.\n", - pParam->B4SOIlpe0); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Lpe0 = %g is less than -Leff.\n", + pParam->B4SOIlpe0); + printf("Fatal: Lpe0 = %g is less than -Leff.\n", + pParam->B4SOIlpe0); + Fatal_Flag = 1; } if((here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && - (here->B4SOIsd > 0.0))) ) + (here->B4SOIsd > 0.0))) ) { if (model->B4SOIsaref <= 0.0) { fprintf(fplog, "Fatal: SAref = %g is not positive.\n", - model->B4SOIsaref); + model->B4SOIsaref); printf("Fatal: SAref = %g is not positive.\n", - model->B4SOIsaref); + model->B4SOIsaref); Fatal_Flag = 1; } if (model->B4SOIsbref <= 0.0) { fprintf(fplog, "Fatal: SBref = %g is not positive.\n", - model->B4SOIsbref); + model->B4SOIsbref); printf("Fatal: SBref = %g is not positive.\n", - model->B4SOIsbref); + model->B4SOIsbref); Fatal_Flag = 1; } } @@ -92,31 +97,31 @@ FILE *fplog; Fatal_Flag = 1; } - if (model->B4SOItox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->B4SOItox); - printf("Fatal: Tox = %g is not positive.\n", model->B4SOItox); - Fatal_Flag = 1; - } - if (model->B4SOIleffeot <= 0.0) - { fprintf(fplog, "Fatal: leffeot = %g is not positive.\n", - model->B4SOIleffeot); - printf("Fatal: Leffeot = %g is not positive.\n", model->B4SOIleffeot); - Fatal_Flag = 1; - } - if (model->B4SOIweffeot <= 0.0) - { fprintf(fplog, "Fatal: weffeot = %g is not positive.\n", - model->B4SOIweffeot); - printf("Fatal: Weffeot = %g is not positive.\n", model->B4SOIweffeot); - Fatal_Flag = 1; - } - if (model->B4SOItoxp <= 0.0) - { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", - model->B4SOItoxp); - printf("Fatal: Toxp = %g is not positive.\n", model->B4SOItoxp); - Fatal_Flag = 1; - } - if (model->B4SOIepsrgate < 0.0) + if (model->B4SOItox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->B4SOItox); + printf("Fatal: Tox = %g is not positive.\n", model->B4SOItox); + Fatal_Flag = 1; + } + if (model->B4SOIleffeot <= 0.0) + { fprintf(fplog, "Fatal: leffeot = %g is not positive.\n", + model->B4SOIleffeot); + printf("Fatal: Leffeot = %g is not positive.\n", model->B4SOIleffeot); + Fatal_Flag = 1; + } + if (model->B4SOIweffeot <= 0.0) + { fprintf(fplog, "Fatal: weffeot = %g is not positive.\n", + model->B4SOIweffeot); + printf("Fatal: Weffeot = %g is not positive.\n", model->B4SOIweffeot); + Fatal_Flag = 1; + } + if (model->B4SOItoxp <= 0.0) + { fprintf(fplog, "Fatal: Toxp = %g is not positive.\n", + model->B4SOItoxp); + printf("Fatal: Toxp = %g is not positive.\n", model->B4SOItoxp); + Fatal_Flag = 1; + } + if (model->B4SOIepsrgate < 0.0) { fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n", model->B4SOIepsrgate); printf("Fatal: Epsrgate = %g is not positive.\n", model->B4SOIepsrgate); @@ -146,123 +151,123 @@ FILE *fplog; } - if (model->B4SOItbox <= 0.0) - { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", - model->B4SOItbox); - printf("Fatal: Tbox = %g is not positive.\n", model->B4SOItbox); - Fatal_Flag = 1; - } - - if (pParam->B4SOInpeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->B4SOInpeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->B4SOInpeak); - Fatal_Flag = 1; - } - if (pParam->B4SOIngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->B4SOIngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B4SOIngate); - Fatal_Flag = 1; - } - if (pParam->B4SOIngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->B4SOIngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->B4SOIngate); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B4SOIdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1); - Fatal_Flag = 1; - } - - if (pParam->B4SOIdvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B4SOIdvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B4SOIw0 == -pParam->B4SOIweff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; + if (model->B4SOItbox <= 0.0) + { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", + model->B4SOItbox); + printf("Fatal: Tbox = %g is not positive.\n", model->B4SOItbox); + Fatal_Flag = 1; } - if (pParam->B4SOIdsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); - Fatal_Flag = 1; - } - if (pParam->B4SOIb1 == -pParam->B4SOIweff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->B4SOInpeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->B4SOInpeak); + printf("Fatal: Nch = %g is not positive.\n", + pParam->B4SOInpeak); + Fatal_Flag = 1; + } + if (pParam->B4SOIngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->B4SOIngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->B4SOIngate); + Fatal_Flag = 1; + } + if (pParam->B4SOIngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->B4SOIngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->B4SOIngate); + Fatal_Flag = 1; + } + + if (pParam->B4SOIdvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->B4SOIdvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1); + Fatal_Flag = 1; + } + + if (pParam->B4SOIdvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->B4SOIdvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); + Fatal_Flag = 1; + } + + if (pParam->B4SOIw0 == -pParam->B4SOIweff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); + Fatal_Flag = 1; + } + + if (pParam->B4SOIdsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); + Fatal_Flag = 1; + } + if (pParam->B4SOIb1 == -pParam->B4SOIweff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } if (pParam->B4SOIu0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B4SOIu0temp); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->B4SOIu0temp); + Fatal_Flag = 1; } /* Check delta parameter */ if (pParam->B4SOIdelta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B4SOIdelta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->B4SOIdelta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); + Fatal_Flag = 1; } - if (pParam->B4SOIvsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B4SOIvsattemp); - Fatal_Flag = 1; - } + if (pParam->B4SOIvsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->B4SOIvsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->B4SOIpclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); - Fatal_Flag = 1; - } + if (pParam->B4SOIpclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->B4SOIpclm); + Fatal_Flag = 1; + } - if (pParam->B4SOIdrout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); - printf("Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); - Fatal_Flag = 1; - } - if ( model->B4SOIunitLengthGateSidewallJctCapD > 0.0) /* v4.0 */ + if (pParam->B4SOIdrout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); + printf("Fatal: Drout = %g is negative.\n", pParam->B4SOIdrout); + Fatal_Flag = 1; + } + if ( model->B4SOIunitLengthGateSidewallJctCapD > 0.0) /* v4.0 */ { - if (here->B4SOIdrainPerimeter < pParam->B4SOIweff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->B4SOIdrainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->B4SOIdrainPerimeter); + if (here->B4SOIdrainPerimeter < pParam->B4SOIweff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->B4SOIdrainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->B4SOIdrainPerimeter); here->B4SOIdrainPerimeter =pParam->B4SOIweff; - } + } } - if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */ + if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */ { - if (here->B4SOIsourcePerimeter < pParam->B4SOIweff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->B4SOIsourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->B4SOIsourcePerimeter); + if (here->B4SOIsourcePerimeter < pParam->B4SOIweff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->B4SOIsourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->B4SOIsourcePerimeter); here->B4SOIsourcePerimeter =pParam->B4SOIweff; - } + } } /* Check capacitance parameters */ if (pParam->B4SOIclc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); - printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); + printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); + Fatal_Flag = 1; } @@ -283,7 +288,7 @@ FILE *fplog; /* Check stress effect parameters */ if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && - (here->B4SOIsd > 0.0))) ) + (here->B4SOIsd > 0.0))) ) { if (model->B4SOIlodk2 <= 0.0) { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); printf("Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); @@ -316,20 +321,20 @@ FILE *fplog; } - if (model->B4SOIcapMod == 3) { - if (pParam->B4SOIacde < 0.1) /* v3.1.1 */ - { fprintf (fplog, "Warning: Acde = %g is too small.\n", - pParam->B4SOIacde); - printf ("Warning: Acde = %g is too small.\n", - pParam->B4SOIacde); - } - if (pParam->B4SOIacde > 1.6) - { fprintf (fplog, "Warning: Acde = %g is too large.\n", - pParam->B4SOIacde); - printf ("Warning: Acde = %g is too large.\n", - pParam->B4SOIacde); - } - } + if (model->B4SOIcapMod == 3) { + if (pParam->B4SOIacde < 0.1) /* v3.1.1 */ + { fprintf (fplog, "Warning: Acde = %g is too small.\n", + pParam->B4SOIacde); + printf ("Warning: Acde = %g is too small.\n", + pParam->B4SOIacde); + } + if (pParam->B4SOIacde > 1.6) + { fprintf (fplog, "Warning: Acde = %g is too large.\n", + pParam->B4SOIacde); + printf ("Warning: Acde = %g is too large.\n", + pParam->B4SOIacde); + } + } /* v4.2 always perform Fatal checks */ if (pParam->B4SOInigc <= 0.0) @@ -371,310 +376,332 @@ FILE *fplog; printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox); } +/* v4.4 Tanvir */ + if (pParam->B4SOIrdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B4SOIrdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B4SOIrdsw); + pParam->B4SOIrdsw = 0.0; + pParam->B4SOIrds0 = 0.0; + } + else if (pParam->B4SOIrds0 < 0.001) + { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B4SOIrds0); + printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B4SOIrds0); + pParam->B4SOIrds0 = 0.0; + } /* v4.4 */ + if ((model->B4SOIcfrcoeff < 1.0)||(model->B4SOIcfrcoeff > 2.0)) + { fprintf(fplog, "Warning: CfrCoeff = %g is out of range.\n", + model->B4SOIcfrcoeff); + printf("Warning: CfrCoeff = %g is outside valid range [1,2], set to 1.\n", model->B4SOIcfrcoeff); + model->B4SOIcfrcoeff = 1; + } /* v4.4 */ if (model->B4SOIparamChk ==1) { /* Check L and W parameters */ - if (pParam->B4SOIleff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->B4SOIleff); - printf("Warning: Leff = %g may be too small.\n", - pParam->B4SOIleff); - } - - if (pParam->B4SOIleffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B4SOIleffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->B4SOIleffCV); - } - - if (pParam->B4SOIweff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->B4SOIweff); - printf("Warning: Weff = %g may be too small.\n", - pParam->B4SOIweff); - } - - if (pParam->B4SOIweffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B4SOIweffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->B4SOIweffCV); - } - -/* Check threshold voltage parameters */ - if (pParam->B4SOIlpe0 < 0.0) - { fprintf(fplog, "Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); - printf("Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); + if (pParam->B4SOIleff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->B4SOIleff); + printf("Warning: Leff = %g may be too small.\n", + pParam->B4SOIleff); } - if (model->B4SOItox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->B4SOItox); - printf("Warning: Tox = %g is less than 10A.\n", model->B4SOItox); + + if (pParam->B4SOIleffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->B4SOIleffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->B4SOIleffCV); + } + + if (pParam->B4SOIweff <= 1.0e-7) + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->B4SOIweff); + printf("Warning: Weff = %g may be too small.\n", + pParam->B4SOIweff); + } + + if (pParam->B4SOIweffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->B4SOIweffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->B4SOIweffCV); + } + +/* Check threshold voltage parameters */ + if (pParam->B4SOIlpe0 < 0.0) + { fprintf(fplog, "Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); + printf("Warning: Lpe0 = %g is negative.\n", pParam->B4SOIlpe0); + } + if (model->B4SOItox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->B4SOItox); + printf("Warning: Tox = %g is less than 10A.\n", model->B4SOItox); } if (pParam->B4SOInpeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->B4SOInpeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->B4SOInpeak); - } - else if (pParam->B4SOInpeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->B4SOInpeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->B4SOInpeak); - } + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->B4SOInpeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->B4SOInpeak); + } + else if (pParam->B4SOInpeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->B4SOInpeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->B4SOInpeak); + } - if (fabs(pParam->B4SOInsub) >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B4SOInsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->B4SOInsub); - } + if (fabs(pParam->B4SOInsub) >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->B4SOInsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->B4SOInsub); + } - if ((pParam->B4SOIngate > 0.0) && - (pParam->B4SOIngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B4SOIngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B4SOIngate); - } + if ((pParam->B4SOIngate > 0.0) && + (pParam->B4SOIngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->B4SOIngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->B4SOIngate); + } if (pParam->B4SOIdvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B4SOIdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0); - } - - if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->B4SOIdvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0); } -/* Check Nsd, Ngate and Npeak parameters*/ /* Bug Fix # 22 Jul09*/ + + if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); + } +/* Check Nsd, Ngate and Npeak parameters*/ /* Bug Fix # 22 Jul09*/ if (model->B4SOInsd > 1.0e23) - { fprintf(fplog, "Warning: Nsd = %g is too large, should be specified in cm^-3.\n", - model->B4SOInsd); - printf("Warning: Nsd = %g is too large, should be specified in cm^-3.\n", model->B4SOInsd); - } + { fprintf(fplog, "Warning: Nsd = %g is too large, should be specified in cm^-3.\n", + model->B4SOInsd); + printf("Warning: Nsd = %g is too large, should be specified in cm^-3.\n", model->B4SOInsd); + } if (model->B4SOIngate > 1.0e23) - { fprintf(fplog, "Warning: Ngate = %g is too large, should be specified in cm^-3.\n", - model->B4SOIngate); - printf("Warning: Ngate = %g is too large, should be specified in cm^-3.\n", model->B4SOIngate); - } + { fprintf(fplog, "Warning: Ngate = %g is too large, should be specified in cm^-3.\n", + model->B4SOIngate); + printf("Warning: Ngate = %g is too large, should be specified in cm^-3.\n", model->B4SOIngate); + } if (model->B4SOInpeak > 1.0e20) - { fprintf(fplog, "Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", - model->B4SOInpeak); - printf("Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", model->B4SOInpeak); - } + { fprintf(fplog, "Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", + model->B4SOInpeak); + printf("Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", model->B4SOInpeak); + } /* Check subthreshold parameters */ - if (pParam->B4SOInfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B4SOInfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->B4SOInfactor); - } - if (pParam->B4SOIcdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B4SOIcdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->B4SOIcdsc); - } - if (pParam->B4SOIcdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B4SOIcdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->B4SOIcdscd); - } + if (pParam->B4SOInfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->B4SOInfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->B4SOInfactor); + } + if (pParam->B4SOIcdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->B4SOIcdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->B4SOIcdsc); + } + if (pParam->B4SOIcdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->B4SOIcdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->B4SOIcdscd); + } /* Check DIBL parameters */ - if (pParam->B4SOIeta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B4SOIeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0); - } - -/* Check Abulk parameters */ + if (pParam->B4SOIeta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->B4SOIeta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0); + } + +/* Check Abulk parameters */ if (fabs(1.0e-6 / (pParam->B4SOIb1 + pParam->B4SOIweff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); } /* Check Saturation parameters */ - if (pParam->B4SOIa2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B4SOIa2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B4SOIa2); - pParam->B4SOIa2 = 0.01; - } - else if (pParam->B4SOIa2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B4SOIa2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B4SOIa2); - pParam->B4SOIa2 = 1.0; - pParam->B4SOIa1 = 0.0; + if (pParam->B4SOIa2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B4SOIa2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->B4SOIa2); + pParam->B4SOIa2 = 0.01; + } + else if (pParam->B4SOIa2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->B4SOIa2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->B4SOIa2); + pParam->B4SOIa2 = 1.0; + pParam->B4SOIa1 = 0.0; - } + } +/* + if (pParam->B4SOIrdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B4SOIrdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B4SOIrdsw); + pParam->B4SOIrdsw = 0.0; + pParam->B4SOIrds0 = 0.0; + } + else if (pParam->B4SOIrds0 < 0.001) + { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B4SOIrds0); + printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B4SOIrds0); + pParam->B4SOIrds0 = 0.0; + } v4.4 */ + if (pParam->B4SOIvsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); + } - if (pParam->B4SOIrdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B4SOIrdsw); - pParam->B4SOIrdsw = 0.0; - pParam->B4SOIrds0 = 0.0; - } - else if (pParam->B4SOIrds0 < 0.001) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B4SOIrds0); - pParam->B4SOIrds0 = 0.0; - } - if (pParam->B4SOIvsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp); - } - - if (pParam->B4SOIpdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B4SOIpdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->B4SOIpdibl1); - } - if (pParam->B4SOIpdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B4SOIpdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->B4SOIpdibl2); - } + if (pParam->B4SOIpdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->B4SOIpdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->B4SOIpdibl1); + } + if (pParam->B4SOIpdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->B4SOIpdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->B4SOIpdibl2); + } /* Check overlap capacitance parameters */ if (model->B4SOIcgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); - model->B4SOIcgdo = 0.0; + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); + model->B4SOIcgdo = 0.0; } if (model->B4SOIcgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); - model->B4SOIcgso = 0.0; + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); + model->B4SOIcgso = 0.0; } if (model->B4SOIcgeo < 0.0) - { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); - printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); - model->B4SOIcgeo = 0.0; + { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); + printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); + model->B4SOIcgeo = 0.0; } - if (model->B4SOIntun < 0.0) - { fprintf(fplog, "Warning: Ntuns = %g is negative.\n", - model->B4SOIntun); - printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun); - } + if (model->B4SOIntun < 0.0) + { fprintf(fplog, "Warning: Ntuns = %g is negative.\n", + model->B4SOIntun); + printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun); + } - if (model->B4SOIntund < 0.0) - { fprintf(fplog, "Warning: Ntund = %g is negative.\n", - model->B4SOIntund); - printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund); - } + if (model->B4SOIntund < 0.0) + { fprintf(fplog, "Warning: Ntund = %g is negative.\n", + model->B4SOIntund); + printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund); + } - if (model->B4SOIndiode < 0.0) - { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B4SOIndiode); - printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode); - } + if (model->B4SOIndiode < 0.0) + { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", + model->B4SOIndiode); + printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode); + } - if (model->B4SOIndioded < 0.0) - { fprintf(fplog, "Warning: Ndioded = %g is negative.\n", - model->B4SOIndioded); - printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded); - } + if (model->B4SOIndioded < 0.0) + { fprintf(fplog, "Warning: Ndioded = %g is negative.\n", + model->B4SOIndioded); + printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded); + } - if (model->B4SOIisbjt < 0.0) - { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B4SOIisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt); - } + if (model->B4SOIisbjt < 0.0) + { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", + model->B4SOIisbjt); + printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt); + } if (model->B4SOIidbjt < 0.0) { fprintf(fplog, "Warning: Idbjt = %g is negative.\n", model->B4SOIidbjt); printf("Warning: Idbjt = %g is negative.\n", model->B4SOIidbjt); } - if (model->B4SOIisdif < 0.0) - { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B4SOIisdif); - printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif); - } + if (model->B4SOIisdif < 0.0) + { fprintf(fplog, "Warning: Isdif = %g is negative.\n", + model->B4SOIisdif); + printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif); + } if (model->B4SOIiddif < 0.0) { fprintf(fplog, "Warning: Iddif = %g is negative.\n", model->B4SOIiddif); printf("Warning: Iddif = %g is negative.\n", model->B4SOIiddif); } - if (model->B4SOIisrec < 0.0) - { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B4SOIisrec); - printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec); - } + if (model->B4SOIisrec < 0.0) + { fprintf(fplog, "Warning: Isrec = %g is negative.\n", + model->B4SOIisrec); + printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec); + } if (model->B4SOIidrec < 0.0) { fprintf(fplog, "Warning: Idrec = %g is negative.\n", model->B4SOIidrec); printf("Warning: Idrec = %g is negative.\n", model->B4SOIidrec); } - if (model->B4SOIistun < 0.0) - { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B4SOIistun); - printf("Warning: Istun = %g is negative.\n", model->B4SOIistun); - } + if (model->B4SOIistun < 0.0) + { fprintf(fplog, "Warning: Istun = %g is negative.\n", + model->B4SOIistun); + printf("Warning: Istun = %g is negative.\n", model->B4SOIistun); + } if (model->B4SOIidtun < 0.0) { fprintf(fplog, "Warning: Idtun = %g is negative.\n", model->B4SOIidtun); printf("Warning: Idtun = %g is negative.\n", model->B4SOIidtun); } - if (model->B4SOItt < 0.0) - { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B4SOItt); - printf("Warning: Tt = %g is negative.\n", model->B4SOItt); - } + if (model->B4SOItt < 0.0) + { fprintf(fplog, "Warning: Tt = %g is negative.\n", + model->B4SOItt); + printf("Warning: Tt = %g is negative.\n", model->B4SOItt); + } - if (model->B4SOIcsdmin < 0.0) - { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B4SOIcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin); - } + if (model->B4SOIcsdmin < 0.0) + { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", + model->B4SOIcsdmin); + printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin); + } - if (model->B4SOIcsdesw < 0.0) - { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B4SOIcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw); - } + if (model->B4SOIcsdesw < 0.0) + { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", + model->B4SOIcsdesw); + printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw); + } - if (model->B4SOIasd < 0.0) - { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B4SOIasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd); - } + if (model->B4SOIasd < 0.0) + { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", + model->B4SOIasd); + printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd); + } - if (model->B4SOIrth0 < 0.0) - { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B4SOIrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0); - } + if (model->B4SOIrth0 < 0.0) + { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", + model->B4SOIrth0); + printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0); + } - if (model->B4SOIcth0 < 0.0) - { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B4SOIcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0); - } + if (model->B4SOIcth0 < 0.0) + { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", + model->B4SOIcth0); + printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0); + } - if (model->B4SOIrbody < 0.0) - { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B4SOIrbody); - printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); - } + if (model->B4SOIrbody < 0.0) + { fprintf(fplog, "Warning: Rbody = %g is negative.\n", + model->B4SOIrbody); + printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); + } - if (model->B4SOIrbsh < 0.0) - { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B4SOIrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); - } + if (model->B4SOIrbsh < 0.0) + { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", + model->B4SOIrbsh); + printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); + } /* v2.2 release */ @@ -810,22 +837,22 @@ if (model->B4SOInpeak > 1.0e20) model->B4SOIfbjtii); printf("Warning: fbjtii = %g is negative.\n", model->B4SOIfbjtii); } - if (model->B4SOIvrec0 < 0.0) /* v4.0 */ + if (model->B4SOIvrec0 < 0.0) /* v4.0 */ { fprintf(fplog, "Warning: VREC0S = %g is negative.\n", model->B4SOIvrec0); printf("Warning: Vrec0s = %g is negative.\n", model->B4SOIvrec0); } - if (model->B4SOIvrec0d < 0.0) /* v4.0 */ + if (model->B4SOIvrec0d < 0.0) /* v4.0 */ { fprintf(fplog, "Warning: VREC0D = %g is negative.\n", model->B4SOIvrec0d); printf("Warning: Vrec0d = %g is negative.\n", model->B4SOIvrec0d); } - if (model->B4SOIvtun0 < 0.0) /* v4.0 */ + if (model->B4SOIvtun0 < 0.0) /* v4.0 */ { fprintf(fplog, "Warning: VTUN0S = %g is negative.\n", model->B4SOIvtun0); printf("Warning: Vtun0s = %g is negative.\n", model->B4SOIvtun0); } - if (model->B4SOIvtun0d < 0.0) /* v4.0 */ + if (model->B4SOIvtun0d < 0.0) /* v4.0 */ { fprintf(fplog, "Warning: VTUN0D = %g is negative.\n", model->B4SOIvtun0d); printf("Warning: Vtun0d = %g is negative.\n", model->B4SOIvtun0d); @@ -915,8 +942,6 @@ if (model->B4SOInpeak > 1.0e20) model->B4SOIdlbg); printf("Warning: dlbg = %g is negative.\n", model->B4SOIdlbg); } - - if (model->B4SOIagidl < 0.0) { fprintf(fplog, "Warning: AGIDL = %g is negative.\n", model->B4SOIagidl); @@ -931,15 +956,15 @@ if (model->B4SOInpeak > 1.0e20) { fprintf(fplog, "Warning: CGIDL = %g is smaller than 1e-9.\n", model->B4SOIcgidl); printf("Warning: Cgidl = %g is smaller than 1e-9.\n", - model->B4SOIcgidl); + model->B4SOIcgidl); } if (model->B4SOIegidl < 0.0) { fprintf(fplog, "Warning: EGIDL = %g is negative.\n", model->B4SOIegidl); printf("Warning: Egidl = %g is negative.\n", model->B4SOIegidl); } - - if (model->B4SOIagisl < 0.0) + + if (model->B4SOIagisl < 0.0) { fprintf(fplog, "Warning: AGISL = %g is negative.\n", model->B4SOIagisl); printf("Warning: Agidl = %g is negative.\n", model->B4SOIagidl); @@ -953,42 +978,42 @@ if (model->B4SOInpeak > 1.0e20) { fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n", model->B4SOIcgisl); printf("Warning: Cgisl = %g is smaller than 1e-9.\n", - model->B4SOIcgisl); + model->B4SOIcgisl); } if (model->B4SOIegisl < 0.0) { fprintf(fplog, "Warning: EGISL = %g is negative.\n", model->B4SOIegisl); printf("Warning: Egisl = %g is negative.\n", model->B4SOIegisl); - } - + } + if (model->B4SOIesatii < 0.0) { fprintf(fplog, "Warning: Esatii = %g should be within positive.\n", model->B4SOIesatii); printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii); } - - if (!model->B4SOIvgstcvModGiven) + + if (!model->B4SOIvgstcvModGiven) { fprintf(fplog, "Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); printf("Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); } - if (pParam->B4SOIxj > model->B4SOItsi) - { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); - } + if (pParam->B4SOIxj > model->B4SOItsi) + { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", + pParam->B4SOIxj, model->B4SOItsi); + printf("Warning: Xj = %g is thicker than Tsi = %g.\n", + pParam->B4SOIxj, model->B4SOItsi); + } if (model->B4SOIcapMod < 2) - { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - if (model->B4SOIcapMod > 3) - { fprintf(fplog, "Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); - printf("Warning: Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); - } + { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); + printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); + } + if (model->B4SOIcapMod > 3) + { fprintf(fplog, "Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); + printf("Warning: Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); + } }/* loop for the parameter check for warning messages */ - fclose(fplog); + fclose(fplog); } else { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); diff --git a/src/spicelib/devices/bsim3soi/b4soicvtest.c b/src/spicelib/devices/bsim3soi/b4soicvtest.c index efb54c916..deefdffa6 100644 --- a/src/spicelib/devices/bsim3soi/b4soicvtest.c +++ b/src/spicelib/devices/bsim3soi/b4soicvtest.c @@ -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); } } diff --git a/src/spicelib/devices/bsim3soi/b4soidef.h b/src/spicelib/devices/bsim3soi/b4soidef.h index b04e4b7ec..a9f0e9528 100644 --- a/src/spicelib/devices/bsim3soi/b4soidef.h +++ b/src/spicelib/devices/bsim3soi/b4soidef.h @@ -5,6 +5,7 @@ authors:1999-2004 Pin Su, Hui Wan b3soidef.h Authors:2005- Hui Wan, Jane Xi Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu +Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu File: b4soidef.h **********/ @@ -23,7 +24,6 @@ File: b4soidef.h #include "ngspice/complex.h" #include "ngspice/noisedef.h" - #ifdef USE_OMP #define USE_OMP4SOI #endif @@ -106,19 +106,19 @@ typedef struct sB4SOIinstance double B4SOIgcrgb; /* v3.1 added for end */ - double B4SOIInv_ODeff; /* v4.0 */ - double B4SOIkvsat; /* v4.0 */ - double B4SOIgrbsb; /* v4.0 */ - double B4SOIgrbdb; /* v4.0 */ - double B4SOIrbsb; /* v4.0 */ - double B4SOIrbdb; /* v4.0 */ - double B4SOIGGjdb; /* v4.0 */ - double B4SOIGGjsb; /* v4.0 */ - double B4SOIgbgiigbpb; /* v4.0 */ - double B4SOIgiigidlb; /* v4.0 */ - double B4SOIgiigidld; /* v4.0 */ - double B4SOIdelvto; /* v4.0 */ - double B4SOIgstot; /* v4.0 for rdsmod */ + double B4SOIInv_ODeff; /* v4.0 */ + double B4SOIkvsat; /* v4.0 */ + double B4SOIgrbsb; /* v4.0 */ + double B4SOIgrbdb; /* v4.0 */ + double B4SOIrbsb; /* v4.0 */ + double B4SOIrbdb; /* v4.0 */ + double B4SOIGGjdb; /* v4.0 */ + double B4SOIGGjsb; /* v4.0 */ + double B4SOIgbgiigbpb; /* v4.0 */ + double B4SOIgiigidlb; /* v4.0 */ + double B4SOIgiigidld; /* v4.0 */ + double B4SOIdelvto; /* v4.0 */ + double B4SOIgstot; /* v4.0 for rdsmod */ double B4SOIgstotd; /* v4.0 for rdsmod */ double B4SOIgstotg; /* v4.0 for rdsmod */ double B4SOIgstots; /* v4.0 for rdsmod */ @@ -133,10 +133,10 @@ typedef struct sB4SOIinstance double B4SOIigp; /* v4.1 for Igb in the AGBCP2 region */ double B4SOIgigpg; /* v4.1 for Igb in the AGBCP2 region */ double B4SOIgigpp; /* v4.1 for Igb in the AGBCP2 region */ - double B4SOITempSH; /* v4.2 for portability of SH temp */ + double B4SOITempSH; /* v4.2 for portability of SH temp */ double B4SOIigidl; - double B4SOIigisl; + double B4SOIigisl; double B4SOIitun; double B4SOIibp; /* double B4SOIabeff; */ /* v4.2 never used in the code */ @@ -180,13 +180,13 @@ typedef struct sB4SOIinstance double B4SOIeta0; /* end of v4.0 stress effect instance param */ /*4.1 mobmod=4*/ - double B4SOIvtfbphi1; - double B4SOIvgsteffvth; - + double B4SOIvtfbphi1; + double B4SOIvgsteffvth; + + + + - - - double B4SOIicVBS; double B4SOIicVDS; double B4SOIicVGS; @@ -290,11 +290,13 @@ typedef struct sB4SOIinstance double B4SOIgIgcsd; double B4SOIgIgcss; double B4SOIgIgcsb; + double B4SOIgIgcse; double B4SOIIgcd; double B4SOIgIgcdg; double B4SOIgIgcdd; double B4SOIgIgcds; double B4SOIgIgcdb; + double B4SOIgIgcde; double B4SOIIgs; double B4SOIgIgsg; @@ -336,6 +338,7 @@ typedef struct sB4SOIinstance double B4SOIcggb; double B4SOIcgdb; double B4SOIcgsb; + double B4SOIcgeb; double B4SOIcgT; double B4SOIcbgb; @@ -407,8 +410,8 @@ typedef struct sB4SOIinstance unsigned B4SOIpdbcpGiven :1; unsigned B4SOIpsbcpGiven :1; unsigned B4SOIagbcpGiven :1; - unsigned B4SOIagbcp2Given :1; /* v4.1 improvement on BC */ - unsigned B4SOIagbcpdGiven :1; /* v4.0 */ + unsigned B4SOIagbcp2Given :1; /* v4.1 improvement on BC */ + unsigned B4SOIagbcpdGiven :1; /* v4.0 */ unsigned B4SOIaebcpGiven :1; unsigned B4SOIvbsusrGiven :1; unsigned B4SOItnodeoutGiven :1; @@ -437,16 +440,16 @@ typedef struct sB4SOIinstance double *B4SOIBsbPtr; double *B4SOIBdbPtr; - double *B4SOIDgPtr; /* v4.0 for rdsMod =1 */ - double *B4SOIDspPtr; /* v4.0 for rdsMod =1 */ - double *B4SOIDbPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISdpPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISgPtr; /* v4.0 for rdsMod =1 */ - double *B4SOISbPtr; /* v4.0 for rdsMod =1 */ + double *B4SOIDgPtr; /* v4.0 for rdsMod =1 */ + double *B4SOIDspPtr; /* v4.0 for rdsMod =1 */ + double *B4SOIDbPtr; /* v4.0 for rdsMod =1 */ + double *B4SOISdpPtr; /* v4.0 for rdsMod =1 */ + double *B4SOISgPtr; /* v4.0 for rdsMod =1 */ + double *B4SOISbPtr; /* v4.0 for rdsMod =1 */ /* v4.0 end */ - double *B4SOIPgPtr; /* v4.1 for Ig_agbcp2 */ - double *B4SOIGpPtr; /* v4.1 for Ig_agbcp2 */ + double *B4SOIPgPtr; /* v4.1 for Ig_agbcp2 */ + double *B4SOIGpPtr; /* v4.1 for Ig_agbcp2 */ /* v3.1 added for RF */ double *B4SOIGgmPtr; @@ -704,7 +707,7 @@ typedef struct sB4SOIinstance #define B4SOIvggm B4SOIstates+ 30 /* #define B4SOIcqgmid B4SOIstates+ 31 */ /* Bug # 29 */ /* #define B4SOIqgmid B4SOIstates + 32 */ /* Bug # 29 */ -#define B4SOIqgmid B4SOIstates+ 31 /* Bug Fix # 29 Jul09*/ +#define B4SOIqgmid B4SOIstates+ 31 /* Bug Fix # 29 Jul09*/ #define B4SOIcqgmid B4SOIstates + 32 /* Bug Fix # 29 Jul09*/ /* v3.1 added or changed for RF end */ @@ -725,15 +728,15 @@ typedef struct sB4SOIinstance #define B4SOIRGNOIZ 2 #define B4SOIIDNOIZ 3 #define B4SOIFLNOIZ 4 -#define B4SOIFB_IBSNOIZ 5 /* v4.0 */ -#define B4SOIFB_IBDNOIZ 6 /* v4.0 */ -#define B4SOIIGSNOIZ 7 -#define B4SOIIGDNOIZ 8 -#define B4SOIIGBNOIZ 9 +#define B4SOIFB_IBSNOIZ 5 /* v4.0 */ +#define B4SOIFB_IBDNOIZ 6 /* v4.0 */ +#define B4SOIIGSNOIZ 7 +#define B4SOIIGDNOIZ 8 +#define B4SOIIGBNOIZ 9 #define B4SOIRBSBNOIZ 10 /* v4.0 */ #define B4SOIRBDBNOIZ 11 /* v4.0 */ #define B4SOIRBODYNOIZ 12 /* v4.0 */ -#define B4SOITOTNOIZ 13 /* v4.0 */ +#define B4SOITOTNOIZ 13 /* v4.0 */ #define B4SOINSRCS 14 /* Number of MOSFET(3) noise sources v3.2 */ @@ -767,7 +770,7 @@ struct b4soiSizeDependParam double B4SOInpeak; double B4SOInsub; double B4SOIngate; - double B4SOInsd; + double B4SOInsd; double B4SOIgamma1; double B4SOIgamma2; double B4SOIvbx; @@ -803,15 +806,15 @@ struct b4soiSizeDependParam double B4SOIuc1; double B4SOIu0; double B4SOIute; - /*4.1 high k mobility*/ - double B4SOIud; + /*4.1 high k mobility*/ + double B4SOIud; double B4SOIud1; double B4SOIeu; - double B4SOIucs; + double B4SOIucs; double B4SOIucste; - - - + + + double B4SOIvoff; double B4SOIvfb; double B4SOIuatemp; @@ -822,20 +825,20 @@ struct b4soiSizeDependParam double B4SOIcth; double B4SOIrds0denom; double B4SOIvfbb; - double B4SOIjbjts; /* v4.0 */ - double B4SOIjbjtd; /* v4.0 */ - double B4SOIjdifs; /* v4.0 */ - double B4SOIjdifd; /* v4.0 */ - double B4SOIjrecs; /* v4.0 */ - double B4SOIjrecd; /* v4.0 */ - double B4SOIjtuns; /* v4.0 */ - double B4SOIjtund; /* v4.0 */ - double B4SOIrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrd0; /* v4.0 for rdsMod = 1 */ - double B4SOIrs0; /* v4.0 for rdsMod = 1 */ + double B4SOIjbjts; /* v4.0 */ + double B4SOIjbjtd; /* v4.0 */ + double B4SOIjdifs; /* v4.0 */ + double B4SOIjdifd; /* v4.0 */ + double B4SOIjrecs; /* v4.0 */ + double B4SOIjrecd; /* v4.0 */ + double B4SOIjtuns; /* v4.0 */ + double B4SOIjtund; /* v4.0 */ + double B4SOIrdw; /* v4.0 for rdsMod = 1 */ + double B4SOIrsw; /* v4.0 for rdsMod = 1 */ + double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrd0; /* v4.0 for rdsMod = 1 */ + double B4SOIrs0; /* v4.0 for rdsMod = 1 */ double B4SOIsdt1; double B4SOIst2; double B4SOIst3; @@ -881,7 +884,7 @@ struct b4soiSizeDependParam /* v4.0 */ /* added for stress effect */ - double B4SOIku0; + double B4SOIku0; double B4SOIkvth0; double B4SOIku0temp; double B4SOIrho_ref; @@ -926,13 +929,13 @@ struct b4soiSizeDependParam double B4SOIk1w2; double B4SOIketas; double B4SOIfbjtii; - /*4.1 Iii model*/ + /*4.1 Iii model*/ double B4SOIebjtii; - double B4SOIcbjtii; - double B4SOIvbci; - double B4SOIabjtii; - double B4SOImbjtii; - + double B4SOIcbjtii; + double B4SOIvbci; + double B4SOIabjtii; + double B4SOImbjtii; + double B4SOIbeta1; double B4SOIbeta2; double B4SOIvdsatii0; @@ -946,20 +949,20 @@ struct b4soiSizeDependParam double B4SOIbgidl; double B4SOIcgidl; /* v4.0 */ double B4SOIegidl; - double B4SOIrgidl; - double B4SOIkgidl; - double B4SOIfgidl; - double B4SOIagisl; + double B4SOIrgidl; + double B4SOIkgidl; + double B4SOIfgidl; + double B4SOIagisl; double B4SOIbgisl; double B4SOIcgisl; /* v4.0 */ double B4SOIegisl; - double B4SOIrgisl; - double B4SOIkgisl; - double B4SOIfgisl; - - - double B4SOIntun; /* v4.0 */ - double B4SOIntund; /* v4.0 */ + double B4SOIrgisl; + double B4SOIkgisl; + double B4SOIfgisl; + + + double B4SOIntun; /* v4.0 */ + double B4SOIntund; /* v4.0 */ double B4SOIndiode; /* v4.0 */ double B4SOIndioded; /* v4.0 */ double B4SOInrecf0; /* v4.0 */ @@ -967,17 +970,17 @@ struct b4soiSizeDependParam double B4SOInrecr0; /* v4.0 */ double B4SOInrecr0d; /* v4.0 */ double B4SOIisbjt; - double B4SOIidbjt; /* v4.0 */ + double B4SOIidbjt; /* v4.0 */ double B4SOIisdif; - double B4SOIiddif; /* v4.0 */ + double B4SOIiddif; /* v4.0 */ double B4SOIisrec; - double B4SOIidrec; /* v4.0 */ + double B4SOIidrec; /* v4.0 */ double B4SOIistun; - double B4SOIidtun; /* v4.0 */ + double B4SOIidtun; /* v4.0 */ double B4SOIvrec0; /* v4.0 */ double B4SOIvrec0d; /* v4.0 */ - double B4SOIvtun0; /* v4.0 */ - double B4SOIvtun0d; /* v4.0 */ + double B4SOIvtun0; /* v4.0 */ + double B4SOIvtun0d; /* v4.0 */ double B4SOInbjt; double B4SOIlbjt0; double B4SOIvabjt; @@ -1031,10 +1034,10 @@ struct b4soiSizeDependParam double B4SOIlratio; double B4SOIlratiodif; double B4SOIvearly; - double B4SOIahli; /* v4.0 */ - double B4SOIahlid; /* v4.0 */ - double B4SOIahli0s; /* v4.0 */ - double B4SOIahli0d; /* v4.0 */ + double B4SOIahli; /* v4.0 */ + double B4SOIahlid; /* v4.0 */ + double B4SOIahli0s; /* v4.0 */ + double B4SOIahli0d; /* v4.0 */ double B4SOIvfbzb; double B4SOIldeb; double B4SOIacde; @@ -1058,11 +1061,11 @@ struct b4soiSizeDependParam double B4SOIBechvbEdge; double B4SOIvfbsd; /* v4.0 */ - double B4SOIk1ox; /* v4.0 for Vth */ - double B4SOIk2ox; /* v4.0 for Vth */ - double B4SOIlpeb; /* v4.0 for Vth */ - double B4SOIdvtp0; /* v4.0 for Vth */ - double B4SOIdvtp1; /* v4.0 for Vth */ + double B4SOIk1ox; /* v4.0 for Vth */ + double B4SOIk2ox; /* v4.0 for Vth */ + double B4SOIlpeb; /* v4.0 for Vth */ + double B4SOIdvtp0; /* v4.0 for Vth */ + double B4SOIdvtp1; /* v4.0 for Vth */ double B4SOIdvtp2; /* v4.1 for Vth */ double B4SOIdvtp3; /* v4.1 for Vth */ double B4SOIdvtp4; /* v4.1 for Vth */ @@ -1092,37 +1095,37 @@ typedef struct sB4SOImodel int B4SOImobMod; int B4SOIcapMod; - int B4SOIfnoiMod; /* v3.2 */ - int B4SOItnoiMod; /* v3.2 */ + int B4SOIfnoiMod; /* v3.2 */ + int B4SOItnoiMod; /* v3.2 */ int B4SOIshMod; int B4SOIbinUnit; int B4SOIparamChk; - int B4SOImtrlMod; /*4.1*/ - int B4SOIvgstcvMod; - int B4SOIgidlMod; - int B4SOIiiiMod; - + int B4SOImtrlMod; /*4.1*/ + int B4SOIvgstcvMod; + int B4SOIgidlMod; + int B4SOIiiiMod; + double B4SOIversion; - - double B4SOIeot; /*4.1*/ - double B4SOIepsrox; - double B4SOIepsrsub; - double B4SOItoxp; - double B4SOIleffeot; - double B4SOIweffeot; - double B4SOIvddeot; - double B4SOItempeot; - double B4SOIados; - double B4SOIbdos; - double B4SOIepsrgate; - double B4SOIni0sub; - double B4SOIbg0sub; - double B4SOItbgasub; - double B4SOItbgbsub; - double B4SOIphig; - double B4SOIeasub; + + double B4SOIeot; /*4.1*/ + double B4SOIepsrox; + double B4SOIepsrsub; + double B4SOItoxp; + double B4SOIleffeot; + double B4SOIweffeot; + double B4SOIvddeot; + double B4SOItempeot; + double B4SOIados; + double B4SOIbdos; + double B4SOIepsrgate; + double B4SOIni0sub; + double B4SOIbg0sub; + double B4SOItbgasub; + double B4SOItbgbsub; + double B4SOIphig; + double B4SOIeasub; double B4SOItvbci; - + double B4SOItox; double B4SOItoxm; /* v3.2 */ double B4SOIdtoxcv; /* v2.2.3 */ @@ -1144,7 +1147,7 @@ typedef struct sB4SOImodel double B4SOInsd; double B4SOIlnsd; double B4SOIwnsd; - double B4SOIpnsd; + double B4SOIpnsd; double B4SOIgamma1; double B4SOIgamma2; double B4SOIvbx; @@ -1176,39 +1179,39 @@ typedef struct sB4SOImodel double B4SOIuc1; double B4SOIu0; double B4SOIute; - /*4.1 high k mobility*/ + /*4.1 high k mobility*/ double B4SOIud; - double B4SOIlud; - double B4SOIwud; - double B4SOIpud; - - double B4SOIud1; - double B4SOIlud1; - double B4SOIwud1; - double B4SOIpud1; - + double B4SOIlud; + double B4SOIwud; + double B4SOIpud; + + double B4SOIud1; + double B4SOIlud1; + double B4SOIwud1; + double B4SOIpud1; + double B4SOIeu; - double B4SOIleu; - double B4SOIweu; - double B4SOIpeu; - - double B4SOIucs; - double B4SOIlucs; - double B4SOIwucs; - double B4SOIpucs; - - double B4SOIucste; - double B4SOIlucste; - double B4SOIwucste; - double B4SOIpucste; - + double B4SOIleu; + double B4SOIweu; + double B4SOIpeu; + + double B4SOIucs; + double B4SOIlucs; + double B4SOIwucs; + double B4SOIpucs; + + double B4SOIucste; + double B4SOIlucste; + double B4SOIwucste; + double B4SOIpucste; + double B4SOIvoff; double B4SOIdelta; double B4SOIrdsw; - double B4SOIrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrdw; /* v4.0 for rdsMod = 1 */ + double B4SOIrsw; /* v4.0 for rdsMod = 1 */ + double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ double B4SOIprwg; double B4SOIprwb; double B4SOIprt; @@ -1227,25 +1230,26 @@ typedef struct sB4SOImodel double B4SOIalpha0; double B4SOItbox; double B4SOItsi; - double B4SOIetsi; + double B4SOIetsi; double B4SOIxj; double B4SOIkb1; double B4SOIrth0; double B4SOIcth0; double B4SOIegidl; + double B4SOIcfrcoeff; /* v4.4 */ double B4SOIagidl; double B4SOIbgidl; - double B4SOIcgidl; /* v4.0 */ - double B4SOIrgidl; - double B4SOIkgidl; - double B4SOIfgidl; - double B4SOIegisl; + double B4SOIcgidl; /* v4.0 */ + double B4SOIrgidl; + double B4SOIkgidl; + double B4SOIfgidl; + double B4SOIegisl; double B4SOIagisl; double B4SOIbgisl; double B4SOIcgisl; - double B4SOIrgisl; - double B4SOIkgisl; - double B4SOIfgisl; + double B4SOIrgisl; + double B4SOIkgisl; + double B4SOIfgisl; double B4SOIndiode; /* v4.0 */ double B4SOIndioded; /* v4.0 */ double B4SOIistun; @@ -1312,7 +1316,7 @@ typedef struct sB4SOImodel double B4SOIgbmin; double B4SOIfrbody; - int B4SOIrdsMod; /* v4.0 */ + int B4SOIrdsMod; /* v4.0 */ /* v4.0 end */ /* v4.1 */ @@ -1324,7 +1328,7 @@ typedef struct sB4SOImodel double B4SOIlminvcv; double B4SOIwminvcv; double B4SOIpminvcv; - double B4SOIvoffcv; + double B4SOIvoffcv; double B4SOIlvoffcv; double B4SOIwvoffcv; double B4SOIpvoffcv; @@ -1370,38 +1374,38 @@ typedef struct sB4SOImodel double B4SOIsii2; double B4SOIsiid; double B4SOIfbjtii; - /*4.1 Iii model*/ + /*4.1 Iii model*/ double B4SOIebjtii; - double B4SOIcbjtii; - double B4SOIvbci; - double B4SOIabjtii; - double B4SOImbjtii; - + double B4SOIcbjtii; + double B4SOIvbci; + double B4SOIabjtii; + double B4SOImbjtii; + double B4SOIesatii; - double B4SOIntun; /* v4.0 */ - double B4SOIntund; /* v4.0 */ - double B4SOInrecf0; /* v4.0 */ - double B4SOInrecf0d; /* v4.0 */ - double B4SOInrecr0; /* v4.0 */ - double B4SOInrecr0d; /* v4.0 */ + double B4SOIntun; /* v4.0 */ + double B4SOIntund; /* v4.0 */ + double B4SOInrecf0; /* v4.0 */ + double B4SOInrecf0d; /* v4.0 */ + double B4SOInrecr0; /* v4.0 */ + double B4SOInrecr0d; /* v4.0 */ double B4SOIisbjt; - double B4SOIidbjt; /* v4.0 */ + double B4SOIidbjt; /* v4.0 */ double B4SOIisdif; - double B4SOIiddif; /* v4.0 */ + double B4SOIiddif; /* v4.0 */ double B4SOIisrec; - double B4SOIidrec; /* v4.0 */ + double B4SOIidrec; /* v4.0 */ double B4SOIln; - double B4SOIvrec0; /* v4.0 */ - double B4SOIvrec0d; /* v4.0 */ - double B4SOIvtun0; /* v4.0 */ - double B4SOIvtun0d; /* v4.0 */ + double B4SOIvrec0; /* v4.0 */ + double B4SOIvrec0d; /* v4.0 */ + double B4SOIvtun0; /* v4.0 */ + double B4SOIvtun0d; /* v4.0 */ double B4SOInbjt; double B4SOIlbjt0; double B4SOIldif0; double B4SOIvabjt; double B4SOIaely; - double B4SOIahli; /* v4.0 */ - double B4SOIahlid; /* v4.0 */ + double B4SOIahli; /* v4.0 */ + double B4SOIahlid; /* v4.0 */ double B4SOIrbody; double B4SOIrbsh; double B4SOItt; @@ -1410,7 +1414,7 @@ typedef struct sB4SOImodel double B4SOIvsdth; double B4SOIcsdmin; double B4SOIasd; - double B4SOIntrecf; + double B4SOIntrecf; double B4SOIntrecr; double B4SOIdlcb; double B4SOIfbody; @@ -1445,12 +1449,12 @@ typedef struct sB4SOImodel double B4SOIcFringMax; */ /* v4.2 never used in the code */ double B4SOIsheetResistance; - double B4SOIbodyJctGateSideSGradingCoeff; /* v4.0 */ - double B4SOIbodyJctGateSideDGradingCoeff; /* v4.0 */ - double B4SOIGatesidewallJctSPotential; /* v4.0 */ - double B4SOIGatesidewallJctDPotential; /* v4.0 */ - double B4SOIunitLengthGateSidewallJctCapS; /* v4.0 */ - double B4SOIunitLengthGateSidewallJctCapD; /* v4.0 */ + double B4SOIbodyJctGateSideSGradingCoeff; /* v4.0 */ + double B4SOIbodyJctGateSideDGradingCoeff; /* v4.0 */ + double B4SOIGatesidewallJctSPotential; /* v4.0 */ + double B4SOIGatesidewallJctDPotential; /* v4.0 */ + double B4SOIunitLengthGateSidewallJctCapS; /* v4.0 */ + double B4SOIunitLengthGateSidewallJctCapD; /* v4.0 */ double B4SOIcsdesw; double B4SOILint; @@ -1489,7 +1493,7 @@ typedef struct sB4SOImodel double B4SOIlbigbcp2; /* 4.1 */ double B4SOIlcigbcp2; /* 4.1 */ double B4SOIlndif; - double B4SOIlntrecf; + double B4SOIlntrecf; double B4SOIlntrecr; double B4SOIlxbjt; double B4SOIlxdif; @@ -1526,7 +1530,7 @@ typedef struct sB4SOImodel double B4SOIlnsub; double B4SOIlngate; double B4SOIlvth0; - double B4SOIlvfb; /* v4.1 */ + double B4SOIlvfb; /* v4.1 */ double B4SOIlk1; double B4SOIlk1w1; double B4SOIlk1w2; @@ -1581,13 +1585,13 @@ typedef struct sB4SOImodel double B4SOIldelta; double B4SOIlalpha0; double B4SOIlfbjtii; - /*4.1 Iii model*/ - double B4SOIlebjtii; - double B4SOIlcbjtii; - double B4SOIlvbci; - double B4SOIlabjtii; - double B4SOIlmbjtii; - + /*4.1 Iii model*/ + double B4SOIlebjtii; + double B4SOIlcbjtii; + double B4SOIlvbci; + double B4SOIlabjtii; + double B4SOIlmbjtii; + double B4SOIlbeta0; double B4SOIlbeta1; double B4SOIlbeta2; @@ -1602,28 +1606,28 @@ typedef struct sB4SOImodel double B4SOIlbgidl; double B4SOIlcgidl; double B4SOIlegidl; - double B4SOIlrgidl; - double B4SOIlkgidl; - double B4SOIlfgidl; - double B4SOIlagisl; + double B4SOIlrgidl; + double B4SOIlkgidl; + double B4SOIlfgidl; + double B4SOIlagisl; double B4SOIlbgisl; double B4SOIlcgisl; double B4SOIlegisl; - double B4SOIlrgisl; - double B4SOIlkgisl; - double B4SOIlfgisl; - double B4SOIlntun; /* v4.0 */ - double B4SOIlntund; /* v4.0 */ + double B4SOIlrgisl; + double B4SOIlkgisl; + double B4SOIlfgisl; + double B4SOIlntun; /* v4.0 */ + double B4SOIlntund; /* v4.0 */ double B4SOIlndiode; /* v4.0 */ double B4SOIlndioded; /* v4.0 */ - double B4SOIlnrecf0; /* v4.0 */ - double B4SOIlnrecf0d; /* v4.0 */ - double B4SOIlnrecr0; /* v4.0 */ - double B4SOIlnrecr0d; /* v4.0 */ + double B4SOIlnrecf0; /* v4.0 */ + double B4SOIlnrecf0d; /* v4.0 */ + double B4SOIlnrecr0; /* v4.0 */ + double B4SOIlnrecr0d; /* v4.0 */ double B4SOIlisbjt; double B4SOIlidbjt; /* v4.0 */ double B4SOIlisdif; - double B4SOIliddif; /* v4.0 */ + double B4SOIliddif; /* v4.0 */ double B4SOIlisrec; double B4SOIlidrec; /* v4.0 */ double B4SOIlistun; @@ -1636,8 +1640,8 @@ typedef struct sB4SOImodel double B4SOIllbjt0; double B4SOIlvabjt; double B4SOIlaely; - double B4SOIlahli; /* v4.0 */ - double B4SOIlahlid; /* v4.0 */ + double B4SOIlahli; /* v4.0 */ + double B4SOIlahlid; /* v4.0 */ /* v3.1 added for RF */ double B4SOIlxrcrg1; @@ -1700,7 +1704,7 @@ typedef struct sB4SOImodel double B4SOIwnsub; double B4SOIwngate; double B4SOIwvth0; - double B4SOIwvfb; /* v4.1 */ + double B4SOIwvfb; /* v4.1 */ double B4SOIwk1; double B4SOIwk1w1; double B4SOIwk1w2; @@ -1755,13 +1759,13 @@ typedef struct sB4SOImodel double B4SOIwdelta; double B4SOIwalpha0; double B4SOIwfbjtii; - /*4.1 Iii model*/ - double B4SOIwebjtii; - double B4SOIwcbjtii; - double B4SOIwvbci; - double B4SOIwabjtii; - double B4SOIwmbjtii; - + /*4.1 Iii model*/ + double B4SOIwebjtii; + double B4SOIwcbjtii; + double B4SOIwvbci; + double B4SOIwabjtii; + double B4SOIwmbjtii; + double B4SOIwbeta0; double B4SOIwbeta1; double B4SOIwbeta2; @@ -1776,42 +1780,42 @@ typedef struct sB4SOImodel double B4SOIwbgidl; double B4SOIwcgidl; double B4SOIwegidl; - double B4SOIwrgidl; - double B4SOIwkgidl; - double B4SOIwfgidl; - double B4SOIwagisl; + double B4SOIwrgidl; + double B4SOIwkgidl; + double B4SOIwfgidl; + double B4SOIwagisl; double B4SOIwbgisl; double B4SOIwcgisl; double B4SOIwegisl; - double B4SOIwrgisl; - double B4SOIwkgisl; - double B4SOIwfgisl; - double B4SOIwntun; /* v4.0 */ - double B4SOIwntund; /* v4.0 */ - double B4SOIwndiode; /* v4.0 */ - double B4SOIwndioded; /* v4.0 */ - double B4SOIwnrecf0; /* v4.0 */ - double B4SOIwnrecf0d; /* v4.0 */ - double B4SOIwnrecr0; /* v4.0 */ - double B4SOIwnrecr0d; /* v4.0 */ + double B4SOIwrgisl; + double B4SOIwkgisl; + double B4SOIwfgisl; + double B4SOIwntun; /* v4.0 */ + double B4SOIwntund; /* v4.0 */ + double B4SOIwndiode; /* v4.0 */ + double B4SOIwndioded; /* v4.0 */ + double B4SOIwnrecf0; /* v4.0 */ + double B4SOIwnrecf0d; /* v4.0 */ + double B4SOIwnrecr0; /* v4.0 */ + double B4SOIwnrecr0d; /* v4.0 */ double B4SOIwisbjt; - double B4SOIwidbjt; /* v4.0 */ + double B4SOIwidbjt; /* v4.0 */ double B4SOIwisdif; - double B4SOIwiddif; /* v4.0 */ + double B4SOIwiddif; /* v4.0 */ double B4SOIwisrec; double B4SOIwidrec; /* v4.0 */ double B4SOIwistun; double B4SOIwidtun; /* v4.0 */ - double B4SOIwvrec0; /* v4.0 */ - double B4SOIwvrec0d; /* v4.0 */ + double B4SOIwvrec0; /* v4.0 */ + double B4SOIwvrec0d; /* v4.0 */ double B4SOIwvtun0; /* v4.0 */ double B4SOIwvtun0d; /* v4.0 */ double B4SOIwnbjt; double B4SOIwlbjt0; double B4SOIwvabjt; double B4SOIwaely; - double B4SOIwahli; /* v4.0 */ - double B4SOIwahlid; /* v4.0 */ + double B4SOIwahli; /* v4.0 */ + double B4SOIwahlid; /* v4.0 */ /* v3.1 added for RF */ double B4SOIwxrcrg1; @@ -1929,13 +1933,13 @@ typedef struct sB4SOImodel double B4SOIpdelta; double B4SOIpalpha0; double B4SOIpfbjtii; - /*4.1 Iii model*/ - double B4SOIpebjtii; - double B4SOIpcbjtii; - double B4SOIpvbci; - double B4SOIpabjtii; - double B4SOIpmbjtii; - + /*4.1 Iii model*/ + double B4SOIpebjtii; + double B4SOIpcbjtii; + double B4SOIpvbci; + double B4SOIpabjtii; + double B4SOIpmbjtii; + double B4SOIpbeta0; double B4SOIpbeta1; double B4SOIpbeta2; @@ -1950,28 +1954,28 @@ typedef struct sB4SOImodel double B4SOIpbgidl; double B4SOIpcgidl; double B4SOIpegidl; - double B4SOIprgidl; - double B4SOIpkgidl; - double B4SOIpfgidl; - double B4SOIpagisl; + double B4SOIprgidl; + double B4SOIpkgidl; + double B4SOIpfgidl; + double B4SOIpagisl; double B4SOIpbgisl; double B4SOIpcgisl; double B4SOIpegisl; - double B4SOIprgisl; - double B4SOIpkgisl; - double B4SOIpfgisl; - double B4SOIpntun; /* v4.0 */ - double B4SOIpntund; /* v4.0 */ - double B4SOIpndiode; /* v4.0 */ - double B4SOIpndioded; /* v4.0 */ - double B4SOIpnrecf0; /* v4.0 */ - double B4SOIpnrecf0d; /* v4.0 */ - double B4SOIpnrecr0; /* v4.0 */ - double B4SOIpnrecr0d; /* v4.0 */ + double B4SOIprgisl; + double B4SOIpkgisl; + double B4SOIpfgisl; + double B4SOIpntun; /* v4.0 */ + double B4SOIpntund; /* v4.0 */ + double B4SOIpndiode; /* v4.0 */ + double B4SOIpndioded; /* v4.0 */ + double B4SOIpnrecf0; /* v4.0 */ + double B4SOIpnrecf0d; /* v4.0 */ + double B4SOIpnrecr0; /* v4.0 */ + double B4SOIpnrecr0d; /* v4.0 */ double B4SOIpisbjt; double B4SOIpidbjt; /* v4.0 */ double B4SOIpisdif; - double B4SOIpiddif; /* v4.0 */ + double B4SOIpiddif; /* v4.0 */ double B4SOIpisrec; double B4SOIpidrec; /* v4.0 */ double B4SOIpistun; @@ -1984,8 +1988,8 @@ typedef struct sB4SOImodel double B4SOIplbjt0; double B4SOIpvabjt; double B4SOIpaely; - double B4SOIpahli; /* v4.0 */ - double B4SOIpahlid; /* v4.0 */ + double B4SOIpahli; /* v4.0 */ + double B4SOIpahlid; /* v4.0 */ /* v3.1 added for RF */ double B4SOIpxrcrg1; double B4SOIpxrcrg2; @@ -2008,7 +2012,7 @@ typedef struct sB4SOImodel double B4SOInfb; double B4SOIadice */ /* v4.2 never used in the code */ double B4SOIeg0; - double B4SOIeg; /* Jun 09*/ + double B4SOIeg; /* Jun 09*/ /* v4.0 added for stress effect */ double B4SOIsaref; @@ -2052,20 +2056,20 @@ typedef struct sB4SOImodel double B4SOIaf; double B4SOIkf; double B4SOInoif; - double B4SOIbf; /* v4.0 for noise */ - double B4SOIw0flk; /* v4.0 for noise */ - double B4SOIlpeb; /* v4.0 for Vth */ - double B4SOIllpeb; /* v4.0 for Vth */ - double B4SOIwlpeb; /* v4.0 for Vth */ - double B4SOIplpeb; /* v4.0 for Vth */ - double B4SOIdvtp0; /* v4.0 for Vth */ - double B4SOIldvtp0; /* v4.0 for Vth */ - double B4SOIwdvtp0; /* v4.0 for Vth */ - double B4SOIpdvtp0; /* v4.0 for Vth */ - double B4SOIdvtp1; /* v4.0 for Vth */ - double B4SOIldvtp1; /* v4.0 for Vth */ - double B4SOIwdvtp1; /* v4.0 for Vth */ - double B4SOIpdvtp1; /* v4.0 for Vth */ + double B4SOIbf; /* v4.0 for noise */ + double B4SOIw0flk; /* v4.0 for noise */ + double B4SOIlpeb; /* v4.0 for Vth */ + double B4SOIllpeb; /* v4.0 for Vth */ + double B4SOIwlpeb; /* v4.0 for Vth */ + double B4SOIplpeb; /* v4.0 for Vth */ + double B4SOIdvtp0; /* v4.0 for Vth */ + double B4SOIldvtp0; /* v4.0 for Vth */ + double B4SOIwdvtp0; /* v4.0 for Vth */ + double B4SOIpdvtp0; /* v4.0 for Vth */ + double B4SOIdvtp1; /* v4.0 for Vth */ + double B4SOIldvtp1; /* v4.0 for Vth */ + double B4SOIwdvtp1; /* v4.0 for Vth */ + double B4SOIpdvtp1; /* v4.0 for Vth */ double B4SOIdvtp2; /* v4.1 for Vth */ double B4SOIldvtp2; /* v4.1 for Vth */ double B4SOIwdvtp2; /* v4.1 for Vth */ @@ -2078,10 +2082,10 @@ typedef struct sB4SOImodel double B4SOIldvtp4; /* v4.1 for Vth */ double B4SOIwdvtp4; /* v4.1 for Vth */ double B4SOIpdvtp4; /* v4.1 for Vth */ - double B4SOIminv; /* v4.0 for Vgsteff */ - double B4SOIlminv; /* v4.0 for Vgsteff */ - double B4SOIwminv; /* v4.0 for Vgsteff */ - double B4SOIpminv; /* v4.0 for Vgsteff */ + double B4SOIminv; /* v4.0 for Vgsteff */ + double B4SOIlminv; /* v4.0 for Vgsteff */ + double B4SOIwminv; /* v4.0 for Vgsteff */ + double B4SOIpminv; /* v4.0 for Vgsteff */ double B4SOIfprout; /* v4.0 for DITS in Id */ double B4SOIlfprout; /* v4.0 for DITS in Id */ double B4SOIwfprout; /* v4.0 for DITS in Id */ @@ -2115,26 +2119,25 @@ typedef struct sB4SOImodel struct b4soiSizeDependParam *pSizeDependParamKnot; - #ifdef USE_OMP4SOI int B4SOIInstCount; struct sB4SOIinstance **B4SOIInstanceArray; #endif /* Flags */ - unsigned B4SOIepsrgateGiven:1; - unsigned B4SOIadosGiven :1; - unsigned B4SOIbdosGiven :1; - unsigned B4SOIleffeotGiven :1; - unsigned B4SOIweffeotGiven :1; - unsigned B4SOIvddeotGiven :1; - unsigned B4SOItempeotGiven :1; - - unsigned B4SOItoxpGiven :1; + unsigned B4SOIepsrgateGiven:1; + unsigned B4SOIadosGiven :1; + unsigned B4SOIbdosGiven :1; + unsigned B4SOIleffeotGiven :1; + unsigned B4SOIweffeotGiven :1; + unsigned B4SOIvddeotGiven :1; + unsigned B4SOItempeotGiven :1; + + unsigned B4SOItoxpGiven :1; unsigned B4SOImtrlModGiven :1; /*4.1*/ - unsigned B4SOIvgstcvModGiven :1; - unsigned B4SOIgidlModGiven :1; - unsigned B4SOIiiiModGiven :1; + unsigned B4SOIvgstcvModGiven :1; + unsigned B4SOIgidlModGiven :1; + unsigned B4SOIiiiModGiven :1; unsigned B4SOIrdsModGiven :1; /* v4.0 */ unsigned B4SOIrbodyModGiven :1; /* v4.0 */ unsigned B4SOIrgateModGiven :1; /* v3.1 */ @@ -2156,25 +2159,26 @@ typedef struct sB4SOImodel unsigned B4SOItboxGiven:1; unsigned B4SOItsiGiven :1; - unsigned B4SOIetsiGiven :1; + unsigned B4SOIetsiGiven :1; unsigned B4SOIxjGiven :1; unsigned B4SOIkb1Given :1; unsigned B4SOIrth0Given :1; unsigned B4SOIcth0Given :1; + unsigned B4SOIcfrcoeffGiven :1; /* v4.4 */ unsigned B4SOIegidlGiven :1; unsigned B4SOIagidlGiven :1; unsigned B4SOIbgidlGiven :1; unsigned B4SOIcgidlGiven :1; - unsigned B4SOIrgidlGiven :1; - unsigned B4SOIkgidlGiven :1; - unsigned B4SOIfgidlGiven :1; - unsigned B4SOIegislGiven :1; + unsigned B4SOIrgidlGiven :1; + unsigned B4SOIkgidlGiven :1; + unsigned B4SOIfgidlGiven :1; + unsigned B4SOIegislGiven :1; unsigned B4SOIagislGiven :1; unsigned B4SOIbgislGiven :1; unsigned B4SOIcgislGiven :1; - unsigned B4SOIrgislGiven :1; - unsigned B4SOIkgislGiven :1; - unsigned B4SOIfgislGiven :1; + unsigned B4SOIrgislGiven :1; + unsigned B4SOIkgislGiven :1; + unsigned B4SOIfgislGiven :1; unsigned B4SOIndiodeGiven :1; /* v4.0 */ unsigned B4SOIndiodedGiven :1; /* v4.0 */ unsigned B4SOIxbjtGiven :1; @@ -2217,7 +2221,7 @@ typedef struct sB4SOImodel unsigned B4SOInsubGiven :1; unsigned B4SOInpeakGiven :1; unsigned B4SOIngateGiven :1; - unsigned B4SOInsdGiven :1; + unsigned B4SOInsdGiven :1; unsigned B4SOIgamma1Given :1; unsigned B4SOIgamma2Given :1; unsigned B4SOIvbxGiven :1; @@ -2249,38 +2253,38 @@ typedef struct sB4SOImodel unsigned B4SOIuc1Given :1; unsigned B4SOIu0Given :1; unsigned B4SOIuteGiven :1; - /*4.1 mobmod=4*/ - unsigned B4SOIudGiven :1; - unsigned B4SOIludGiven :1; - unsigned B4SOIwudGiven :1; - unsigned B4SOIpudGiven :1; - - unsigned B4SOIud1Given :1; - unsigned B4SOIlud1Given :1; - unsigned B4SOIwud1Given :1; - unsigned B4SOIpud1Given :1; - - unsigned B4SOIeuGiven :1; - unsigned B4SOIleuGiven :1; - unsigned B4SOIweuGiven :1; - unsigned B4SOIpeuGiven :1; - - unsigned B4SOIucsGiven :1; - unsigned B4SOIlucsGiven :1; - unsigned B4SOIwucsGiven :1; - unsigned B4SOIpucsGiven :1; - - unsigned B4SOIucsteGiven :1; - unsigned B4SOIlucsteGiven:1; - unsigned B4SOIwucsteGiven:1; - unsigned B4SOIpucsteGiven:1; - + /*4.1 mobmod=4*/ + unsigned B4SOIudGiven :1; + unsigned B4SOIludGiven :1; + unsigned B4SOIwudGiven :1; + unsigned B4SOIpudGiven :1; + + unsigned B4SOIud1Given :1; + unsigned B4SOIlud1Given :1; + unsigned B4SOIwud1Given :1; + unsigned B4SOIpud1Given :1; + + unsigned B4SOIeuGiven :1; + unsigned B4SOIleuGiven :1; + unsigned B4SOIweuGiven :1; + unsigned B4SOIpeuGiven :1; + + unsigned B4SOIucsGiven :1; + unsigned B4SOIlucsGiven :1; + unsigned B4SOIwucsGiven :1; + unsigned B4SOIpucsGiven :1; + + unsigned B4SOIucsteGiven :1; + unsigned B4SOIlucsteGiven:1; + unsigned B4SOIwucsteGiven:1; + unsigned B4SOIpucsteGiven:1; + unsigned B4SOIvoffGiven :1; unsigned B4SOIrdswGiven :1; - unsigned B4SOIrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrswGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrdwminGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIrswminGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIrdwGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIrswGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIrdwminGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIrswminGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIprwgGiven :1; unsigned B4SOIprwbGiven :1; unsigned B4SOIprtGiven :1; @@ -2298,49 +2302,49 @@ typedef struct sB4SOImodel unsigned B4SOIb0Given :1; unsigned B4SOIb1Given :1; unsigned B4SOIalpha0Given :1; - - - /*4.1*/ - unsigned B4SOIepsroxGiven :1; + + + /*4.1*/ + unsigned B4SOIepsroxGiven :1; unsigned B4SOIeotGiven :1; - unsigned B4SOIepsrsubGiven :1; + unsigned B4SOIepsrsubGiven :1; unsigned B4SOIni0subGiven :1; - unsigned B4SOIbg0subGiven :1; - unsigned B4SOItbgasubGiven:1; - unsigned B4SOItbgbsubGiven:1; - unsigned B4SOIphigGiven :1; - unsigned B4SOIeasubGiven :1; + unsigned B4SOIbg0subGiven :1; + unsigned B4SOItbgasubGiven:1; + unsigned B4SOItbgbsubGiven:1; + unsigned B4SOIphigGiven :1; + unsigned B4SOIeasubGiven :1; /* v3.1 added for RF */ unsigned B4SOIxrcrg1Given :1; unsigned B4SOIxrcrg2Given :1; - unsigned B4SOIrshgGiven :1; - unsigned B4SOIngconGiven :1; - unsigned B4SOIxgwGiven :1; - unsigned B4SOIxglGiven :1; + unsigned B4SOIrshgGiven :1; + unsigned B4SOIngconGiven :1; + unsigned B4SOIxgwGiven :1; + unsigned B4SOIxglGiven :1; /* v3.1 added for RF end */ /* v3.2 */ - unsigned B4SOIfnoiModGiven :1; + unsigned B4SOIfnoiModGiven :1; unsigned B4SOItnoiModGiven :1; - unsigned B4SOItnoiaGiven :1; - unsigned B4SOItnoibGiven :1; - unsigned B4SOIrnoiaGiven :1; - unsigned B4SOIrnoibGiven :1; - unsigned B4SOIntnoiGiven :1; + unsigned B4SOItnoiaGiven :1; + unsigned B4SOItnoibGiven :1; + unsigned B4SOIrnoiaGiven :1; + unsigned B4SOIrnoibGiven :1; + unsigned B4SOIntnoiGiven :1; /* v3.2 end */ /* v4.0 */ unsigned B4SOIvfbGiven :1; - unsigned B4SOIgbminGiven :1; - unsigned B4SOIrbdbGiven :1; - unsigned B4SOIrbsbGiven :1; + unsigned B4SOIgbminGiven :1; + unsigned B4SOIrbdbGiven :1; + unsigned B4SOIrbsbGiven :1; /* v4.0 end */ /* v4.1 */ unsigned B4SOIfdModGiven :1; - unsigned B4SOIvsceGiven :1; + unsigned B4SOIvsceGiven :1; unsigned B4SOIcdsbsGiven :1; - unsigned B4SOIminvcvGiven :1; + unsigned B4SOIminvcvGiven :1; unsigned B4SOIlminvcvGiven :1; unsigned B4SOIwminvcvGiven :1; unsigned B4SOIpminvcvGiven :1; @@ -2393,51 +2397,51 @@ typedef struct sB4SOImodel unsigned B4SOIbeta2Given :1; unsigned B4SOIvdsatii0Given :1; unsigned B4SOItiiGiven :1; - unsigned B4SOItvbciGiven :1; + unsigned B4SOItvbciGiven :1; unsigned B4SOIliiGiven :1; unsigned B4SOIsii0Given :1; unsigned B4SOIsii1Given :1; unsigned B4SOIsii2Given :1; unsigned B4SOIsiidGiven :1; unsigned B4SOIfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIebjtiiGiven :1; - unsigned B4SOIcbjtiiGiven :1; - unsigned B4SOIvbciGiven :1; - unsigned B4SOIabjtiiGiven :1; - unsigned B4SOImbjtiiGiven :1; - + /*4.1 Iii model*/ + unsigned B4SOIebjtiiGiven :1; + unsigned B4SOIcbjtiiGiven :1; + unsigned B4SOIvbciGiven :1; + unsigned B4SOIabjtiiGiven :1; + unsigned B4SOImbjtiiGiven :1; + unsigned B4SOIesatiiGiven :1; unsigned B4SOIntunGiven :1; /* v4.0 */ unsigned B4SOIntundGiven :1; /* v4.0 */ - unsigned B4SOInrecf0Given :1; /* v4.0 */ - unsigned B4SOInrecf0dGiven :1; /* v4.0 */ - unsigned B4SOInrecr0Given :1; /* v4.0 */ - unsigned B4SOInrecr0dGiven :1; /* v4.0 */ + unsigned B4SOInrecf0Given :1; /* v4.0 */ + unsigned B4SOInrecf0dGiven :1; /* v4.0 */ + unsigned B4SOInrecr0Given :1; /* v4.0 */ + unsigned B4SOInrecr0dGiven :1; /* v4.0 */ unsigned B4SOIisbjtGiven :1; - unsigned B4SOIidbjtGiven :1; /* v4.0 */ + unsigned B4SOIidbjtGiven :1; /* v4.0 */ unsigned B4SOIisdifGiven :1; - unsigned B4SOIiddifGiven :1; /* v4.0 */ + unsigned B4SOIiddifGiven :1; /* v4.0 */ unsigned B4SOIisrecGiven :1; - unsigned B4SOIidrecGiven :1; /* v4.0 */ + unsigned B4SOIidrecGiven :1; /* v4.0 */ unsigned B4SOIistunGiven :1; - unsigned B4SOIidtunGiven :1; /* v4.0 */ + unsigned B4SOIidtunGiven :1; /* v4.0 */ unsigned B4SOIlnGiven :1; - unsigned B4SOIvrec0Given :1; /* v4.0 */ - unsigned B4SOIvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIvtun0Given :1; /* v4.0 */ - unsigned B4SOIvtun0dGiven :1; /* v4.0 */ + unsigned B4SOIvrec0Given :1; /* v4.0 */ + unsigned B4SOIvrec0dGiven :1; /* v4.0 */ + unsigned B4SOIvtun0Given :1; /* v4.0 */ + unsigned B4SOIvtun0dGiven :1; /* v4.0 */ unsigned B4SOInbjtGiven :1; unsigned B4SOIlbjt0Given :1; unsigned B4SOIldif0Given :1; unsigned B4SOIvabjtGiven :1; unsigned B4SOIaelyGiven :1; - unsigned B4SOIahliGiven :1; /* v4.0 */ - unsigned B4SOIahlidGiven :1; /* v4.0 */ + unsigned B4SOIahliGiven :1; /* v4.0 */ + unsigned B4SOIahlidGiven :1; /* v4.0 */ unsigned B4SOIrbodyGiven :1; unsigned B4SOIrbshGiven :1; unsigned B4SOIndifGiven :1; - unsigned B4SOIntrecfGiven :1; + unsigned B4SOIntrecfGiven :1; unsigned B4SOIntrecrGiven :1; unsigned B4SOIdlcbGiven :1; unsigned B4SOIfbodyGiven :1; @@ -2510,7 +2514,7 @@ typedef struct sB4SOImodel unsigned B4SOIlnpeakGiven :1; unsigned B4SOIlnsubGiven :1; unsigned B4SOIlngateGiven :1; - unsigned B4SOIlnsdGiven :1; + unsigned B4SOIlnsdGiven :1; unsigned B4SOIlvth0Given :1; unsigned B4SOIlvfbGiven :1; /* v4.1 */ unsigned B4SOIlk1Given :1; @@ -2542,8 +2546,8 @@ typedef struct sB4SOImodel unsigned B4SOIla1Given :1; unsigned B4SOIla2Given :1; unsigned B4SOIlrdswGiven :1; - unsigned B4SOIlrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIlrswGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIlrdwGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIlrswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIlprwbGiven :1; unsigned B4SOIlprwgGiven :1; unsigned B4SOIlwrGiven :1; @@ -2567,13 +2571,13 @@ typedef struct sB4SOImodel unsigned B4SOIldeltaGiven :1; unsigned B4SOIlalpha0Given :1; unsigned B4SOIlfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIlebjtiiGiven :1; - unsigned B4SOIlcbjtiiGiven :1; - unsigned B4SOIlvbciGiven :1; - unsigned B4SOIlabjtiiGiven :1; - unsigned B4SOIlmbjtiiGiven :1; - + /*4.1 Iii model*/ + unsigned B4SOIlebjtiiGiven :1; + unsigned B4SOIlcbjtiiGiven :1; + unsigned B4SOIlvbciGiven :1; + unsigned B4SOIlabjtiiGiven :1; + unsigned B4SOIlmbjtiiGiven :1; + unsigned B4SOIlbeta0Given :1; unsigned B4SOIlbeta1Given :1; unsigned B4SOIlbeta2Given :1; @@ -2588,42 +2592,42 @@ typedef struct sB4SOImodel unsigned B4SOIlbgidlGiven :1; unsigned B4SOIlcgidlGiven :1; unsigned B4SOIlegidlGiven :1; - unsigned B4SOIlrgidlGiven :1; - unsigned B4SOIlkgidlGiven :1; - unsigned B4SOIlfgidlGiven :1; - unsigned B4SOIlagislGiven :1; + unsigned B4SOIlrgidlGiven :1; + unsigned B4SOIlkgidlGiven :1; + unsigned B4SOIlfgidlGiven :1; + unsigned B4SOIlagislGiven :1; unsigned B4SOIlbgislGiven :1; unsigned B4SOIlcgislGiven :1; unsigned B4SOIlegislGiven :1; - unsigned B4SOIlrgislGiven :1; - unsigned B4SOIlkgislGiven :1; - unsigned B4SOIlfgislGiven :1; - unsigned B4SOIlntunGiven :1; /* v4.0 */ - unsigned B4SOIlntundGiven :1; /* v4.0 */ - unsigned B4SOIlndiodeGiven :1; /* v4.0 */ - unsigned B4SOIlndiodedGiven :1; /* v4.0 */ - unsigned B4SOIlnrecf0Given :1; /* v4.0 */ - unsigned B4SOIlnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIlnrecr0Given :1; /* v4.0 */ - unsigned B4SOIlnrecr0dGiven :1; /* v4.0 */ + unsigned B4SOIlrgislGiven :1; + unsigned B4SOIlkgislGiven :1; + unsigned B4SOIlfgislGiven :1; + unsigned B4SOIlntunGiven :1; /* v4.0 */ + unsigned B4SOIlntundGiven :1; /* v4.0 */ + unsigned B4SOIlndiodeGiven :1; /* v4.0 */ + unsigned B4SOIlndiodedGiven :1; /* v4.0 */ + unsigned B4SOIlnrecf0Given :1; /* v4.0 */ + unsigned B4SOIlnrecf0dGiven :1; /* v4.0 */ + unsigned B4SOIlnrecr0Given :1; /* v4.0 */ + unsigned B4SOIlnrecr0dGiven :1; /* v4.0 */ unsigned B4SOIlisbjtGiven :1; unsigned B4SOIlidbjtGiven :1; /* v4.0 */ unsigned B4SOIlisdifGiven :1; - unsigned B4SOIliddifGiven :1; /* v4.0 */ + unsigned B4SOIliddifGiven :1; /* v4.0 */ unsigned B4SOIlisrecGiven :1; unsigned B4SOIlidrecGiven :1; /* v4.0 */ unsigned B4SOIlistunGiven :1; unsigned B4SOIlidtunGiven :1; /* v4.0 */ - unsigned B4SOIlvrec0Given :1; /* v4.0 */ - unsigned B4SOIlvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIlvtun0Given :1; /* v4.0 */ - unsigned B4SOIlvtun0dGiven :1; /* v4.0 */ + unsigned B4SOIlvrec0Given :1; /* v4.0 */ + unsigned B4SOIlvrec0dGiven :1; /* v4.0 */ + unsigned B4SOIlvtun0Given :1; /* v4.0 */ + unsigned B4SOIlvtun0dGiven :1; /* v4.0 */ unsigned B4SOIlnbjtGiven :1; unsigned B4SOIllbjt0Given :1; unsigned B4SOIlvabjtGiven :1; unsigned B4SOIlaelyGiven :1; - unsigned B4SOIlahliGiven :1; /* v4.0 */ - unsigned B4SOIlahlidGiven :1; /* v4.0 */ + unsigned B4SOIlahliGiven :1; /* v4.0 */ + unsigned B4SOIlahlidGiven :1; /* v4.0 */ /* v3.1 added for RF */ unsigned B4SOIlxrcrg1Given :1; unsigned B4SOIlxrcrg2Given :1; @@ -2684,7 +2688,7 @@ typedef struct sB4SOImodel unsigned B4SOIwnpeakGiven :1; unsigned B4SOIwnsubGiven :1; unsigned B4SOIwngateGiven :1; - unsigned B4SOIwnsdGiven :1; + unsigned B4SOIwnsdGiven :1; unsigned B4SOIwvth0Given :1; unsigned B4SOIwvfbGiven :1; /* v4.1 */ unsigned B4SOIwk1Given :1; @@ -2716,8 +2720,8 @@ typedef struct sB4SOImodel unsigned B4SOIwa1Given :1; unsigned B4SOIwa2Given :1; unsigned B4SOIwrdswGiven :1; - unsigned B4SOIwrdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIwrswGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIwrdwGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIwrswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIwprwbGiven :1; unsigned B4SOIwprwgGiven :1; unsigned B4SOIwwrGiven :1; @@ -2741,13 +2745,13 @@ typedef struct sB4SOImodel unsigned B4SOIwdeltaGiven :1; unsigned B4SOIwalpha0Given :1; unsigned B4SOIwfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIwebjtiiGiven :1; - unsigned B4SOIwcbjtiiGiven :1; - unsigned B4SOIwvbciGiven :1; - unsigned B4SOIwabjtiiGiven :1; - unsigned B4SOIwmbjtiiGiven :1; - + /*4.1 Iii model*/ + unsigned B4SOIwebjtiiGiven :1; + unsigned B4SOIwcbjtiiGiven :1; + unsigned B4SOIwvbciGiven :1; + unsigned B4SOIwabjtiiGiven :1; + unsigned B4SOIwmbjtiiGiven :1; + unsigned B4SOIwbeta0Given :1; unsigned B4SOIwbeta1Given :1; unsigned B4SOIwbeta2Given :1; @@ -2762,42 +2766,42 @@ typedef struct sB4SOImodel unsigned B4SOIwbgidlGiven :1; unsigned B4SOIwcgidlGiven :1; unsigned B4SOIwegidlGiven :1; - unsigned B4SOIwrgidlGiven :1; - unsigned B4SOIwkgidlGiven :1; - unsigned B4SOIwfgidlGiven :1; - unsigned B4SOIwagislGiven :1; + unsigned B4SOIwrgidlGiven :1; + unsigned B4SOIwkgidlGiven :1; + unsigned B4SOIwfgidlGiven :1; + unsigned B4SOIwagislGiven :1; unsigned B4SOIwbgislGiven :1; unsigned B4SOIwcgislGiven :1; unsigned B4SOIwegislGiven :1; - unsigned B4SOIwrgislGiven :1; - unsigned B4SOIwkgislGiven :1; - unsigned B4SOIwfgislGiven :1; - unsigned B4SOIwntunGiven :1; /* v4.0 */ - unsigned B4SOIwntundGiven :1; /* v4.0 */ - unsigned B4SOIwndiodeGiven :1; /* v4.0 */ - unsigned B4SOIwndiodedGiven :1; /* v4.0 */ - unsigned B4SOIwnrecf0Given :1; /* v4.0 */ - unsigned B4SOIwnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIwnrecr0Given :1; /* v4.0 */ - unsigned B4SOIwnrecr0dGiven :1; /* v4.0 */ + unsigned B4SOIwrgislGiven :1; + unsigned B4SOIwkgislGiven :1; + unsigned B4SOIwfgislGiven :1; + unsigned B4SOIwntunGiven :1; /* v4.0 */ + unsigned B4SOIwntundGiven :1; /* v4.0 */ + unsigned B4SOIwndiodeGiven :1; /* v4.0 */ + unsigned B4SOIwndiodedGiven :1; /* v4.0 */ + unsigned B4SOIwnrecf0Given :1; /* v4.0 */ + unsigned B4SOIwnrecf0dGiven :1; /* v4.0 */ + unsigned B4SOIwnrecr0Given :1; /* v4.0 */ + unsigned B4SOIwnrecr0dGiven :1; /* v4.0 */ unsigned B4SOIwisbjtGiven :1; unsigned B4SOIwidbjtGiven :1; /* v4.0 */ unsigned B4SOIwisdifGiven :1; - unsigned B4SOIwiddifGiven :1; /* v4.0 */ + unsigned B4SOIwiddifGiven :1; /* v4.0 */ unsigned B4SOIwisrecGiven :1; unsigned B4SOIwidrecGiven :1; /* v4.0 */ unsigned B4SOIwistunGiven :1; unsigned B4SOIwidtunGiven :1; /* v4.0 */ - unsigned B4SOIwvrec0Given :1; /* v4.0 */ - unsigned B4SOIwvrec0dGiven :1; /* v4.0 */ - unsigned B4SOIwvtun0Given :1; /* v4.0 */ - unsigned B4SOIwvtun0dGiven :1; /* v4.0 */ + unsigned B4SOIwvrec0Given :1; /* v4.0 */ + unsigned B4SOIwvrec0dGiven :1; /* v4.0 */ + unsigned B4SOIwvtun0Given :1; /* v4.0 */ + unsigned B4SOIwvtun0dGiven :1; /* v4.0 */ unsigned B4SOIwnbjtGiven :1; unsigned B4SOIwlbjt0Given :1; unsigned B4SOIwvabjtGiven :1; unsigned B4SOIwaelyGiven :1; - unsigned B4SOIwahliGiven :1; /* v4.0 */ - unsigned B4SOIwahlidGiven :1; /* v4.0 */ + unsigned B4SOIwahliGiven :1; /* v4.0 */ + unsigned B4SOIwahlidGiven :1; /* v4.0 */ /* v3.1 added for RF */ unsigned B4SOIwxrcrg1Given :1; unsigned B4SOIwxrcrg2Given :1; @@ -2858,7 +2862,7 @@ typedef struct sB4SOImodel unsigned B4SOIpnpeakGiven :1; unsigned B4SOIpnsubGiven :1; unsigned B4SOIpngateGiven :1; - unsigned B4SOIpnsdGiven :1; + unsigned B4SOIpnsdGiven :1; unsigned B4SOIpvth0Given :1; unsigned B4SOIpvfbGiven :1; /* v4.1 */ unsigned B4SOIpk1Given :1; @@ -2890,8 +2894,8 @@ typedef struct sB4SOImodel unsigned B4SOIpa1Given :1; unsigned B4SOIpa2Given :1; unsigned B4SOIprdswGiven :1; - unsigned B4SOIprdwGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIprswGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIprdwGiven :1; /* v4.0 for rdsMod = 1 */ + unsigned B4SOIprswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIpprwbGiven :1; unsigned B4SOIpprwgGiven :1; unsigned B4SOIpwrGiven :1; @@ -2915,13 +2919,13 @@ typedef struct sB4SOImodel unsigned B4SOIpdeltaGiven :1; unsigned B4SOIpalpha0Given :1; unsigned B4SOIpfbjtiiGiven :1; - /*4.1 Iii model*/ - unsigned B4SOIpebjtiiGiven :1; - unsigned B4SOIpcbjtiiGiven :1; - unsigned B4SOIpvbciGiven :1; - unsigned B4SOIpabjtiiGiven :1; - unsigned B4SOIpmbjtiiGiven :1; - + /*4.1 Iii model*/ + unsigned B4SOIpebjtiiGiven :1; + unsigned B4SOIpcbjtiiGiven :1; + unsigned B4SOIpvbciGiven :1; + unsigned B4SOIpabjtiiGiven :1; + unsigned B4SOIpmbjtiiGiven :1; + unsigned B4SOIpbeta0Given :1; unsigned B4SOIpbeta1Given :1; unsigned B4SOIpbeta2Given :1; @@ -2936,28 +2940,28 @@ typedef struct sB4SOImodel unsigned B4SOIpbgidlGiven :1; unsigned B4SOIpcgidlGiven :1; unsigned B4SOIpegidlGiven :1; - unsigned B4SOIprgidlGiven :1; - unsigned B4SOIpkgidlGiven :1; - unsigned B4SOIpfgidlGiven :1; - unsigned B4SOIpagislGiven :1; + unsigned B4SOIprgidlGiven :1; + unsigned B4SOIpkgidlGiven :1; + unsigned B4SOIpfgidlGiven :1; + unsigned B4SOIpagislGiven :1; unsigned B4SOIpbgislGiven :1; unsigned B4SOIpcgislGiven :1; unsigned B4SOIpegislGiven :1; - unsigned B4SOIprgislGiven :1; - unsigned B4SOIpkgislGiven :1; - unsigned B4SOIpfgislGiven :1; - unsigned B4SOIpntunGiven :1; /* v4.0 */ - unsigned B4SOIpntundGiven :1; /* v4.0 */ - unsigned B4SOIpndiodeGiven :1; /* v4.0 */ - unsigned B4SOIpndiodedGiven :1; /* v4.0 */ - unsigned B4SOIpnrecf0Given :1; /* v4.0 */ - unsigned B4SOIpnrecf0dGiven :1; /* v4.0 */ - unsigned B4SOIpnrecr0Given :1; /* v4.0 */ - unsigned B4SOIpnrecr0dGiven :1; /* v4.0 */ + unsigned B4SOIprgislGiven :1; + unsigned B4SOIpkgislGiven :1; + unsigned B4SOIpfgislGiven :1; + unsigned B4SOIpntunGiven :1; /* v4.0 */ + unsigned B4SOIpntundGiven :1; /* v4.0 */ + unsigned B4SOIpndiodeGiven :1; /* v4.0 */ + unsigned B4SOIpndiodedGiven :1; /* v4.0 */ + unsigned B4SOIpnrecf0Given :1; /* v4.0 */ + unsigned B4SOIpnrecf0dGiven :1; /* v4.0 */ + unsigned B4SOIpnrecr0Given :1; /* v4.0 */ + unsigned B4SOIpnrecr0dGiven :1; /* v4.0 */ unsigned B4SOIpisbjtGiven :1; unsigned B4SOIpidbjtGiven :1; /* v4.0 */ unsigned B4SOIpisdifGiven :1; - unsigned B4SOIpiddifGiven :1; /* v4.0 */ + unsigned B4SOIpiddifGiven :1; /* v4.0 */ unsigned B4SOIpisrecGiven :1; unsigned B4SOIpidrecGiven :1; /* v4.0 */ unsigned B4SOIpistunGiven :1; @@ -2970,8 +2974,8 @@ typedef struct sB4SOImodel unsigned B4SOIplbjt0Given :1; unsigned B4SOIpvabjtGiven :1; unsigned B4SOIpaelyGiven :1; - unsigned B4SOIpahliGiven :1; /* v4.0 */ - unsigned B4SOIpahlidGiven :1; /* v4.0 */ + unsigned B4SOIpahliGiven :1; /* v4.0 */ + unsigned B4SOIpahlidGiven :1; /* v4.0 */ /* v3.1 added for RF */ unsigned B4SOIpxrcrg1Given :1; unsigned B4SOIpxrcrg2Given :1; @@ -2996,12 +3000,12 @@ typedef struct sB4SOImodel unsigned B4SOIxpartGiven :1; unsigned B4SOIsheetResistanceGiven :1; - unsigned B4SOIGatesidewallJctSPotentialGiven :1; /* v4.0 */ - unsigned B4SOIGatesidewallJctDPotentialGiven :1; /* v4.0 */ - unsigned B4SOIbodyJctGateSideSGradingCoeffGiven :1; /* v4.0 */ - unsigned B4SOIbodyJctGateSideDGradingCoeffGiven :1; /* v4.0 */ - unsigned B4SOIunitLengthGateSidewallJctCapSGiven :1; /* v4.0 */ - unsigned B4SOIunitLengthGateSidewallJctCapDGiven :1; /* v4.0 */ + unsigned B4SOIGatesidewallJctSPotentialGiven :1; /* v4.0 */ + unsigned B4SOIGatesidewallJctDPotentialGiven :1; /* v4.0 */ + unsigned B4SOIbodyJctGateSideSGradingCoeffGiven :1; /* v4.0 */ + unsigned B4SOIbodyJctGateSideDGradingCoeffGiven :1; /* v4.0 */ + unsigned B4SOIunitLengthGateSidewallJctCapSGiven :1; /* v4.0 */ + unsigned B4SOIunitLengthGateSidewallJctCapDGiven :1; /* v4.0 */ unsigned B4SOIcsdeswGiven :1; unsigned B4SOIoxideTrapDensityAGiven :1; @@ -3063,18 +3067,18 @@ typedef struct sB4SOImodel unsigned B4SOIsteta0Given :1; unsigned B4SOIlodeta0Given :1; /* v4.0 added for stress effect end */ - unsigned B4SOIlpebGiven :1; /* v4.0 for vth */ + unsigned B4SOIlpebGiven :1; /* v4.0 for vth */ unsigned B4SOIllpebGiven :1; /* v4.0 for vth */ unsigned B4SOIwlpebGiven :1; /* v4.0 for vth */ unsigned B4SOIplpebGiven :1; /* v4.0 for vth */ - unsigned B4SOIdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIldvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIwdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIpdvtp0Given :1; /* v4.0 for vth */ - unsigned B4SOIdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIldvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIwdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIpdvtp1Given :1; /* v4.0 for vth */ + unsigned B4SOIdvtp0Given :1; /* v4.0 for vth */ + unsigned B4SOIldvtp0Given :1; /* v4.0 for vth */ + unsigned B4SOIwdvtp0Given :1; /* v4.0 for vth */ + unsigned B4SOIpdvtp0Given :1; /* v4.0 for vth */ + unsigned B4SOIdvtp1Given :1; /* v4.0 for vth */ + unsigned B4SOIldvtp1Given :1; /* v4.0 for vth */ + unsigned B4SOIwdvtp1Given :1; /* v4.0 for vth */ + unsigned B4SOIpdvtp1Given :1; /* v4.0 for vth */ unsigned B4SOIdvtp2Given :1; /* v4.1 for vth */ unsigned B4SOIldvtp2Given :1; /* v4.1 for vth */ unsigned B4SOIwdvtp2Given :1; /* v4.1 for vth */ @@ -3087,10 +3091,10 @@ typedef struct sB4SOImodel unsigned B4SOIldvtp4Given :1; /* v4.1 for vth */ unsigned B4SOIwdvtp4Given :1; /* v4.1 for vth */ unsigned B4SOIpdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIlminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIwminvGiven :1; /* v4.0 for Vgsteff */ - unsigned B4SOIpminvGiven :1; /* v4.0 for Vgsteff */ + unsigned B4SOIminvGiven :1; /* v4.0 for Vgsteff */ + unsigned B4SOIlminvGiven :1; /* v4.0 for Vgsteff */ + unsigned B4SOIwminvGiven :1; /* v4.0 for Vgsteff */ + unsigned B4SOIpminvGiven :1; /* v4.0 for Vgsteff */ unsigned B4SOIfproutGiven :1; /* v4.0 for DITS in ID */ unsigned B4SOIlfproutGiven :1; /* v4.0 for DITS in ID */ unsigned B4SOIwfproutGiven :1; /* v4.0 for DITS in ID */ @@ -3147,20 +3151,20 @@ typedef struct sB4SOImodel #define B4SOI_AEBCP 27 #define B4SOI_VBSUSR 28 #define B4SOI_TNODEOUT 29 -#define B4SOI_FRBODY 30 /* v2.2.2 */ -#define B4SOI_RGATEMOD 31 /* v3.1 */ -#define B4SOI_SOIMOD 32 /* v3.2 */ -#define B4SOI_NF 33 /* v4.0 */ -#define B4SOI_RBODYMOD 34 /* v4.0 */ -#define B4SOI_RBDB 35 /* v4.0 */ -#define B4SOI_RBSB 36 /* v4.0 */ -#define B4SOI_CJSB 37 /* v4.0 */ -#define B4SOI_CJDB 38 /* v4.0 */ -#define B4SOI_SA 41 /* v4.0 */ -#define B4SOI_SB 42 /* v4.0 */ -#define B4SOI_SD 43 /* v4.0 */ -#define B4SOI_DELVTO 44 /* v4.0 */ -#define B4SOI_AGBCPD 45 /* v4.0 */ +#define B4SOI_FRBODY 30 /* v2.2.2 */ +#define B4SOI_RGATEMOD 31 /* v3.1 */ +#define B4SOI_SOIMOD 32 /* v3.2 */ +#define B4SOI_NF 33 /* v4.0 */ +#define B4SOI_RBODYMOD 34 /* v4.0 */ +#define B4SOI_RBDB 35 /* v4.0 */ +#define B4SOI_RBSB 36 /* v4.0 */ +#define B4SOI_CJSB 37 /* v4.0 */ +#define B4SOI_CJDB 38 /* v4.0 */ +#define B4SOI_SA 41 /* v4.0 */ +#define B4SOI_SB 42 /* v4.0 */ +#define B4SOI_SD 43 /* v4.0 */ +#define B4SOI_DELVTO 44 /* v4.0 */ +#define B4SOI_AGBCPD 45 /* v4.0 */ #define B4SOI_AGBCP2 46 /* v4.1 improvement on BC */ @@ -3207,7 +3211,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_NQSMOD 102 #define B4SOI_MOD_MOBMOD 103 /*#define B4SOI_MOD_NOIMOD 104 v3.2 */ -#define B4SOI_MOD_RDSMOD 104 /* v4.0 */ +#define B4SOI_MOD_RDSMOD 104 /* v4.0 */ #define B4SOI_MOD_SHMOD 105 /*#define B4SOI_MOD_DDMOD 106 v4.2 ddmod is not used any more*/ #define B4SOI_MOD_TOX 107 @@ -3312,14 +3316,14 @@ typedef struct sB4SOImodel #define B4SOI_MOD_MXC 207 #define B4SOI_MOD_RTH0 208 #define B4SOI_MOD_CTH0 209 -#define B4SOI_MOD_ALPHA1 214 +#define B4SOI_MOD_ALPHA1 214 #define B4SOI_MOD_EGIDL 215 #define B4SOI_MOD_AGIDL 216 #define B4SOI_MOD_BGIDL 217 -#define B4SOI_MOD_NDIODES 218 /* v4.0 */ +#define B4SOI_MOD_NDIODES 218 /* v4.0 */ #define B4SOI_MOD_LDIOF 219 #define B4SOI_MOD_LDIOR 220 -#define B4SOI_MOD_NTUNS 221 /* v4.0 */ +#define B4SOI_MOD_NTUNS 221 /* v4.0 */ #define B4SOI_MOD_ISBJT 222 #define B4SOI_MOD_ISDIF 223 #define B4SOI_MOD_ISREC 224 @@ -3359,7 +3363,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LBJT0 261 #define B4SOI_MOD_VABJT 262 #define B4SOI_MOD_AELY 263 -#define B4SOI_MOD_AHLIS 264 /* v4.0 */ +#define B4SOI_MOD_AHLIS 264 /* v4.0 */ #define B4SOI_MOD_NTRECF 265 #define B4SOI_MOD_NTRECR 266 #define B4SOI_MOD_DLCB 267 @@ -3474,7 +3478,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LAGIDL 367 #define B4SOI_MOD_LBGIDL 368 #define B4SOI_MOD_LEGIDL 369 -#define B4SOI_MOD_LNTUNS 370 /* v4.0 */ +#define B4SOI_MOD_LNTUNS 370 /* v4.0 */ #define B4SOI_MOD_LNDIODES 371 #define B4SOI_MOD_LNRECF0S 372 #define B4SOI_MOD_LNRECR0S 373 @@ -3488,7 +3492,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LLBJT0 381 #define B4SOI_MOD_LVABJT 382 #define B4SOI_MOD_LAELY 383 -#define B4SOI_MOD_LAHLIS 384 /* v4.0 */ +#define B4SOI_MOD_LAHLIS 384 /* v4.0 */ #define B4SOI_MOD_LVSDFB 385 #define B4SOI_MOD_LVSDTH 386 #define B4SOI_MOD_LDELVT 387 @@ -3501,6 +3505,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_XGW 392 #define B4SOI_MOD_XGL 393 /* v3.1 added for RF end */ +#define B4SOI_MOD_CFRCOEFF 394 /* v4.4 */ /* Width dependence */ #define B4SOI_MOD_WNPEAK 401 @@ -3572,7 +3577,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_WAGIDL 467 #define B4SOI_MOD_WBGIDL 468 #define B4SOI_MOD_WEGIDL 469 -#define B4SOI_MOD_WNTUNS 470 /* v4.0 */ +#define B4SOI_MOD_WNTUNS 470 /* v4.0 */ #define B4SOI_MOD_WNDIODES 471 #define B4SOI_MOD_WNRECF0S 472 #define B4SOI_MOD_WNRECR0S 473 @@ -3586,7 +3591,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_WLBJT0 481 #define B4SOI_MOD_WVABJT 482 #define B4SOI_MOD_WAELY 483 -#define B4SOI_MOD_WAHLIS 484 /* v4.0 */ +#define B4SOI_MOD_WAHLIS 484 /* v4.0 */ #define B4SOI_MOD_WVSDFB 485 #define B4SOI_MOD_WVSDTH 486 #define B4SOI_MOD_WDELVT 487 @@ -3669,7 +3674,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PAGIDL 567 #define B4SOI_MOD_PBGIDL 568 #define B4SOI_MOD_PEGIDL 569 -#define B4SOI_MOD_PNTUNS 570 /* v4.0 */ +#define B4SOI_MOD_PNTUNS 570 /* v4.0 */ #define B4SOI_MOD_PNDIODES 571 #define B4SOI_MOD_PNRECF0S 572 #define B4SOI_MOD_PNRECR0S 573 @@ -3683,42 +3688,42 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PLBJT0 581 #define B4SOI_MOD_PVABJT 582 #define B4SOI_MOD_PAELY 583 -#define B4SOI_MOD_PAHLIS 584 /* v4.0 */ +#define B4SOI_MOD_PAHLIS 584 /* v4.0 */ #define B4SOI_MOD_PVSDFB 585 #define B4SOI_MOD_PVSDTH 586 #define B4SOI_MOD_PDELVT 587 #define B4SOI_MOD_PACDE 588 #define B4SOI_MOD_PMOIN 589 -#define B4SOI_MOD_PXRCRG1 590 /* v3.1 for RF */ +#define B4SOI_MOD_PXRCRG1 590 /* v3.1 for RF */ #define B4SOI_MOD_PXRCRG2 591 /* v3.1 for RF */ #define B4SOI_MOD_EM 592 /* v3.2 for noise */ #define B4SOI_MOD_EF 593 /* v3.2 for noise */ #define B4SOI_MOD_AF 594 /* v3.2 for noise */ #define B4SOI_MOD_KF 595 /* v3.2 for noise */ #define B4SOI_MOD_NOIF 596 /* v3.2 for noise */ -#define B4SOI_MOD_BF 597 /* v4.0 for noise */ -#define B4SOI_MOD_W0FLK 598 /* v4.0 for noise */ -#define B4SOI_MOD_FRBODY 599 /* v4.0 for Rbody */ -#define B4SOI_MOD_CGIDL 600 /* v4.0 for gidl */ -#define B4SOI_MOD_LCGIDL 601 /* v4.0 for gidl */ -#define B4SOI_MOD_WCGIDL 602 /* v4.0 for gidl */ -#define B4SOI_MOD_PCGIDL 603 /* v4.0 for gidl */ -#define B4SOI_MOD_LPEB 604 /* v4.0 for Vth */ -#define B4SOI_MOD_LLPEB 605 /* v4.0 for Vth */ -#define B4SOI_MOD_WLPEB 606 /* v4.0 for Vth */ -#define B4SOI_MOD_PLPEB 607 /* v4.0 for Vth */ -#define B4SOI_MOD_DVTP0 608 /* v4.0 for Vth */ -#define B4SOI_MOD_LDVTP0 609 /* v4.0 for Vth */ -#define B4SOI_MOD_WDVTP0 610 /* v4.0 for Vth */ -#define B4SOI_MOD_PDVTP0 611 /* v4.0 for Vth */ -#define B4SOI_MOD_DVTP1 612 /* v4.0 for Vth */ -#define B4SOI_MOD_LDVTP1 613 /* v4.0 for Vth */ -#define B4SOI_MOD_WDVTP1 614 /* v4.0 for Vth */ -#define B4SOI_MOD_PDVTP1 615 /* v4.0 for Vth */ -#define B4SOI_MOD_MINV 616 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_LMINV 617 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_WMINV 618 /* v4.0 for Vgsteff */ -#define B4SOI_MOD_PMINV 619 /* v4.0 for Vgsteff */ +#define B4SOI_MOD_BF 597 /* v4.0 for noise */ +#define B4SOI_MOD_W0FLK 598 /* v4.0 for noise */ +#define B4SOI_MOD_FRBODY 599 /* v4.0 for Rbody */ +#define B4SOI_MOD_CGIDL 600 /* v4.0 for gidl */ +#define B4SOI_MOD_LCGIDL 601 /* v4.0 for gidl */ +#define B4SOI_MOD_WCGIDL 602 /* v4.0 for gidl */ +#define B4SOI_MOD_PCGIDL 603 /* v4.0 for gidl */ +#define B4SOI_MOD_LPEB 604 /* v4.0 for Vth */ +#define B4SOI_MOD_LLPEB 605 /* v4.0 for Vth */ +#define B4SOI_MOD_WLPEB 606 /* v4.0 for Vth */ +#define B4SOI_MOD_PLPEB 607 /* v4.0 for Vth */ +#define B4SOI_MOD_DVTP0 608 /* v4.0 for Vth */ +#define B4SOI_MOD_LDVTP0 609 /* v4.0 for Vth */ +#define B4SOI_MOD_WDVTP0 610 /* v4.0 for Vth */ +#define B4SOI_MOD_PDVTP0 611 /* v4.0 for Vth */ +#define B4SOI_MOD_DVTP1 612 /* v4.0 for Vth */ +#define B4SOI_MOD_LDVTP1 613 /* v4.0 for Vth */ +#define B4SOI_MOD_WDVTP1 614 /* v4.0 for Vth */ +#define B4SOI_MOD_PDVTP1 615 /* v4.0 for Vth */ +#define B4SOI_MOD_MINV 616 /* v4.0 for Vgsteff */ +#define B4SOI_MOD_LMINV 617 /* v4.0 for Vgsteff */ +#define B4SOI_MOD_WMINV 618 /* v4.0 for Vgsteff */ +#define B4SOI_MOD_PMINV 619 /* v4.0 for Vgsteff */ #define B4SOI_MOD_FPROUT 620 /* v4.0 for DITS in Id */ #define B4SOI_MOD_LFPROUT 621 /* v4.0 for DITS in Id */ #define B4SOI_MOD_WFPROUT 622 /* v4.0 for DITS in Id */ @@ -3732,10 +3737,10 @@ typedef struct sB4SOImodel #define B4SOI_MOD_WPDITSD 630 /* v4.0 for DITS in Id */ #define B4SOI_MOD_PPDITSD 631 /* v4.0 for DITS in Id */ #define B4SOI_MOD_PDITSL 632 /* v4.0 for DITS in Id */ -#define B4SOI_MOD_NDIODED 633 /* v4.0 */ -#define B4SOI_MOD_LNDIODED 634 /* v4.0 */ -#define B4SOI_MOD_WNDIODED 635 /* v4.0 */ -#define B4SOI_MOD_PNDIODED 636 /* v4.0 */ +#define B4SOI_MOD_NDIODED 633 /* v4.0 */ +#define B4SOI_MOD_LNDIODED 634 /* v4.0 */ +#define B4SOI_MOD_WNDIODED 635 /* v4.0 */ +#define B4SOI_MOD_PNDIODED 636 /* v4.0 */ #define B4SOI_MOD_IDDIF 637 /* v4.0 */ #define B4SOI_MOD_LIDDIF 638 /* v4.0 */ #define B4SOI_MOD_WIDDIF 639 /* v4.0 */ @@ -3752,26 +3757,26 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LIDTUN 650 /* v4.0 */ #define B4SOI_MOD_WIDTUN 651 /* v4.0 */ #define B4SOI_MOD_PIDTUN 652 /* v4.0 */ -#define B4SOI_MOD_NRECF0D 653 /* v4.0 */ -#define B4SOI_MOD_LNRECF0D 654 /* v4.0 */ -#define B4SOI_MOD_WNRECF0D 655 /* v4.0 */ -#define B4SOI_MOD_PNRECF0D 656 /* v4.0 */ -#define B4SOI_MOD_NRECR0D 657 /* v4.0 */ -#define B4SOI_MOD_LNRECR0D 658 /* v4.0 */ -#define B4SOI_MOD_WNRECR0D 659 /* v4.0 */ -#define B4SOI_MOD_PNRECR0D 660 /* v4.0 */ +#define B4SOI_MOD_NRECF0D 653 /* v4.0 */ +#define B4SOI_MOD_LNRECF0D 654 /* v4.0 */ +#define B4SOI_MOD_WNRECF0D 655 /* v4.0 */ +#define B4SOI_MOD_PNRECF0D 656 /* v4.0 */ +#define B4SOI_MOD_NRECR0D 657 /* v4.0 */ +#define B4SOI_MOD_LNRECR0D 658 /* v4.0 */ +#define B4SOI_MOD_WNRECR0D 659 /* v4.0 */ +#define B4SOI_MOD_PNRECR0D 660 /* v4.0 */ #define B4SOI_MOD_VREC0D 661 /* v4.0 */ #define B4SOI_MOD_LVREC0D 662 /* v4.0 */ #define B4SOI_MOD_WVREC0D 663 /* v4.0 */ #define B4SOI_MOD_PVREC0D 664 /* v4.0 */ -#define B4SOI_MOD_VTUN0D 665 /* v4.0 */ -#define B4SOI_MOD_LVTUN0D 666 /* v4.0 */ -#define B4SOI_MOD_WVTUN0D 667 /* v4.0 */ -#define B4SOI_MOD_PVTUN0D 668 /* v4.0 */ -#define B4SOI_MOD_NTUND 669 /* v4.0 */ -#define B4SOI_MOD_LNTUND 670 /* v4.0 */ -#define B4SOI_MOD_WNTUND 671 /* v4.0 */ -#define B4SOI_MOD_PNTUND 672 /* v4.0 */ +#define B4SOI_MOD_VTUN0D 665 /* v4.0 */ +#define B4SOI_MOD_LVTUN0D 666 /* v4.0 */ +#define B4SOI_MOD_WVTUN0D 667 /* v4.0 */ +#define B4SOI_MOD_PVTUN0D 668 /* v4.0 */ +#define B4SOI_MOD_NTUND 669 /* v4.0 */ +#define B4SOI_MOD_LNTUND 670 /* v4.0 */ +#define B4SOI_MOD_WNTUND 671 /* v4.0 */ +#define B4SOI_MOD_PNTUND 672 /* v4.0 */ #define B4SOI_MOD_RDW 673 /* v4.0 for rdsMod =1 */ #define B4SOI_MOD_LRDW 674 /* v4.0 for rdsMod =1 */ #define B4SOI_MOD_WRDW 675 /* v4.0 for rdsMod =1 */ @@ -3782,10 +3787,10 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PRSW 680 /* v4.0 for rdsMod =1 */ #define B4SOI_MOD_RDWMIN 681 /* v4.0 for rdsMod =1 */ #define B4SOI_MOD_RSWMIN 682 /* v4.0 for rdsMod =1 */ -#define B4SOI_MOD_AHLID 683 /* v4.0 */ -#define B4SOI_MOD_LAHLID 684 /* v4.0 */ -#define B4SOI_MOD_WAHLID 685 /* v4.0 */ -#define B4SOI_MOD_PAHLID 686 /* v4.0 */ +#define B4SOI_MOD_AHLID 683 /* v4.0 */ +#define B4SOI_MOD_LAHLID 684 /* v4.0 */ +#define B4SOI_MOD_WAHLID 685 /* v4.0 */ +#define B4SOI_MOD_PAHLID 686 /* v4.0 */ #define B4SOI_MOD_DVTP2 687 /* v4.1 for Vth */ #define B4SOI_MOD_LDVTP2 688 /* v4.1 for Vth */ #define B4SOI_MOD_WDVTP2 689 /* v4.1 for Vth */ @@ -3857,35 +3862,35 @@ typedef struct sB4SOImodel -#define B4SOI_MOD_PBSWGS 860 /* v4.0 */ -#define B4SOI_MOD_MJSWGS 861 /* v4.0 */ -#define B4SOI_MOD_CJSWGS 862 /* v4.0 */ +#define B4SOI_MOD_PBSWGS 860 /* v4.0 */ +#define B4SOI_MOD_MJSWGS 861 /* v4.0 */ +#define B4SOI_MOD_CJSWGS 862 /* v4.0 */ #define B4SOI_MOD_CSDESW 863 -#define B4SOI_MOD_XDIFS 870 -#define B4SOI_MOD_XRECS 871 -#define B4SOI_MOD_XTUNS 872 -#define B4SOI_MOD_XDIFD 873 -#define B4SOI_MOD_XRECD 874 -#define B4SOI_MOD_XTUND 875 -#define B4SOI_MOD_LXDIFS 876 -#define B4SOI_MOD_LXRECS 877 -#define B4SOI_MOD_LXTUNS 878 -#define B4SOI_MOD_LXDIFD 879 -#define B4SOI_MOD_LXRECD 880 -#define B4SOI_MOD_LXTUND 881 -#define B4SOI_MOD_WXDIFS 882 -#define B4SOI_MOD_WXRECS 883 -#define B4SOI_MOD_WXTUNS 884 -#define B4SOI_MOD_WXDIFD 885 -#define B4SOI_MOD_WXRECD 886 -#define B4SOI_MOD_WXTUND 887 -#define B4SOI_MOD_PXDIFS 888 -#define B4SOI_MOD_PXRECS 889 -#define B4SOI_MOD_PXTUNS 890 -#define B4SOI_MOD_PXDIFD 891 -#define B4SOI_MOD_PXRECD 892 -#define B4SOI_MOD_PXTUND 893 +#define B4SOI_MOD_XDIFS 870 +#define B4SOI_MOD_XRECS 871 +#define B4SOI_MOD_XTUNS 872 +#define B4SOI_MOD_XDIFD 873 +#define B4SOI_MOD_XRECD 874 +#define B4SOI_MOD_XTUND 875 +#define B4SOI_MOD_LXDIFS 876 +#define B4SOI_MOD_LXRECS 877 +#define B4SOI_MOD_LXTUNS 878 +#define B4SOI_MOD_LXDIFD 879 +#define B4SOI_MOD_LXRECD 880 +#define B4SOI_MOD_LXTUND 881 +#define B4SOI_MOD_WXDIFS 882 +#define B4SOI_MOD_WXRECS 883 +#define B4SOI_MOD_WXTUNS 884 +#define B4SOI_MOD_WXDIFD 885 +#define B4SOI_MOD_WXRECD 886 +#define B4SOI_MOD_WXTUND 887 +#define B4SOI_MOD_PXDIFS 888 +#define B4SOI_MOD_PXRECS 889 +#define B4SOI_MOD_PXTUNS 890 +#define B4SOI_MOD_PXDIFD 891 +#define B4SOI_MOD_PXRECD 892 +#define B4SOI_MOD_PXTUND 893 #define B4SOI_MOD_TCJSWGS 894 #define B4SOI_MOD_TPBSWGS 895 #define B4SOI_MOD_TCJSWGD 896 @@ -4052,13 +4057,13 @@ typedef struct sB4SOImodel #define B4SOI_IGCD 3010 /* v3.2 */ -#define B4SOI_MOD_TNOIA 951 -#define B4SOI_MOD_TNOIB 952 -#define B4SOI_MOD_RNOIA 953 -#define B4SOI_MOD_RNOIB 954 -#define B4SOI_MOD_NTNOI 955 -#define B4SOI_MOD_FNOIMOD 956 -#define B4SOI_MOD_TNOIMOD 957 +#define B4SOI_MOD_TNOIA 951 +#define B4SOI_MOD_TNOIB 952 +#define B4SOI_MOD_RNOIA 953 +#define B4SOI_MOD_RNOIB 954 +#define B4SOI_MOD_NTNOI 955 +#define B4SOI_MOD_FNOIMOD 956 +#define B4SOI_MOD_TNOIMOD 957 #define B4SOI_MOD_NOFF 958 #define B4SOI_MOD_LNOFF 959 #define B4SOI_MOD_WNOFF 960 @@ -4095,8 +4100,8 @@ typedef struct sB4SOImodel #define B4SOI_MOD_RBDB 987 /* v4.0 */ #define B4SOI_MOD_RBSB 988 /* v4.0 */ #define B4SOI_MOD_MJSWGD 989 /* v4.0 */ -#define B4SOI_MOD_CJSWGD 990 /* v4.0 */ -#define B4SOI_MOD_PBSWGD 991 /* v4.0 */ +#define B4SOI_MOD_CJSWGD 990 /* v4.0 */ +#define B4SOI_MOD_PBSWGD 991 /* v4.0 */ /*4.1*/ #define B4SOI_MOD_VFB 1201 /* v4.1 */ diff --git a/src/spicelib/devices/bsim3soi/b4soidel.c b/src/spicelib/devices/bsim3soi/b4soidel.c index 9285ee5f8..e9a3c8a16 100644 --- a/src/spicelib/devices/bsim3soi/b4soidel.c +++ b/src/spicelib/devices/bsim3soi/b4soidel.c @@ -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); } diff --git a/src/spicelib/devices/bsim3soi/b4soidest.c b/src/spicelib/devices/bsim3soi/b4soidest.c index 9063b028d..bbcb24ca5 100644 --- a/src/spicelib/devices/bsim3soi/b4soidest.c +++ b/src/spicelib/devices/bsim3soi/b4soidest.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soiext.h b/src/spicelib/devices/bsim3soi/b4soiext.h index 81a582788..a3c663f6f 100644 --- a/src/spicelib/devices/bsim3soi/b4soiext.h +++ b/src/spicelib/devices/bsim3soi/b4soiext.h @@ -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 **********/ diff --git a/src/spicelib/devices/bsim3soi/b4soigetic.c b/src/spicelib/devices/bsim3soi/b4soigetic.c index 9bb11a88e..87832a8c6 100644 --- a/src/spicelib/devices/bsim3soi/b4soigetic.c +++ b/src/spicelib/devices/bsim3soi/b4soigetic.c @@ -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); } } } diff --git a/src/spicelib/devices/bsim3soi/b4soiinit.c b/src/spicelib/devices/bsim3soi/b4soiinit.c index ce21f9568..fa88a6740 100644 --- a/src/spicelib/devices/bsim3soi/b4soiinit.c +++ b/src/spicelib/devices/bsim3soi/b4soiinit.c @@ -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, diff --git a/src/spicelib/devices/bsim3soi/b4soiitf.h b/src/spicelib/devices/bsim3soi/b4soiitf.h index f0897e99f..39d32ef81 100644 --- a/src/spicelib/devices/bsim3soi/b4soiitf.h +++ b/src/spicelib/devices/bsim3soi/b4soiitf.h @@ -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 **********/ diff --git a/src/spicelib/devices/bsim3soi/b4soild.c b/src/spicelib/devices/bsim3soi/b4soild.c index 244ee6cdc..af79cd8f3 100644 --- a/src/spicelib/devices/bsim3soi/b4soild.c +++ b/src/spicelib/devices/bsim3soi/b4soild.c @@ -1,4 +1,5 @@ -/*** B4SOI 05/14/2010 Released by Tanvir Morshed ***/ +/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ + /********** * Copyright 2010 Regents of the University of California. All rights reserved. @@ -12,9 +13,12 @@ * Modified by Tanvir Morshed 09/22/2009 * Modified by Tanvir Morshed 12/31/2009 * Modified by Larry Wagner, Calvin Bittner, Geoffrey Coram, Tanvir Morshed 05/14/2010 + * Modified by Larry Wagner, Calvin Bittner, 5 fixes. 08/04/2010 + * Modified by Larry Wagner, Calvin Bittner, FD derivatives fixes. 08/25/2010 **********/ #include "ngspice/ngspice.h" + #include "ngspice/cktdefs.h" #include "b4soidef.h" #include "ngspice/trandefs.h" @@ -29,7 +33,7 @@ #define Charge_q 1.60219e-19 #define KboQ 8.617087e-5 /* Kb / q */ #define Eg300 1.115 /* energy gap at 300K */ -#define DELTA 1.0E-9 /* v4.0 */ +#define DELTA 1.0E-9 /* v4.0 */ #define DELTA_1 0.02 #define DELTA_2 0.02 #define DELTA_3 0.02 @@ -44,12 +48,12 @@ #define MAX_EXPL 2.688117142e+43 #define MIN_EXPL 3.720075976e-44 #define EXPL_THRESHOLD 100.0 -#define DEXP(A,B,C) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - C = MAX_EXPL; \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ +#define DEXP(A,B,C) { \ + if (A > EXPL_THRESHOLD) { \ + B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ + C = MAX_EXPL; \ + } else if (A < -EXPL_THRESHOLD) { \ + B = MIN_EXPL; \ C = 0; \ } else { \ B = exp(A); \ @@ -59,7 +63,6 @@ #define FLOG(A) fabs(A) + 1e-14 - #ifdef USE_OMP4SOI int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt); void B4SOILoadRhsMat(GENmodel *inModel, CKTcircuit *ckt); @@ -133,12 +136,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { register int selfheat; double Gmin; - double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst=0.0, dExpVgst_dT; /* enhanced line Wagner */ - double dVgstNVt_dT, dVgstNVt2_dT; /* new line Wagner */ + double dVgstNVt_dT, dVgstNVt2_dT; /* LFW_FD */ + double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst, dExpVgst_dT; /* enhanced line Wagner */ +/* LFW_FD next 4 lines */ + double dVgstNVt_dVg, dVgstNVt_dVd, dVgstNVt_dVb, dVgstNVt_dVe; + double dExpVgst_dVg, dExpVgst_dVd, dExpVgst_dVb, dExpVgst_dVe, dVgstNVt2_dVg; + double dVgstNVt2_dVd, dVgstNVt2_dVb, dVgstNVt2_dVe, dExpArg2_dVd, dExpArg2_dVb, dExpArg2_dVe; + double dExpVgst2_dVg, dExpVgst2_dVd, dExpVgst2_dVb, dExpVgst2_dVe; double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; double arg; double delvbd, delvbs, delvds, delvgd, delvgs; - double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; + double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVe, dVfbeff_dVb, V3, V4; double PhiBSWG, MJSWG; double gcgdb, gcggb, gcgsb, gcgeb, gcgT; double gcsdb, gcsgb, gcssb, gcseb, gcsT; @@ -146,76 +154,80 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; double gcedb, gcegb, gcesb, gceeb, gceT; double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; - double vbd=0.0, vbs, vds, vgb, vgd, vgs, vgdo; + double vbd, vbs, vds, vgb, vgd, vgs, vgdo; #ifndef PREDICTOR double xfact; #endif double vg, vd, vs, vp, ve, vb; double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; - double Vgs_eff, Vfb=0.0, dVfb_dVb, dVfb_dVd, dVfb_dT; - double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT; - double Vgst, dVgst_dVg, dVgst_dVb, dVgst_dT, dVgs_eff_dVg, dVgs_eff_dT; /* enhanced line Wagner */ - double n, dn_dVb, Vtm; - double ExpArg, V0; - double dExpArg_dT, dExpArg2_dT; /* new line Wagner */ - double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; + double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dVg, dVfb_dVe, dVfb_dT; + double Phis, sqrtPhis, dsqrtPhis_dVd, dsqrtPhis_dVe, dsqrtPhis_dVb, dsqrtPhis_dVg; + double Vth, dVth_dVb, dVth_dVd, dVth_dVg, dVth_dVe, dVth_dT; + double Vgst, dVgst_dVg, dVgst_dVd, dVgst_dVb, dVgst_dVe, dVgst_dT, dVgs_eff_dVg, dVgs_eff_dT; + double n, dn_dVb, dn_dVe, dn_dVg, Vtm; + double ExpArg, dExpArg_dVg, dExpArg_dVd, dExpArg_dVb, dExpArg_dVe, dExpArg_dT, dExpArg2_dVg, dExpArg2_dT, V0; + double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dVe, dueff_dT; double Esat, Vdsat; - double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; - double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; - double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; - double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; + double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dVe, dEsatL_dT; + double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dVe, dVdsat_dT, Vasat; + double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dVe, dVasat_dT; + double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dVe, dVa_dT; double Vbseff, dVbseff_dVb; double CoxWL; - double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT; + double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVe, dT0_dVb, dT0_dT; double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT, dT2_dVp; - double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT=0.0; - double T4, dT4_dVd, dT4_dVb, dT4_dT; - double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT=0.0; - double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT=0.0, dT6_dVp; - double T7; + double T3, dT3_dVg, dT3_dVd, dT3_dVe, dT3_dVb, dT3_dT; + double T4, dT4_dVe, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT; + double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT; + double T6, dT6_dVg, dT6_dVd, dT6_dVe, dT6_dVb, dT6_dT, dT6_dVp; + double T7, dT7_dVg, dT7_dVb, dT7_dVd, dT7_dVe; double T8, dT8_dVd; double T9, dT9_dVd; double T10, dT10_dVb, dT10_dVd; - double T11, T12=0.0; - double dTL0_dT, TL1, dTL1_dT, TL2, dTL2_dT, TL3, dTL3_dT=0.0, TL4, dTL4_dT, dTL5_dT; /* new line Wagner */ + double T11, T12; + /* LFW_FD 2 new lines */ + double dT02_dVg, dT02_dVd, dT02_dVb, dT02_dVe, dT12_dVg, dT12_dVd, dT12_dVb, dT12_dVe; + double dT22_dVg, dT22_dVd, dT22_dVb, dT22_dVe; + double dTL0_dT, TL1, dTL1_dT, TL2, dTL2_dT, TL3, dTL3_dT, TL4, dTL4_dT, dTL5_dT; /* new line Wagner */ + /* LFW_FD 1 new line */ + double dTL1_dVg, dTL1_dVd, dTL1_dVb, dTL1_dVe; double dTL6_dT, dTL7_dT, dTL8_dT, dTL9_dT; /* new line Wagner */ - double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; + double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVg, dAbulk0_dVb, dAbulk0_dVd, dAbulk0_dVe; double dAbulk_dT, dAbulk0_dT, dAbulkCV_dT; /* new line Wagner */ - double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; - double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; - double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; - double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; - double Theta0, dTheta0_dVb; + double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dVe, dVACLM_dT; + double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dVe, dVADIBL_dT; + double Xdep, dXdep_dVd, dXdep_dVe, dXdep_dVb, dXdep_dVg; + double lt1, dlt1_dVd, dlt1_dVe, dlt1_dVb, dlt1_dVg; + double ltw, dltw_dVd, dltw_dVe, dltw_dVb, dltw_dVg; + double Delt_vth, dDelt_vth_dVd, dDelt_vth_dVe, dDelt_vth_dVb, dDelt_vth_dVg, dDelt_vth_dT; + double Theta0, dTheta0_dVd, dTheta0_dVe, dTheta0_dVb, dTheta0_dVg; double TempRatio, tmp1, tmp2, tmp3, tmp4; - double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; + double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg, dLambda_dVb, dLambda_dVd, dLambda_dVe; double dLambda_dT; /* new line Wagner */ double a1; double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; - double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; - double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; + double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dVe, dVdseff_dT; + double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb, dVdseffCV_dVe; double dVdseffCV_dT; /* new line Wagner */ double diffVds; - double dAbulk_dVg, dn_dVd ; - double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; - double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; - double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; - double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; - double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; - double Ids, Gm, Gds, Gmb; - double dIds_dT; /* new line Wagner */ + double dAbulk_dVg, dAbulk_dVd, dAbulk_dVe, dn_dVd ; + double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dVe, dbeta_dT; + double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dVe, dgche_dT; + double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dVe, dfgche1_dT; + double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dVe, dfgche2_dT; + double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dVe, dIdl_dT; + double Ids, Gm, Gds, Gmb, dIds_dVg, dIds_dVb, dIds_dVd, dIds_dVe, dIds_dT; double CoxWovL; - double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; - double dWVCoxRds_dT; /* new line Wagner */ - double dVdsatCV_dT; /* new line Wagner */ - double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; - double Leff, Weff, dWeff_dVg, dWeff_dVb; - double dWeff_dT; /* new line Wagner */ - double AbulkCV, dAbulkCV_dVb; + double Rds, dRds_dVg, dRds_dVb, dRds_dVd, dRds_dVe, dRds_dT, WVCox, WVCoxRds, dWVCoxRds_dT; + double dWVCoxRds_dVg, dWVCoxRds_dVb, dWVCoxRds_dVd, dWVCoxRds_dVe; + double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVd, dVdsatCV_dVb, dVdsatCV_dVe, dVdsatCV_dT; + double Leff, Weff, dWeff_dVg, dWeff_dVb, dWeff_dVd, dWeff_dVe, dWeff_dT; + double AbulkCV, dAbulkCV_dVg, dAbulkCV_dVb, dAbulkCV_dVd, dAbulkCV_dVe; double qgdo, qgso, cgdo, cgso; double dxpart, sxpart; @@ -229,11 +241,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double Gbpbs=0.0, Gbpps; double ves, ved, veb, vge=0.0, delves, vedo, delved; double vps, vpd, Vps, delvps; - double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT; + double Vbd, Ves, Vesfb; + double DeltVthtemp, dDeltVthtemp_dVd, dDeltVthtemp_dVe, dDeltVthtemp_dVb, dDeltVthtemp_dVg, dDeltVthtemp_dT; double Vbp, dVbp_dVb; - double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; - double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; - double dDIBL_Sft_dVb; + double DeltVthw, dDeltVthw_dVd, dDeltVthw_dVe, dDeltVthw_dVb, dDeltVthw_dVg, dDeltVthw_dT; + double Gm0, Gds0, Gmb0, Gme0, GmT0, GmT; + double dDIBL_Sft_dVg, dDIBL_Sft_dVe, dDIBL_Sft_dVb; double Igidl, Ggidld=0.0, Ggidlg, Ggidlb=0.0, Ggidlt; /* enhanced line Wagner */ double Igisl, Ggisls=0.0, Ggislg, Ggislb=0.0, Ggislt; /* enhanced line Wagner */ double Gjsd, Gjsb=0.0, GjsT, Gjdd, Gjdb=0.0, GjdT; @@ -253,9 +266,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double qinv, qgate=0.0, qbody=0.0, qdrn=0.0, qsrc, qsub=0.0, cqgate, cqbody, cqdrn, cqsub, cqtemp; double qgate1; /* new line Wagner */ - double Cgg, Cgd, Cgb; - double Csg, Csd, Csb, Cbg, Cbd, Cbb; - double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1; + double Cgg, Cgd, Cgb, Cge; + double Csg, Csd, Csb, Cse, Cbg, Cbd, Cbb, Cbe; + double Cgg1, Cgb1, Cgd1, Cge1, Cbg1, Cbb1, Cbd1, Cbe1, Csg1, Csd1, Csb1, Cse1; double Vdsatii; double Ibs1 ,dIbs1_dVb ,dIbs1_dT; double Ibs2 ,dIbs2_dVb ,dIbs2_dT; @@ -266,11 +279,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; double WTsi, NVtm1, NVtm2; - double Ic, dIc_dVb=0.0, dIc_dVd=0.0; + double Ic ,dIc_dVb ,dIc_dVd; double Ibs; double Ibd; - double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; - double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; + double Denomi ,dDenomi_dVg, dDenomi_dVd, dDenomi_dVb, dDenomi_dVe, dDenomi_dT; + double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd, dQsub0_dVe ; double dqgate_dT, dqgate2_dT, dqbulk_dT, dqsrc_dT, dqdrn_dT, dqbody_dT, dqsub_dT; /* new line Wagner */ double Qac0 ,dQac0_dVb ,dQac0_dVd; double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; @@ -294,11 +307,10 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v2.0 release */ double Vbsh, dVbsh_dVb; - double sqrtPhisExt, dsqrtPhisExt_dVb; + double sqrtPhisExt, dsqrtPhisExt_dVd, dsqrtPhisExt_dVe, dsqrtPhisExt_dVb, dsqrtPhisExt_dVg; double T13, T14; double dT14_dT; /* new line Wagner */ - double dT11_dVb, dT13_dVb, dT14_dVb, dT13_dT; /* dT13_dT added -Tanvir*/ - double dVgst_dVd; + double dT11_dVb, dT11_dVd, dT11_dVe, dT13_dVb, dT13_dVd, dT13_dVe, dT14_dVb, dT14_dVd, dT14_dVe, dT13_dVg, dT14_dVg; double Vdsatii0, dVdsatii0_dT; double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; @@ -307,37 +319,37 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double TempRatioMinus1; double Ahlis, dAhlis_dT, Ahlid, dAhlid_dT ; double WsTsi, WdTsi; - double dPhiBSWG_dT, dcjsbs_dT, darg_dT=0.0, ddT3_dVb_dT=0.0; + double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT; double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; double CoxWLb, CoxWLcenb; double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; double Ien, dIen_dT, Iendif, dIendif_dT; - double Ibsdif=0.0, dIbsdif_dVb=0.0, dIbsdif_dT=0.0; - double Ibddif=0.0, dIbddif_dVb=0.0, dIbddif_dT=0.0; + double Ibsdif, dIbsdif_dVb, dIbsdif_dT; + double Ibddif, dIbddif_dVb, dIbddif_dT; double Ehlis, dEhlis_dVb, dEhlis_dT; double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; - double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; + double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dT; double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; - double dT10_dT, dT11_dT, DioMax; + double dT10_dT, dT11_dT, dT13_dT, DioMax; /* LFW_FD enhance line */ double cjdbs, dcjdbs_dT; double wdios, wdiod; /* for capMod3 */ double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; - double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; - double dDeltaPhi_dT; /* new line Wagner */ - double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk; - double qbulk1; /* new line Wagner */ + double CoxWLcen, QovCox, dQac0_dVg, dQac0_dVe, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dT; + double dDeltaPhi_dVd, dDeltaPhi_dVb, dDeltaPhi_dVe; + double dTcen_dVd, dTcen_dVe, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk, qbulk1; + double dCoxeff_dVe; double T3zb, lt1zb, ltwzb, Theta0zb; double Delt_vthzb, dDelt_vthzb_dT; double DeltVthwzb, dDeltVthwzb_dT; double DeltVthtempzb, dDeltVthtempzb_dT; - double Vthzb=0.0, dVthzb_dT=0.0, Vfbzb, dVfbzb_dT; + double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT; /* v3.2 */ - double noff, dnoff_dVd, dnoff_dVb; + double noff, dnoff_dVg, dnoff_dVd, dnoff_dVb, dnoff_dVe; double dnoff_dT; /* new line Wagner */ double vgmb; @@ -351,8 +363,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double vgge, vggm; /* v3.0 */ - double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; - double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; + double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVe, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; + double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, dIgcs_dVe, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb, dIgcd_dVe; double dIgc_dT, dIgcs_dT, dIgcd_dT; /* new line Wagner */ double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg; double VxNVt, ExpVxNVt; @@ -362,9 +374,10 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq; /* v3.0 */ - double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT; - double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe, dVdiff_dVe; - double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe=0.0, dVaux_dVe; + double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT, dVbs_dVb; + double dVbs_dVg, dVbs_dVd, dVbs_dVe, dVbs_dT; + double dIgb1_dVe, Giie, dRatio_dVe, dVdiff_dVe; + double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe, dVaux_dVe; double Gme, gTte, gbbe, gddpe, gsspe; double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT; double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT; @@ -380,22 +393,21 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT; /* v2.2 release */ - double Vgb=0.0, dVgb_dVg=0.0, dVgb_dVb=0.0, Vox, dVox_dVg, dVox_dVd, dVox_dVb; + double Vgb, dVgb_dVg, dVgb_dVd, dVgb_dVe, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb; double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; double ceqgate; double dT0_dVox, Voxeff, dVoxeff_dVox; - double dVox_dT=0.0, dVaux_dT=0.0, dIgb_dT; - double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVd=0.0, dVoxacc_dVb=0.0, dVoxacc_dT; - double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVb=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dT=0.0; + double dVox_dT, dVaux_dT, dIgb_dT; + double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVe, dVoxacc_dVb, dVoxacc_dT; + double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, dVoxdepinv_dT; double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; - double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; - double gigs, gigd, gigb, gigg, gigT; + double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dVe, dIgb2_dT; + double gigs, gigd, gigb, gigg, gigT, gige; /* LFW_FD enhance line */ double gigpg, gigpp; /* v4.0 */ double IdlovVdseff, dIdlovVdseff_dVg, dIdlovVdseff_dVd, dIdlovVdseff_dVb; - double IdovVds; double vdbs, vsbs, vdbd=0.0, vsbd, vsbdo, vbs_jct, vbd_jct; double Vsbs, Vdbd, Vdbs; double delvdbd, delvsbs, delvdbs, delvbd_jct, delvbs_jct; @@ -403,8 +415,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double ceqqjd=0.0, ceqqjs=0.0; double Lpe_Vb; /* v4.0 for Vth */ double DITS_Sft, DITS_Sft2, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft2_dVd, dDITS_Sft_dT; - double FP, dFP_dT, dFP_dVg; - double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dT; /* for DITS */ + double FP, dFP_dT, dFP_dVg, dFP_dVb, dFP_dVd, dFP_dVe; + double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dVb, dVADITS_dVe, dVADITS_dT; /* for DITS */ double Iii_Igidl, Giigidl_b, Giigidl_d, Giigidl_g, Giigidl_e, Giigidl_T; double gjsdb; double Idbdp=0.0, Isbsp=0.0, cdbdp, csbsp, gcjdbdp, gcjsbsp, GGjdb, GGjsb; @@ -431,39 +443,37 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { double dTheta0_dT, dn_dT, dsqrtPhisExt_dT, dT3zb_dT, dltwzb_dT, dlt1zb_dT, dTheta0zb_dT, dvth0_dT, dDIBL_Sft_dT,dtmp2_dT; /* v4.2 temp deriv */ double Vgd, Vgd_eff, dVgd_eff_dVg, dVgd_eff_dT; /* enhanced line Wagner */ double dVbs0mos_dVd; - double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp; - double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp; + double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp, dIg_agbcp2_dT; + double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp, dvgp_eff_dT; /* improved body contact charge model */ double CoxWL2, CoxWLb2; - double ExpVgst2, Vgsteff2=0.0, VgstNVt2, ExpArg2; - double dVgsteff2_dVd=0.0, dVgsteff2_dVg=0.0, dVgsteff2_dVb=0.0, dVgsteff2_dVe, dVgsteff2_dT=0.0; - double T02=0.0; - double Qac02, dQac02_dVrg=0.0, dQac02_dVd=0.0, dQac02_dVg=0.0, dQac02_dVb=0.0, dQac02_dT=0.0; - double Vgs_eff2=0.0, dVgs_eff2_dVg=0.0; - double Vfbzb2=0.0, dVfbzb2_dT=0.0; - double Vfb2=0.0, dVfb2_dVd, dVfb2_dVb, dVfb2_dT; - double Vfbeff2=0.0, dVfbeff2_dVd=0.0, dVfbeff2_dVrg=0.0, dVfbeff2_dVg=0.0, dVfbeff2_dVb=0.0, dVfbeff2_dT=0.0; - double Qsub02, dQsub02_dVg=0.0, dQsub02_dVrg=0.0, dQsub02_dVd=0.0, dQsub02_dVb=0.0, dQsub02_dT=0.0; - double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb; - double dVdsatCV2_dT; /* new line Wagner */ - double VdseffCV2=0.0, dVdseffCV2_dVg=0.0, dVdseffCV2_dVd=0.0, dVdseffCV2_dVb=0.0; - double dVdseffCV2_dT; /* new line Wagner */ - double Cbg12=0.0, Cbd12=0.0, Cbb12=0.0; - double Cgg12=0.0, Cgd12=0.0, Cgb12=0.0; - double Csg12=0.0, Csd12=0.0, Csb12=0.0; - double Tcen2=0.0, dTcen2_dVg=0.0, dTcen2_dVd, dTcen2_dVb=0.0, dTcen2_dT=0.0; + double ExpVgst2, Vgsteff2, VgstNVt2, ExpArg2; + double dVgsteff2_dVd, dVgsteff2_dVg, dVgsteff2_dVb, dVgsteff2_dVe, dVgsteff2_dT; + double T02; + double Qac02, dQac02_dVrg, dQac02_dVd, dQac02_dVg, dQac02_dVb, dQac02_dVe, dQac02_dT; + double Vgs_eff2, dVgs_eff2_dVg; + double Vfbzb2, dVfbzb2_dT; + double Vfb2, dVfb2_dVg, dVfb2_dVd, dVfb2_dVb, dVfb2_dVe, dVfb2_dT; + double Vfbeff2, dVfbeff2_dVd, dVfbeff2_dVrg, dVfbeff2_dVg, dVfbeff2_dVb, dVfbeff2_dVe, dVfbeff2_dT; + double Qsub02, dQsub02_dVg, dQsub02_dVrg, dQsub02_dVd, dQsub02_dVb, dQsub02_dVe, dQsub02_dT; + double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb, dVdsatCV2_dVd, dVdsatCV2_dVe, dVdsatCV2_dT; + double VdseffCV2, dVdseffCV2_dVg, dVdseffCV2_dVd, dVdseffCV2_dVb, dVdseffCV2_dVe, dVdseffCV2_dT; + double Cbg12, Cbd12, Cbb12, Cbe12; + double Cgg12, Cgd12, Cgb12, Cge12; + double Csg12, Csd12, Csb12, Cse12; + double Tcen2, dTcen2_dVg, dTcen2_dVd, dTcen2_dVb, dTcen2_dVe, dTcen2_dT; double Ccen2; - double Coxeff2=0.0, dCoxeff2_dVg=0.0, dCoxeff2_dVd=0.0, dCoxeff2_dVb=0.0, dCoxeff2_dT=0.0; - double CoxWLcenb2=0.0, dCoxWLcenb2_dT=0.0; + double Coxeff2, dCoxeff2_dVg, dCoxeff2_dVd, dCoxeff2_dVb, dCoxeff2_dVe, dCoxeff2_dT; + double CoxWLcenb2, dCoxWLcenb2_dT; double QovCox2; - double DeltaPhi2=0.0, dDeltaPhi2_dVg=0.0, dDeltaPhi2_dVd, dDeltaPhi2_dVb; + double DeltaPhi2, dDeltaPhi2_dVg, dDeltaPhi2_dVd, dDeltaPhi2_dVb, dDeltaPhi2_dVe; double dDeltaPhi2_dT; /* new line Wagner */ - double CoxWLcen2=0.0; - double T22=0.0, T52=0.0; + double CoxWLcen2; + double T22, T52; double qsrc2, qbulk2; double dqsrc2_dT, dqbulk2_dT; /* new line Wagner */ - double Csg2, Csd2, Csb2; + double Csg2, Csd2, Csb2, Cse2; double DELTA_3_SOI2; double dphi_dT,dsqrtPhi_dT,dXdep0_dT,cdep0,theta0vb0,dtheta0vb0_dT; double thetaRout,dthetaRout_dT,dcdep0_dT; @@ -487,6 +497,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { for (here = model->B4SOIinstances; here != NULL; here = here->B4SOInextInstance) { + if (here->B4SOIowner != ARCHme) continue; #endif Check = 0; ByPass = 0; @@ -1041,6 +1052,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { *(ckt->CKTstate0 + here->B4SOIdeltemp),5.0,&Check); } + if(model->B4SOImtrlMod) { epsrox = 3.9; @@ -1170,7 +1182,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /*dcep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; */ dcdep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; - /* T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) */ /* Bug fix #3 Jun 09 Body type is generalized for mtrlMod 1*/ + /* T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) Bug fix #3 Jun 09 Body type is generalized for mtrlMod 1*/ /* * model->B4SOItox * Xdep0); */ T1 = sqrt(epssub / (epsrox * EPS0) /* Fix */ * toxe * Xdep0); @@ -1667,10 +1679,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.1 for improved BT charge model, no poly depletion */ - if (here->B4SOIagbcp2 > 0) - { Vgs_eff2 = Vgs; - dVgs_eff2_dVg = 1.0; - } + Vgs_eff2 = Vgs; + dVgs_eff2_dVg = 1.0; /* end v4.1 for improved BT charge model */ Leff = pParam->B4SOIleff; @@ -1696,6 +1706,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVbsmos_dVd = 0.0; dVbsmos_dVb = 1.0; dVbsmos_dVe = 0.0; + /* LFW_FD 5 new lines */ + dVbs_dVg = 0.0; + dVbs_dVd = 0.0; + dVbs_dVb = 1.0; + dVbs_dVe = 0.0; + dVbs_dT = 0.0; if (selfheat) dVbsmos_dT = 0.0; else dVbsmos_dT = 0.0; @@ -1715,7 +1731,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVbs0t_dVd = 0.0; dVbs0_dVd = 0.0; if (selfheat) - dVbs0t_dT = T1 * dvbi_dT; + /* dVbs0t_dT = T1 * dvbi_dT; */ + dVbs0t_dT = (1.0 - T1) * dphi_dT + T1 * dvbi_dT; /* LFW_FD new line */ else dVbs0t_dT = 0.0; @@ -1727,6 +1744,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = 1.0/(1 + Cbox / model->B4SOIcsi); Vbs0 = T4 * Vbs0t + T2; dVbs0_dVe = T1; + dVbs0_dVd = 0.0; /* flexilint */ if (selfheat) dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT; else @@ -1744,7 +1762,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vbs0t = T5 + T6; dVbs0t_dVd = model->B4SOIcdsbs * T0 * T2; if (selfheat) - dVbs0t_dT = 0.0; + /* dVbs0t_dT = 0.0; LFW_FD changed line */ + dVbs0t_dT = model->B4SOIcsi * T0 * dphi_dT; else dVbs0t_dT = 0.0; @@ -1767,7 +1786,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vbs0mos = Vbs0 - 0.5 * T3 * T4; T5 = 0.5 * T4 * (1 + T1 / T2); dVbs0mos_dVe = dVbs0_dVe * (1 + T5); - dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); /* v4.1 */ + /* dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); LFW_FD */ + dVbs0mos_dVd = dVbs0_dVd * (1 + T5) - T5 * dVbs0t_dVd; if (selfheat) dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT; else @@ -1790,7 +1810,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* VthFD calculation */ Phis = phi - Vbs0mos; - dPhis_dVb = -1; /* w.r.t Vbs0mos */ + /* dPhis_dVb = -1; LFW_FD not used */ sqrtPhis = sqrt(Phis); dsqrtPhis_dVb = -0.5 / sqrtPhis; Xdep = Xdep0 * sqrtPhis / sqrtPhi; @@ -1935,7 +1955,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; if (selfheat) /*dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT;*/ - /*dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT);*/ /* v4.1 */ + /*dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT); */ dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ else dDelt_vth_dT = 0.0; T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltw; @@ -1957,7 +1977,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; if (selfheat) /* dDeltVthw_dT = T0 * dvbi_dT; */ - /* dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT);*/ /* v4.1 */ /* v4.2 bugfix temp deriv */ + /* dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT); v4.1 */ /* v4.2 bugfix temp deriv */ dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; /* v4.2 bugfix temp deriv */ else dDeltVthw_dT = 0.0; @@ -1974,7 +1994,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (selfheat) /* dDeltVthtemp_dT = T1 / model->B4SOItnom; */ /* dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT - + T1 / model->B4SOItnom;*/ /* v4.1 */ /* v4.2 bugfix temp deriv */ + + T1 / model->B4SOItnom; v4.1 */ /* v4.2 bugfix temp deriv */ dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model-> B4SOItnom+ pParam->B4SOIkt2 * dVbs0mos_dT* TempRatioMinus1;/* v4.2 bugfix temp deriv */ else @@ -2033,11 +2053,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - dDITS_Sft_dT ; */ - dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT - + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT - - pParam->B4SOIk1eff * dsqrtPhi_dT); /* v4.1 */ + /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT + - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT + - dDITS_Sft_dT + + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT + - pParam->B4SOIk1eff * dsqrtPhi_dT); v4.1 */ + /* LFW_FD fixed expression */ + dVthFD_dT = (pParam->B4SOIk1ox * dsqrtPhis_dT - pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb + - here->B4SOIk2ox * dVbs0mos_dT - dDelt_vth_dT - dDeltVthw_dT + + pParam->B4SOIk3b * dVbs0mos_dT * tmp2 + + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) * dtmp2_dT + + dDeltVthtemp_dT - dDIBL_Sft_dT - dDITS_Sft_dT; else dVthFD_dT = 0.0; @@ -2045,7 +2071,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* VtgseffFD calculation for PhiFD */ VtgsFD = VthFD - Vgs_eff; T10 = model->B4SOInofffd * Vtm; - DEXP((VtgsFD - model->B4SOIvofffd)/ T10, ExpVtgsFD, T0); + DEXP( ((VtgsFD - model->B4SOIvofffd)/ T10), ExpVtgsFD, T0); VtgseffFD = T10 * log(1.0 + ExpVtgsFD); T0 /= (1.0 + ExpVtgsFD); dVtgseffFD_dVd = T0 * dVthFD_dVd; @@ -2061,7 +2087,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* surface potential modeling at strong inversion: PhiON */ VgstFD = Vgs_eff - VthFD; - DEXP((VgstFD - model->B4SOIvofffd)/ T10, ExpVgstFD, T0); + DEXP( ((VgstFD - model->B4SOIvofffd)/ T10), ExpVgstFD, T0); VgsteffFD = T10 * log(1.0 + ExpVgstFD); T0 /= (1.0 + ExpVgstFD); dVgsteffFD_dVd = -T0 * dVthFD_dVd; @@ -2187,9 +2213,16 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVbsitf_dVg = dVbs0_dVg; dVbsitf_dVd = dVbs0_dVd; dVbsitf_dVe = dVbs0_dVe; - dVbsitf_dVb = 0.0; - if (selfheat) dVbsitf_dT = dVbs0_dT; - else dVbsitf_dT = 0; + /*dVbsitf_dVb = 0.0; */ + /*if (selfheat) dVbsitf_dT = dVbs0_dT; */ + /*else dVbsitf_dT = 0; */ + /* LFW_FD fix */ + dVbs_dVg = dVbsitf_dVg; + dVbs_dVd = dVbsitf_dVd; + dVbs_dVb = dVbsitf_dVb = 0.0; + dVbs_dVe = dVbsitf_dVe; + if (selfheat) {dVbsitf_dT = dVbs0_dT; dVbs_dT = dVbsitf_dT;} + else {dVbsitf_dT = 0; dVbs_dT = 0;} } else /* soiMod = 1 */ { @@ -2201,6 +2234,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVbsitf_dVd = (1 - T3) * dVbs0_dVd; dVbsitf_dVe = (1 - T3) * dVbs0_dVe; dVbsitf_dVb = T3 ; + /* LFW_FD 7 new lines */ + /* Note that Vbs has not been redefined */ + /* dVbs_dVb = dVbsitf_dVb; */ + dVbs_dVg = 0.0; + dVbs_dVd = 0.0; + dVbs_dVb = 1.0; + dVbs_dVe = 0.0; + dVbs_dT = 0.0; if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT; else dVbsitf_dT = 0.0; } @@ -2276,20 +2317,39 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* Below all the variables refer to Vbseff */ - if (dVbseff_dVb < 1e-20) { - dVbseff_dVb = 1e-20; - dVbsh_dVb *= 1e20; - } - else - dVbsh_dVb /= dVbseff_dVb; + /* LFW_FD comment out next 6 lines */ + /*if (dVbseff_dVb < 1e-20) { */ + /* dVbseff_dVb = 1e-20; */ + /* dVbsh_dVb *= 1e20; */ + /*} */ + /*else */ + /* dVbsh_dVb /= dVbseff_dVb; */ + /*=======================================================================*/ + /* Some derivatives were originally taken w.r.t. Vbseff, and named *_dVb */ + /* Later in the code, they were corrected by multiplying or dividing */ + /* by dVbseff_dVb. */ + /* Now, all derivatives labeled *_dVb are taken w.r.t. Vbs */ + /* The correction factor "dVbseff_dVb" has been removed where it is */ + /* no longer needed. */ + /*=======================================================================*/ Phis = phi - Vbseff; - dPhis_dVb = -1; + /* dPhis_dVb = -1; LFW_FD not uesed */ sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; + /*dsqrtPhis_dVb = -0.5 / sqrtPhis; */ + /* LFW_FD fix/add 4 lines */ + dsqrtPhis_dVg = -0.5 * dVbseff_dVg / sqrtPhis; + dsqrtPhis_dVd = -0.5 * dVbseff_dVd / sqrtPhis; + dsqrtPhis_dVb = -0.5 * dVbseff_dVb / sqrtPhis; + dsqrtPhis_dVe = -0.5 * dVbseff_dVe / sqrtPhis; Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; + /*dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; */ + /* LFW_FD fix/add 4 lines */ + dXdep_dVg = Xdep0 * dsqrtPhis_dVg / sqrtPhi; + dXdep_dVd = Xdep0 * dsqrtPhis_dVd / sqrtPhi; + dXdep_dVb = Xdep0 * dsqrtPhis_dVb / sqrtPhi; + dXdep_dVe = Xdep0 * dsqrtPhis_dVe / sqrtPhi; /* v4.1 */ if (selfheat) { dPhis_dT = dphi_dT - dVbseff_dT; @@ -2306,7 +2366,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } /* end v4.1 */ /* Calculate nstar v3.2 */ - here->B4SOInstar = model->B4SOIvtm / Charge_q * +/* here->B4SOInstar = model->B4SOIvtm / Charge_q * */ + here->B4SOInstar = Vtm / Charge_q * (model->B4SOIcox + epssub / Xdep + pParam->B4SOIcit); /* Vth Calculation */ @@ -2323,7 +2384,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = pParam->B4SOIdvt2 * T4 * T4 ; } lt1 = model->B4SOIfactor1 * T3 * T1; - dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + /* dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); */ + /* LFW_FD fix/add 4 lines */ + dlt1_dVg = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVg + 0.5 * T1 * dXdep_dVg / T3); + dlt1_dVd = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVd + 0.5 * T1 * dXdep_dVd / T3); + dlt1_dVb = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVb + 0.5 * T1 * dXdep_dVb / T3); + dlt1_dVe = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVe + 0.5 * T1 * dXdep_dVe / T3); /* fix below expression Wagner */ /*if (selfheat) dlt1_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT;*/ if (selfheat) dlt1_dT = model->B4SOIfactor1 * (T1 * 0.5 / T3 * dXdep_dT @@ -2341,7 +2407,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = pParam->B4SOIdvt2w * T4 * T4 ; } ltw= model->B4SOIfactor1 * T3 * T1; - dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + /* dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); */ + /* LFW_FD fix/add 4 lines */ + dltw_dVg = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVg + 0.5 * T1 * dXdep_dVg / T3); + dltw_dVd = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVd + 0.5 * T1 * dXdep_dVd / T3); + dltw_dVb = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVb + 0.5 * T1 * dXdep_dVb / T3); + dltw_dVe = model->B4SOIfactor1 * (T3 * T2 * dVbseff_dVe + 0.5 * T1 * dXdep_dVe / T3); /* fix next expression Wagner */ /*if (selfheat) dltw_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; */ if (selfheat) dltw_dT = model->B4SOIfactor1 * (T1 * 0.5 / T3 * dXdep_dT @@ -2351,40 +2422,59 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - dT1_dT = -T0 / lt1 * T1 * dlt1_dT; /* v4.2 bugfix temp deriv */ - dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ + /*dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; */ + /*dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; */ + /*dT1_dT = -T0 / lt1 * T1 * dlt1_dT; v4.2 bugfix temp deriv */ + /*dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; v4.2 bugfix temp deriv */ + /* LFW_FD fix 5 derivatives */ + dTheta0_dVg = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVg / lt1; + dTheta0_dVd = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVd / lt1; + dTheta0_dVb = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVb / lt1; + dTheta0_dVe = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dVe / lt1; + dTheta0_dT = -(1.0 + 4.0 * T1) * T1 * T0 * dlt1_dT / lt1; } else { T1 = MIN_EXPL; Theta0 = T1 * (1.0 + 2.0 * T1); + /* LFW_FD fix 5 derivatives */ + dTheta0_dVg = 0.0; + dTheta0_dVd = 0.0; dTheta0_dVb = 0.0; + dTheta0_dVe = 0.0; dTheta0_dT = 0; /* v4.2 bugfix temp deriv */ } /* Calculate n */ T2 = pParam->B4SOInfactor * epssub / Xdep; + /* LFW_FD add 3 derivatives */ + dT2_dVg = - T2 / Xdep * dXdep_dVg; + dT2_dVd = - T2 / Xdep * dXdep_dVd; dT2_dVb = - T2 / Xdep * dXdep_dVb; + dT2_dVe = - T2 / Xdep * dXdep_dVe; dT2_dT = - T2 / Xdep * dXdep_dT; /* v4.2 bugfix temp deriv */ T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff + pParam->B4SOIcdscd * Vds; - dT3_dVb = pParam->B4SOIcdscb; - dT3_dVd = pParam->B4SOIcdscd; - dT3_dT = pParam->B4SOIcdscb * dVbseff_dT; /* new line Wagner */ + /* LFW_FD add/fix 5 derivatives */ + dT3_dVg = pParam->B4SOIcdscb * dVbseff_dVg; + dT3_dVd = pParam->B4SOIcdscb * dVbseff_dVd + pParam->B4SOIcdscd; + dT3_dVb = pParam->B4SOIcdscb * dVbseff_dVb; + dT3_dVe = pParam->B4SOIcdscb * dVbseff_dVe; + dT3_dT = pParam->B4SOIcdscb * dVbseff_dT; /* LFW */ T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B4SOIcox; - dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; + /* LFW_FD add/fix 5 derivatives */ + dT4_dVg = (dT2_dVg + T3 * dTheta0_dVg + Theta0 * dT3_dVg) / model->B4SOIcox; + dT4_dVd = (dT2_dVd + T3 * dTheta0_dVd + Theta0 * dT3_dVd) / model->B4SOIcox; + dT4_dVb = (dT2_dVb + T3 * dTheta0_dVb + Theta0 * dT3_dVb) / model->B4SOIcox; + dT4_dVe = (dT2_dVe + T3 * dTheta0_dVe + Theta0 * dT3_dVe) / model->B4SOIcox; + dT4_dT = (dT2_dT + dTheta0_dT* T3 + Theta0*dT3_dT)/ model->B4SOIcox; /* LFW */ - /* fix below expression Wagner */ - /*dT4_dT = (dT2_dT + dTheta0_dT* T3)/ model->B4SOIcox; v4.2 bugfix temp deriv */ - dT4_dT = (dT2_dT + dTheta0_dT* T3 + Theta0*dT3_dT)/ model->B4SOIcox; if (T4 >= -0.5) { n = 1.0 + T4; + dn_dVg = dT4_dVg; dn_dVb = dT4_dVb; dn_dVd = dT4_dVd; + dn_dVe = dT4_dVe; dn_dT = dT4_dT; /* v4.2 bugfix temp deriv */ } else @@ -2395,9 +2485,10 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { n = T0 * T5; /* v4.2 bugfix temp deriv */ dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; /* Wagner - moved line up from 3 lines below */ T0 *= T0; + dn_dVg = T0 * dT4_dVg; dn_dVb = T0 * dT4_dVb; dn_dVd = T0 * dT4_dVd; - /*dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; wrong place - see 3 lines above Wagner */ + dn_dVe = T0 * dT4_dVe; } /* v4.0 DITS */ @@ -2433,7 +2524,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; Delt_vth = here->B4SOIthetavth * V0; + /* LFW_FD add/fix 4 derivatives */ + dDelt_vth_dVg = pParam->B4SOIdvt0 * dTheta0_dVg * V0; + dDelt_vth_dVd = pParam->B4SOIdvt0 * dTheta0_dVd * V0; dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; + dDelt_vth_dVe = pParam->B4SOIdvt0 * dTheta0_dVe * V0; if (selfheat) /* dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT; */ /* v4.2 bugfix temp deriv */ dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ else dDelt_vth_dT = 0.0; @@ -2443,23 +2538,37 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - dT1_dT = -T0 / ltw * T1 * dltw_dT; /* v4.2 bugfix temp deriv */ - dT2_dT = (1.0 + 4.0 * T1) * dT1_dT;/* v4.2 bugfix temp deriv */ + /*dT1_dVb = -T0 / ltw * T1 * dltw_dVb; */ + /*dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; */ + /*dT1_dT = -T0 / ltw * T1 * dltw_dT; v4.2 bugfix temp deriv */ + /*dT2_dT = (1.0 + 4.0 * T1) * dT1_dT; v4.2 bugfix temp deriv */ + /* LFW_FD add/fix 5 derivatives */ + dT2_dVg = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVg / ltw; + dT2_dVd = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVd / ltw; + dT2_dVb = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVb / ltw; + dT2_dVe = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dVe / ltw; + dT2_dT = -(1.0 + 4.0 * T1) * T1 * T0 * dltw_dT / ltw; } else { T1 = MIN_EXPL; T2 = T1 * (1.0 + 2.0 * T1); + /* LFW_FD add/fix 5 derivatives */ + dT2_dVg = 0.0; + dT2_dVd = 0.0; dT2_dVb = 0.0; - dT2_dT = 0.0; /* new line Wagner */ + dT2_dVe = 0.0; + dT2_dT = 0.0; } T0 = pParam->B4SOIdvt0w * T2; DeltVthw = T0 * V0; + /* LFW_FD add/fix 5 derivatives */ + dDeltVthw_dVg = pParam->B4SOIdvt0w * dT2_dVg * V0; + dDeltVthw_dVd = pParam->B4SOIdvt0w * dT2_dVd * V0; dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - if (selfheat) /*dDeltVthw_dT = T0 * dvbi_dT;*/ /* v4.2 bugfix temp deriv */ - dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; /* v4.2 bugfix temp deriv */ + dDeltVthw_dVe = pParam->B4SOIdvt0w * dT2_dVe * V0; + if (selfheat) + dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; else dDeltVthw_dT = 0.0; T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); @@ -2467,10 +2576,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { + pParam->B4SOIkt2 * Vbseff); DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; /* v4.0 */ + /* LFW_FD add/fix 5 derivatives */ + dDeltVthtemp_dVg = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVg; + dDeltVthtemp_dVd = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVd; + dDeltVthtemp_dVb = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVb; + dDeltVthtemp_dVe = TempRatioMinus1 * pParam->B4SOIkt2 * dVbseff_dVe; if (selfheat) - /*dDeltVthtemp_dT = T1 / model->B4SOItnom; */ /* v4.2 bugfix temp deriv */ - /* fix below expression Wagner */ - /*dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model-> B4SOItnom; v4.2 bugfix temp deriv */ dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model-> B4SOItnom + pParam->B4SOIkt2 * TempRatioMinus1 * dVbseff_dT; else @@ -2483,30 +2594,42 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T9 = 1.0 / (3.0 - 2.0e4 * T3); T3 = (2.0e-4 - T3) * T9; T4 = T9 * T9 * pParam->B4SOIetab; - dT3_dVb = T4 ; + /* LFW_FD add/fix 4 derivatives */ + dT3_dVg = T4 * dVbseff_dVg; + dT3_dVd = T4 * dVbseff_dVd; + dT3_dVb = T4 * dVbseff_dVb; + dT3_dVe = T4 * dVbseff_dVe; } else { - dT3_dVb = pParam->B4SOIetab ; + /* LFW_FD add/fix 4 derivatives */ + dT3_dVg = pParam->B4SOIetab * dVbseff_dVg; + dT3_dVd = pParam->B4SOIetab * dVbseff_dVd; + dT3_dVb = pParam->B4SOIetab * dVbseff_dVb; + dT3_dVe = pParam->B4SOIetab * dVbseff_dVe; } /* DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb;*/ /* v4.2 bugfix */ + dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; v4.2 bugfix */ DIBL_Sft = T3 * theta0vb0 * Vds; - dDIBL_Sft_dVd = theta0vb0 * T3; + /* LFW_FD add/fix 4 derivatives */ + dDIBL_Sft_dVg = theta0vb0 * Vds * dT3_dVg; + dDIBL_Sft_dVd = theta0vb0 * (Vds * dT3_dVd + T3) ; dDIBL_Sft_dVb = theta0vb0 * Vds * dT3_dVb; - /* fix below expression Wagner */ - /*dDIBL_Sft_dT = T3 * Vds * dtheta0vb0_dT; v4.2 bug fix */ + dDIBL_Sft_dVe = theta0vb0 * Vds * dT3_dVe; dDIBL_Sft_dT = T3 * Vds * dtheta0vb0_dT + pParam->B4SOIetab * dVbseff_dT * theta0vb0 * Vds; + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); T9 = 2.2361 / sqrtPhi; sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); - dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); - /* fix 1st line of below expression Wagner */ - /*dsqrtPhisExt_dT = dsqrtPhis_dT - T9 * (dVbsh_dT) */ - dsqrtPhisExt_dT = dsqrtPhis_dT - T9 * (dVbsh_dT - dVbseff_dT) - + 2.2361 * dsqrtPhi_dT * (Vbsh - Vbseff) / phi; /* v4.2 bugfix temp deriv */ + /* LFW_FD add/fix 4 derivatives */ + dsqrtPhisExt_dVg = dsqrtPhis_dVg - T9 * (dVbsh_dVg - dVbseff_dVg); + dsqrtPhisExt_dVd = dsqrtPhis_dVd - T9 * (dVbsh_dVd - dVbseff_dVd); + dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - dVbseff_dVb); + dsqrtPhisExt_dVe = dsqrtPhis_dVe - T9 * (dVbsh_dVe - dVbseff_dVe); + dsqrtPhisExt_dT = dsqrtPhis_dT - T9 * (dVbsh_dT - dVbseff_dT) + + 2.2361 * dsqrtPhi_dT * (Vbsh - Vbseff) / phi; /* v4.2 bugfix temp deriv */ /* 4.1 */ T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); @@ -2519,12 +2642,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { +(pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; - if (selfheat){ - if (!model->B4SOIvth0Given) - dvth0_dT = dphi_dT + pParam->B4SOIk1eff * dsqrtPhi_dT; - else dvth0_dT=0;} - - else dvth0_dT=0; /* v4.2 temp deriv */ + /* LFW_FD add/fix 2 derivatives */ + dVth_dVg = pParam->B4SOIk1ox * dsqrtPhisExt_dVg * Lpe_Vb + - here->B4SOIk2ox * dVbseff_dVg - dDelt_vth_dVg - dDeltVthw_dVg + + pParam->B4SOIk3b * dVbseff_dVg * tmp2 + + dDeltVthtemp_dVg - dDIBL_Sft_dVg; /* LFW_FD fix line */ + dvth0_dT=0; @@ -2532,26 +2655,32 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox + pParam->B4SOIkt2 * TempRatioMinus1; - dVth_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhisExt_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; - /* this is actually dVth_dVbseff */ - dVth_dVd = -dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; + /* LFW_FD add/fix 4 derivatives */ + /* this is actually dVth_dVbseff */ + dVth_dVb = pParam->B4SOIk1ox * dsqrtPhisExt_dVb * Lpe_Vb + - here->B4SOIk2ox * dVbseff_dVb - dDelt_vth_dVb - dDeltVthw_dVb + + pParam->B4SOIk3b * dVbseff_dVb * tmp2 + + dDeltVthtemp_dVb - dDIBL_Sft_dVb - dDITS_Sft_dVb; + + dVth_dVd = pParam->B4SOIk1ox * dsqrtPhisExt_dVd * Lpe_Vb + - here->B4SOIk2ox * dVbseff_dVd - dDelt_vth_dVd - dDeltVthw_dVd + + pParam->B4SOIk3b * dVbseff_dVd * tmp2 + + dDeltVthtemp_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; + + dVth_dVe = pParam->B4SOIk1ox * dsqrtPhisExt_dVe * Lpe_Vb + - here->B4SOIk2ox * dVbseff_dVe - dDelt_vth_dVe - dDeltVthw_dVe + + pParam->B4SOIk3b * dVbseff_dVe * tmp2 + + dDeltVthtemp_dVe - dDIBL_Sft_dVe; /* LFW_FD fix line */ if (selfheat) - /* dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - - dDITS_Sft_dT; */ - /* fix below expression Wagner */ - /*dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - dDITS_Sft_dT - +(pParam->B4SOIk1ox * dsqrtPhisExt_dT- pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb - + model->B4SOItype * dvth0_dT - dDIBL_Sft_dT; v4.2 temp deriv */ - dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - +(pParam->B4SOIk1ox * dsqrtPhisExt_dT- pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb - - here->B4SOIk2ox*dVbseff_dT + pParam->B4SOIk3b*tmp2*dVbseff_dT - + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff)*dtmp2_dT - + model->B4SOItype * dvth0_dT - dDIBL_Sft_dT - dDITS_Sft_dT; /* v4.2 temp deriv */ - + /* dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + - dDITS_Sft_dT; */ + dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + +(pParam->B4SOIk1ox * dsqrtPhisExt_dT- pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb + - here->B4SOIk2ox*dVbseff_dT + pParam->B4SOIk3b*tmp2*dVbseff_dT + + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff)*dtmp2_dT + + model->B4SOItype * dvth0_dT - dDIBL_Sft_dT - dDITS_Sft_dT; /* v4.2 temp deriv */ else dVth_dT = 0.0; @@ -2608,17 +2737,18 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vthzb = model->B4SOItype * here->B4SOIvth0 - Delt_vthzb - DeltVthwzb + pParam->B4SOIk3 * tmp2 + DeltVthtempzb; - dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; dVthzb_dT = model->B4SOItype * dvth0_dT - dDelt_vthzb_dT - dDeltVthwzb_dT + pParam->B4SOIk3 * dtmp2_dT + dDeltVthtempzb_dT; /* v4.2 bugfix temp deriv */ - /* Vthzb2 = Vthzb + 1.12;*/ /* v4.1 */ /* v4.2 never used */ - } + /* Vthzb2 = Vthzb + 1.12; v4.1 */ /* v4.2 never used */ + } else /* LFW_FD */ + Vthzb = dVthzb_dT = 0.0; /* LFW_FD flexilint */ + /* Effective Vgst (Vgsteff) Calculation */ Vgst = Vgs_eff - Vth; - dVgst_dVg = dVgs_eff_dVg; + dVgst_dVg = dVgs_eff_dVg - dVth_dVg; /* LFW_FD fix derivative */ dVgst_dVd = -dVth_dVd; dVgst_dVb = -dVth_dVb; - /* 4 new lines Wagner */ + dVgst_dVe = -dVth_dVe; /* LFW_FD new line */ if (selfheat) { dVgst_dT = dVgs_eff_dT - dVth_dT; } @@ -2626,16 +2756,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T10 = n * Vtm; /* v4.0 */ VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) - / T10; /* v4.0 */ - /* 11 new lines Wagner */ + /* LFW_FD add/fix 4 derivatives */ + dVgstNVt_dVg = (pParam->B4SOImstar * dVgst_dVg - VgstNVt * dn_dVg * Vtm) / T10; + dVgstNVt_dVd = (pParam->B4SOImstar * dVgst_dVd - VgstNVt * dn_dVd * Vtm) / T10; + dVgstNVt_dVb = (pParam->B4SOImstar * dVgst_dVb - VgstNVt * dn_dVb * Vtm) / T10; + dVgstNVt_dVe = (pParam->B4SOImstar * dVgst_dVe - VgstNVt * dn_dVe * Vtm) / T10; + ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst)/T10; /* LFW_FD */ + /* LFW_FD add/fix 4 derivatives */ + dExpArg_dVg = (-(1- pParam->B4SOImstar) * dVgst_dVg - ExpArg * dn_dVg * Vtm) / T10; + dExpArg_dVd = (-(1- pParam->B4SOImstar) * dVgst_dVd - ExpArg * dn_dVd * Vtm) / T10; + dExpArg_dVb = (-(1- pParam->B4SOImstar) * dVgst_dVb - ExpArg * dn_dVb * Vtm) / T10; + dExpArg_dVe = (-(1- pParam->B4SOImstar) * dVgst_dVe - ExpArg * dn_dVe * Vtm) / T10; if (selfheat) { dT10_dT = n * dVtm_dT + dn_dT * Vtm; - /*fix below expression Wagner */ - /*dVgstNVt_dT = -(pParam->B4SOImstar*dVth_dT + VgstNVt*dT10_dT)/T10; */ dVgstNVt_dT = -(-pParam->B4SOImstar*dVgst_dT + VgstNVt*dT10_dT)/T10; - /*fix 1st line of below expression Wagner */ - /*dExpArg_dT = (1- pParam->B4SOImstar)*dVth_dT/T10 */ dExpArg_dT = -(1- pParam->B4SOImstar)*dVgst_dT/T10 -ExpArg*dT10_dT/T10; } @@ -2645,39 +2779,47 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dExpArg_dT = 0.0; } + /* LFW_FD new line */ + dExpVgst_dVg = dExpVgst_dVd = dExpVgst_dVb = dExpVgst_dVe = dExpVgst_dT = 0.0; /* MCJ: Very small Vgst */ if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; + { ExpVgst = 1.0; /* LFW_FD flexilint */ + Vgsteff = Vgst; /* T0 is dVgsteff_dVbseff */ T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; /* v3.0 */ - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; /* v3.0 */ + /* LFW_FD add/fix 5 derivatives */ + dVgsteff_dVg = dVgst_dVg; + dVgsteff_dVd = dVgst_dVd; + dVgsteff_dVb = dVgst_dVb; + dVgsteff_dVe = dVgst_dVe; if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; v3.0 */ - dVgsteff_dT = dVgst_dT; + dVgsteff_dT = dVgst_dT ; /* LFW */ else - dVgsteff_dT = 0.0; - dExpVgst_dT = 0.0; /* new line Wagner */ + dVgsteff_dT = 0.0; } else if (ExpArg > EXPL_THRESHOLD) { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtm); ExpVgst = exp(T0); + /* LFW_FD add/fix 4 derivatives */ + dExpVgst_dVg = (dVgst_dVg - T0 * dn_dVg * Vtm) /(n * Vtm); + dExpVgst_dVd = (dVgst_dVd - T0 * dn_dVd * Vtm) /(n * Vtm); + dExpVgst_dVb = (dVgst_dVb - T0 * dn_dVb * Vtm) /(n * Vtm); + dExpVgst_dVe = (dVgst_dVe - T0 * dn_dVe * Vtm) /(n * Vtm); /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; *//*v4.2 bug fix */ Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ T3 = Vgsteff / (n * Vtm) ; /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd)+ T1 * dVbseff_dVd; /* v3.0 */ - dVgsteff_dVe = T1 * dVbseff_dVe; /* v3.0 */ - dVgsteff_dVb = T1 * dVbseff_dVb; + /*T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb);*/ + /* LFW_FD fix T1 and 4 derivatives */ + T1 = -T3 * ( T0 * Vtm * dn_dVb); + dVgsteff_dVg = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVg; + dVgsteff_dVd = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVd; + dVgsteff_dVb = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVb; + dVgsteff_dVe = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVe; /* enhance next if-then-else block - Wagner*/ if (selfheat) { /* dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp+ T1 * dVbseff_dT;*/ /* v3.0 */ /* v4.2 temp deriv*/ + + Vgsteff / Temp+ T1 * dVbseff_dT; v3.0 */ /* v4.2 temp deriv*/ dVgsteff_dT = -T3 * (-dVgst_dT + T0 * dVtm_dT * n + Vtm * dn_dT) + Vgsteff / Temp+ T1 * dVbseff_dT; /*v4.2 temp deriv*/ dTL0_dT = (dVgst_dT - T0 * (dn_dT * Vtm + n * dVtm_dT)) / (n * Vtm); @@ -2691,17 +2833,22 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else { ExpVgst = exp(VgstNVt); + /* LFW_FD add/fix 4 derivatives */ + dExpVgst_dVg = ExpVgst * dVgstNVt_dVg; + dExpVgst_dVd = ExpVgst * dVgstNVt_dVd; + dExpVgst_dVb = ExpVgst * dVgstNVt_dVb; + dExpVgst_dVe = ExpVgst * dVgstNVt_dVe; /* 4 new lines Wagner */ if (selfheat) dExpVgst_dT = ExpVgst * dVgstNVt_dT; else dExpVgst_dT = 0.0; T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstar; - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; + /* LFW_FD add/fix 4 derivatives */ + dT1_dVg = T10 * dExpVgst_dVg / (1.0 + ExpVgst) + T1 * dn_dVg / n; + dT1_dVd = T10 * dExpVgst_dVd / (1.0 + ExpVgst) + T1 * dn_dVd / n; + dT1_dVb = T10 * dExpVgst_dVb / (1.0 + ExpVgst) + T1 * dn_dVb / n; + dT1_dVe = T10 * dExpVgst_dVe / (1.0 + ExpVgst) + T1 * dn_dVe / n; /*T3 = (1.0 / Temp); */ T3 = (1.0 / Temp + dn_dT / n); /* v4.2 temp deriv */ if (selfheat) @@ -2718,40 +2865,36 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { * exp(ExpArg) * (1 - pParam->B4SOImstar); /*v4.2 bug fix*/ T2 = pParam->B4SOImstar - T10 * dT2_dVg / (1.0 - pParam->B4SOImstar); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dn_dVd - / (1.0 - pParam->B4SOImstar)) - + (T2 - pParam->B4SOImstar) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dn_dVb - / (1.0 - pParam->B4SOImstar)) - + (T2 - pParam->B4SOImstar) / n * dn_dVb; + /* LFW_FD fix all 5 T2 derivatives */ + TL1 = dT2_dVg; + dTL1_dVg = TL1 * dExpArg_dVg; + dTL1_dVd = TL1 * dExpArg_dVd; + dTL1_dVb = TL1 * dExpArg_dVb; + dTL1_dVe = TL1 * dExpArg_dVe; + dT2_dVg = -(dn_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstar); + dT2_dVd = -(dn_dVd * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstar); + dT2_dVb = -(dn_dVb * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstar); + dT2_dVe = -(dn_dVe * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstar); if (selfheat) - /*fix below expression Wagner */ - /*dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 - / (1.0 - pParam->B4SOImstar) ); */ - dT2_dT = -(dT10_dT*dT2_dVg - +T10*dT2_dVg*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) - )/(1.0 - pParam->B4SOImstar); + dT2_dT = -(dT10_dT * TL1 + +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) + )/(1.0 - pParam->B4SOImstar); else - dT2_dT = 0.0; + dT2_dT = 0.0; Vgsteff = T1 / T2; T3 = T2 * T2; /* T4 is dVgsteff_dVbseff */ T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; /* v3.0 */ - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; /* v3.0 */ + /* LFW_FD fix 4 derivatives */ + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; v3.0 */ - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; + dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; else - dVgsteff_dT = 0.0; + dVgsteff_dT = 0.0; } Vgst2Vtm = Vgsteff + 2.0 * Vtm; if (selfheat) dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; /* v3.1.1 bug fix */ @@ -2761,15 +2904,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.0 F-factor (degradation factor due to pocket implant) */ if (pParam->B4SOIfprout <= 0.0) { FP = 1.0; - dFP_dVg = dFP_dT = 0.0; + /* LFW_FD enhance line */ + dFP_dVg = dFP_dVb = dFP_dVd = dFP_dVe = dFP_dT = 0.0; } else { T9 = pParam->B4SOIfprout * sqrt(Leff) / Vgst2Vtm; FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - /* fix "then" expression Wagner */ - /*if (selfheat) dFP_dT = dFP_dVg * dVgst2Vtm_dT;*/ - if (selfheat) dFP_dT = FP * T9 * dVgst2Vtm_dT / (1.0 + T9) / Vgst2Vtm; + /* LFW_FD fix/add 5 derivatives */ + dFP_dVg = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVg; + dFP_dVb = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVb; + dFP_dVd = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVd; + dFP_dVe = FP * FP * T9 / Vgst2Vtm * dVgsteff_dVe; + if (selfheat) + dFP_dT = FP * T9 * dVgst2Vtm_dT / (1.0 + T9) / Vgst2Vtm; else dFP_dT = 0.0; } @@ -2777,9 +2924,15 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T9 = sqrtPhis - sqrtPhi; Weff = pParam->B4SOIweff - (2.0 - here->B4SOInbc) * (pParam->B4SOIdwg * Vgsteff + pParam->B4SOIdwb * T9); - dWeff_dVg = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwg; - dWeff_dVb = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwb - * dsqrtPhis_dVb; + /* LFW_FD fix/add 4 derivatives */ + dWeff_dVg = -(2.0 - here->B4SOInbc) * + (pParam->B4SOIdwg * dVgsteff_dVg + pParam->B4SOIdwb * dsqrtPhis_dVg); + dWeff_dVb = -(2.0 - here->B4SOInbc) * + (pParam->B4SOIdwg * dVgsteff_dVb + pParam->B4SOIdwb * dsqrtPhis_dVb); + dWeff_dVd = -(2.0 - here->B4SOInbc) * + (pParam->B4SOIdwg * dVgsteff_dVd + pParam->B4SOIdwb * dsqrtPhis_dVd); + dWeff_dVe = -(2.0 - here->B4SOInbc) * + (pParam->B4SOIdwg * dVgsteff_dVe + pParam->B4SOIdwb * dsqrtPhis_dVe); /* New - next 5 lines - Wagner */ if (selfheat) dWeff_dT = -(2.0 - here->B4SOInbc) * @@ -2793,20 +2946,32 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 *= T0 * 4.0e-16; dWeff_dVg *= T0; dWeff_dVb *= T0; + /* LFW_FD add 2 derivatives */ + dWeff_dVd *= T0; + dWeff_dVe *= T0; dWeff_dT *= T0; /* new line - Wagner */ } if (model->B4SOIrdsMod == 1) /* v4.0 */ - Rds = dRds_dVg = dRds_dVb = dRds_dT = 0.0; + /* LFW_FD enhance line */ + Rds = dRds_dVg = dRds_dVb = dRds_dVd = dRds_dVe = dRds_dT = 0.0; else { T0 = pParam->B4SOIprwg * Vgsteff + pParam->B4SOIprwb * T9; + /* LFW_FD add 4 derivatives */ + dT0_dVg = pParam->B4SOIprwg * dVgsteff_dVg + pParam->B4SOIprwb * dsqrtPhis_dVg; + dT0_dVb = pParam->B4SOIprwg * dVgsteff_dVb + pParam->B4SOIprwb * dsqrtPhis_dVb; + dT0_dVd = pParam->B4SOIprwg * dVgsteff_dVd + pParam->B4SOIprwb * dsqrtPhis_dVd; + dT0_dVe = pParam->B4SOIprwg * dVgsteff_dVe + pParam->B4SOIprwb * dsqrtPhis_dVe; dT0_dT = pParam->B4SOIprwg*dVgsteff_dT + pParam->B4SOIprwb*(dsqrtPhis_dT - dsqrtPhi_dT); /* new expression Wagner */ if (T0 >= -0.9) { Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B4SOIprwg; - dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb; + /* LFW_FD add/fix 4 derivatives */ + dRds_dVg = rds0 * dT0_dVg; + dRds_dVb = rds0 * dT0_dVb; + dRds_dVd = rds0 * dT0_dVd; + dRds_dVe = rds0 * dT0_dVe; if (selfheat && (Rds!=0.0)) /*fix below expression Wagner */ @@ -2819,10 +2984,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* to avoid the discontinuity problem due to prwg and prwb*/ { T1 = 1.0 / (17.0 + 20.0 * T0); Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B4SOIprwg * T1; - dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb - * T1; + /* LFW_FD add/fix 4 derivatives */ + dRds_dVg = (rds0*T1- 20*Rds*T1) * dT0_dVg; + dRds_dVb = (rds0*T1- 20*Rds*T1) * dT0_dVb; + dRds_dVd = (rds0*T1- 20*Rds*T1) * dT0_dVd; + dRds_dVe = (rds0*T1- 20*Rds*T1) * dT0_dVe; if (selfheat && (Rds!=0.0)) /*fix below expression Wagner */ @@ -2832,32 +2998,38 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dRds_dT = 0.0; } - /* here->B4SOIrds = Rds;*/ /* v2.2.3 bug fix */ /* v4.2 bugfix # 39 */ + /* here->B4SOIrds = Rds; v2.2.3 bug fix */ /* v4.2 bugfix # 39 */ } - here->B4SOIrds = Rds; /* v4.2 bugfix # 39 */ + here->B4SOIrds = Rds / here->B4SOInf; /* LFW_FD fix */ /* Calculate Abulk */ if (pParam->B4SOIa0 == 0.0) { Abulk0 = Abulk = 1.0; - dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - dAbulk0_dT = dAbulk_dT = 0.0; /* new line Wagner */ + /* LFW_FD expand next 3 lines */ + dAbulk_dVg = dAbulk_dVb = dAbulk_dVd = dAbulk_dVe = 0.0; + dAbulk0_dVg = dAbulk0_dVb = dAbulk0_dVd = dAbulk0_dVe = 0.0; + dAbulk0_dT = dAbulk_dT = 0.0; } else { T10 = pParam->B4SOIketa * Vbsh; if (T10 >= -0.9) { T11 = 1.0 / (1.0 + T10); + /* LFW_FD add/fix 5 derivatives */ + dT11_dVg = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVg; dT11_dVb = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVb; - // new line below - Wagner - dT11_dT = -pParam->B4SOIketa * T11 * T11 * dVbsh_dT; + dT11_dVd = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVd; + dT11_dVe = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVe; + dT11_dT = -pParam->B4SOIketa * T11 * T11 * dVbsh_dT; } else { /* added to avoid the problems caused by Keta */ T12 = 1.0 / (0.8 + T10); T11 = (17.0 + 20.0 * T10) * T12; - // fix line below - Wagner - // dT11_dVb = -pParam->B4SOIketa * T12 * T12 * dVbsh_dVb; + /* LFW_FD add/fix 5 derivatives */ + dT11_dVg = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVg; dT11_dVb = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVb; - // new line below - Wagner + dT11_dVd = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVd; + dT11_dVe = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dVe; dT11_dT = (20.0-T11) * T12 * pParam->B4SOIketa * dVbsh_dT; } @@ -2865,28 +3037,35 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T10 = phi + pParam->B4SOIketas; T13 = (Vbsh * T11) / T10; + /* LFW_FD add/fix 5 derivatives */ + dT13_dVg = (Vbsh * dT11_dVg + T11 * dVbsh_dVg) / T10; dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; - // new line below - Wagner + dT13_dVd = (Vbsh * dT11_dVd + T11 * dVbsh_dVd) / T10; + dT13_dVe = (Vbsh * dT11_dVe + T11 * dVbsh_dVe) / T10; dT13_dT = (dVbsh_dT * T11 + Vbsh * dT11_dT - T13 * dphi_dT) / T10; /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ if (T13 < 0.96) { T14 = 1 / sqrt(1-T13); T10 = 0.5 * T14 / (1-T13); + /* LFW_FD add/fix 5 derivatives */ + dT14_dVg = T10 * dT13_dVg; dT14_dVb = T10 * dT13_dVb; - // new line below - Wagner + dT14_dVd = T10 * dT13_dVd; + dT14_dVe = T10 * dT13_dVe; dT14_dT = T10 * dT13_dT; } else { /* IBM tweak */ T11 = 1.0 / (1.0 - 1.0593220339*T13); T14 = (6.0169491525 - 6.3559322034 * T13) * T11; - // T10 = 0.0179546 * T11 * T11; // never used - Wagner - // fix line below - Wagner - // dT14_dVb = T10 * dT13_dVb; + /* T10 = 0.0179546 * T11 * T11; never used - Wagner */ + /* LFW_FD add/fix 5 derivatives */ + dT14_dVg = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVg; dT14_dVb = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVb; - // new line below - Wagner - dT14_dT = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dT; + dT14_dVd = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVd; + dT14_dVe = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dVe; + dT14_dT = (T14 * 1.0593220339 - 6.3559322034) * T11 * dT13_dT; } /* v3.0 bug fix */ @@ -2896,7 +3075,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { / sqrt(phi + pParam->B4SOIketas); /* v4.0 */ T1 = T10 * T14; + /* LFW_FD add/fix 4 derivatives */ + dT1_dVg = T10 * dT14_dVg; dT1_dVb = T10 * dT14_dVb; + dT1_dVd = T10 * dT14_dVd; + dT1_dVe = T10 * dT14_dVe; T9 = sqrt(pParam->B4SOIxj * Xdep); tmp1 = Leff + 2.0 * T9; @@ -2905,30 +3088,50 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { tmp3 = pParam->B4SOIweff + pParam->B4SOIb1; tmp4 = pParam->B4SOIb0 / tmp3; T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; + /* LFW_FD add/fix 4 derivatives */ + dT2_dVg = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVg / T9; + dT2_dVb = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVb / T9; + dT2_dVd = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVd / T9; + dT2_dVe = -tmp2 / tmp1 * pParam->B4SOIxj * dXdep_dVe / T9; T6 = T5 * T5; T7 = T5 * T6; + /* LFW_FD add 4 derivatives */ + dT7_dVg = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVg / T9; + dT7_dVb = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVb / T9; + dT7_dVd = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVd / T9; + dT7_dVe = -3.0 * T7 / tmp1 * pParam->B4SOIxj * dXdep_dVe / T9; Abulk0 = 1 + T1 * T2; + /* LFW_FD add/fix 4 derivatives */ + dAbulk0_dVg = T1 * dT2_dVg + T2 * dT1_dVg; dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; + dAbulk0_dVd = T1 * dT2_dVd + T2 * dT1_dVd; + dAbulk0_dVe = T1 * dT2_dVe + T2 * dT1_dVe; T8 = pParam->B4SOIags * pParam->B4SOIa0 * T7; dAbulk_dVg = -T1 * T8; Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); + /* LFW_FD add/fix 4 derivatives */ + dAbulk_dVg = dAbulk0_dVg + dAbulk_dVg * dVgsteff_dVg + - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVg + T8 * dT1_dVg) * Vgsteff; + dAbulk_dVb = dAbulk0_dVb - T1 * T8 * dVgsteff_dVb + - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVb + T8 * dT1_dVb) * Vgsteff; + dAbulk_dVd = dAbulk0_dVd - T1 * T8 * dVgsteff_dVd + - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVd + T8 * dT1_dVd) * Vgsteff; + dAbulk_dVe = dAbulk0_dVe - T1 * T8 * dVgsteff_dVe + - (T1 * pParam->B4SOIags * pParam->B4SOIa0 * dT7_dVe + T8 * dT1_dVe) * Vgsteff; /* 21 new lines Wagner */ /* need temperature derivs of Abulk & Abulk0 */ TL2 = phi + pParam->B4SOIketas; dTL1_dT = -0.5*T10/TL2*dphi_dT; - // TL2 = T14; // not used - Wagner + /* TL2 = T14; not used - Wagner */ dTL3_dT = (0.5*pParam->B4SOIxj/T9)*dXdep_dT; dTL4_dT = -2*tmp2*dTL3_dT/tmp1; - // dTL5_dT = -T13*dphi_dT/(phi + pParam->B4SOIketas); // not used - Wagner - // dTL6_dT = 0.5*T14*dTL5_dT/(1-T13); // not used - Wagner - // fix line below - Wagner - // dTL7_dT = T10*dTL6_dT + T14*dTL1_dT; + /* dTL5_dT = -T13*dphi_dT/(phi + pParam->B4SOIketas); not used - Wagner */ + /* dTL6_dT = 0.5*T14*dTL5_dT/(1-T13); not used - Wagner */ + /* fix line below - Wagner */ + /* dTL7_dT = T10*dTL6_dT + T14*dTL1_dT; */ dTL7_dT = T10*dT14_dT + T14*dTL1_dT; dTL8_dT = -pParam->B4SOIags*pParam->B4SOIa0*6*T7*dTL3_dT/tmp1; dTL9_dT = -dTL7_dT*T8 - T1*dTL8_dT; @@ -2947,11 +3150,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T9 = 1.0 / (3.0 - 200.0 * Abulk0); Abulk0 = (0.02 - Abulk0) * T9; - // fix line below - Wagner - // dAbulk0_dVb *= T9 * T9; + /* fix line below - Wagner */ + /* dAbulk0_dVb *= T9 * T9; */ T10 = (200.0 * Abulk0 - 1.0) * T9; + /* LFW_FD add/fix 5 derivatives */ + dAbulk0_dVg *= T10; dAbulk0_dVb *= T10; - // new line below - Wagner + dAbulk0_dVd *= T10; + dAbulk0_dVe *= T10; dAbulk0_dT *= T10; } @@ -2959,13 +3165,15 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T9 = 1.0 / (3.0 - 200.0 * Abulk); Abulk = (0.02 - Abulk) * T9; - // fix line below - Wagner - // dAbulk_dVb *= T9 * T9; - // T10 = T9 * T9; /* 3.2 bug fix */ + /* fix line below - Wagner */ + /* dAbulk_dVb *= T9 * T9; */ + /* T10 = T9 * T9; 3.2 bug fix */ T10 = (200.0 * Abulk - 1.0) * T9; + /* LFW_FD add/fix 5 derivatives */ dAbulk_dVg *= T10; /* 3.2 bug fix */ - dAbulk_dVb *= T10; - // new line below - Wagner + dAbulk_dVb *= T10; /* 3.2 bug fix */ + dAbulk_dVd *= T10; /* 3.2 bug fix */ + dAbulk_dVe *= T10; dAbulk_dT *= T10; } @@ -2993,38 +3201,43 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = ua + uc * Vbseff; T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; + /* LFW_FD fix 5 derivatives */ + dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVg + 2 * dVth_dVg) + + T3 * uc * dVbseff_dVg; + dDenomi_dVb = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVb + 2 * dVth_dVb) + + T3 * uc * dVbseff_dVb; + dDenomi_dVd = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVd + 2 * dVth_dVd) + + T3 * uc * dVbseff_dVd; + dDenomi_dVe = (T2 + 2.0 * ub * T3) / toxe_mob * (dVgsteff_dVe + 2 * dVth_dVe) + + T3 * uc * dVbseff_dVe; + if (selfheat) - /* fix 1st line of below expression Wagner */ - /*dDenomi_dT = dDenomi_dVg * 2 * dVth_dT */ - dDenomi_dT = dDenomi_dVg * (2 * dVth_dT + dVgsteff_dT - dT14_dT) - + (dua_dT + Vbseff * duc_dT - + dub_dT * T3 ) * T3; + dDenomi_dT = (T2 + 2.0 * ub * T3) / toxe_mob * (2 * dVth_dT + dVgsteff_dT - dT14_dT) + + (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT + + dub_dT * T3 ) * T3; else - dDenomi_dT = 0.0; + dDenomi_dT = 0.0; } else if (model->B4SOImobMod == 2) /* Bug fix #5 Jun 09 implementing Eeff correctly*/ { T5 = (Vgsteff -T14)/ toxe * (ua /* MobMod=2 does not use Eeff */ + uc * Vbseff + ub * (Vgsteff -T14) /* 'toxe' keeps code consistent with BSIMSOI4.1 Manual*/ / toxe); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * (Vgsteff -T14) / toxe) - / toxe; - dDenomi_dVd = 0.0; - dDenomi_dVb = (Vgsteff -T14) * uc / toxe; - if (selfheat) - /*fix below expression Wagner */ - /*dDenomi_dT = (Vgsteff -T14) / toxe - * (dua_dT + Vbseff * duc_dT + dub_dT - * (Vgsteff -T14) / toxe);*/ - dDenomi_dT = dDenomi_dVg * (dVgsteff_dT - dT14_dT) - + (Vgsteff -T14)/ toxe - * (dua_dT + Vbseff * duc_dT + dub_dT - * (Vgsteff -T14)/ toxe); - else - dDenomi_dT = 0.0; + /* LFW_FD fix 5 derivatives */ + dDenomi_dVg = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVg + + (Vgsteff -T14) /toxe * uc * dVbseff_dVg; + dDenomi_dVb = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVb + + (Vgsteff -T14) /toxe * uc * dVbseff_dVb; + dDenomi_dVd = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVd + + (Vgsteff -T14) /toxe * uc * dVbseff_dVd; + dDenomi_dVe = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * dVgsteff_dVe + + (Vgsteff -T14) / toxe * uc * dVbseff_dVe; + if (selfheat) + dDenomi_dT = (ua + uc * Vbseff + 2.0 * ub * (Vgsteff -T14) / toxe) / toxe * (dVgsteff_dT-dT14_dT) + + (Vgsteff -T14)/ toxe + * (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT + dub_dT + * (Vgsteff -T14)/ toxe); + else + dDenomi_dT = 0.0; } else if (model->B4SOImobMod == 3) /* mobMod == 3 */ { T0 = Vgsteff + Vth + Vth - T14; @@ -3032,19 +3245,21 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ T4 = T3 * (ua + ub * T3); T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb - + uc * T4 ; + /* LFW_FD fix 5 derivatives */ + dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVg + 2 * dVth_dVg) / toxe_mob + + T4 * uc * dVbseff_dVg; + dDenomi_dVb = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVb + 2 * dVth_dVb) / toxe_mob + + T4 * uc * dVbseff_dVb; + dDenomi_dVd = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVd + 2 * dVth_dVd) / toxe_mob + + T4 * uc * dVbseff_dVd; + dDenomi_dVe = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dVe + 2 * dVth_dVe) / toxe_mob + + T4 * uc * dVbseff_dVe; if (selfheat) - /*fix line 1 of below expression Wagner */ - /*dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT */ - dDenomi_dT = dDenomi_dVg * (2 * dVth_dT + dVgsteff_dT - dT14_dT) - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; + dDenomi_dT = (ua + 2.0 * ub * T3) * T2 * (dVgsteff_dT + 2 * dVth_dT) / toxe_mob + + (dua_dT + dub_dT * T3) * T3 * T2 + + T4 * (Vbseff * duc_dT + uc * dVbseff_dT); else - dDenomi_dT = 0.0; + dDenomi_dT = 0.0; } else /* mobMod == 4 */ { @@ -3052,7 +3267,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 = (Vgsteff + here->B4SOIvtfbphi1)* 1.0e-8 / toxe/6.0; T1 = exp(pParam->B4SOIeu * log(T0)); /* MobMod=4 does not use Eeff */ /* using 'toxe' keeps code consistent with BSIM4 formulation */ - dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0; + /* LFW_FD add/fix 5 derivatives */ + dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVg; + dT1_dVb = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVb; + dT1_dVd = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVd; + dT1_dVe = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dVe; + dT1_dT = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0 * dVgsteff_dT; /*T2 = pParam->B4SOIua + pParam->B4SOIuc * Vbseff; */ /* v4.2 bugfix # 35 */ T2 = ua + uc * Vbseff; @@ -3071,19 +3291,25 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /*dT11_dVg = - 0.5 * pParam->B4SOIucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth;*/ /* dT11_dVg = (pParam->B4SOIucs - 1.0)*pParam->B4SOIud/(VgsteffVth* exp((pParam->B4SOIucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); Bug# 21 Jul09*/ - dT11_dVg = (ucs - 1.0)*ud/(VgsteffVth* exp((ucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); /* Bug Fix # 21 Jul09*/ + /* LFW_FD add/fix 5 derivatives */ + dT11_dVg = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVg / VgsteffVth; + dT11_dVb = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVb / VgsteffVth; + dT11_dVd = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVd / VgsteffVth; + dT11_dVe = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dVe / VgsteffVth; + dT11_dT = - ud * ucs * exp(-(ucs+1.0) * log(1.0 + Vgsteff/VgsteffVth)) * dVgsteff_dT / VgsteffVth; - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - /* dDenomi_dVb = T1 * pParam->B4SOIuc; v4.2 bugfix # 35 */ - dDenomi_dVb = T1 * uc; T5 = T1 * T2 + T11; + /* LFW_FD add/fix 5 derivatives */ + dDenomi_dVg = T2 * dT1_dVg + T1 * uc * dVbseff_dVg + dT11_dVg; + dDenomi_dVb = T2 * dT1_dVb + T1 * uc * dVbseff_dVb + dT11_dVb; + dDenomi_dVd = T2 * dT1_dVd + T1 * uc * dVbseff_dVd + dT11_dVd; + dDenomi_dVe = T2 * dT1_dVe + T1 * uc * dVbseff_dVe + dT11_dVe; + if (selfheat) - dDenomi_dT = dDenomi_dVg * pParam->B4SOIeu * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; + dDenomi_dT = T2 * dT1_dT + T1 * (dua_dT + Vbseff * duc_dT + uc * dVbseff_dT) + dT11_dT; + else - dDenomi_dT = 0.0; + dDenomi_dT = 0.0; } @@ -3097,6 +3323,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dDenomi_dVg *= T9; dDenomi_dVd *= T9; dDenomi_dVb *= T9; + dDenomi_dVe *= T9; /* LFW_FD new line */ if (selfheat) dDenomi_dT *= T9; else dDenomi_dT = 0.0; } @@ -3106,12 +3333,18 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; dueff_dVb = T9 * dDenomi_dVb; + dueff_dVe = T9 * dDenomi_dVe; /* LFW_FD new line */ if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; else dueff_dT = 0.0; /* Saturation Drain Voltage Vdsat */ WVCox = Weff * vsattemp * model->B4SOIcox; WVCoxRds = WVCox * Rds; + /* LFW_FD add 4 derivatives */ + dWVCoxRds_dVg = WVCox * dRds_dVg + Rds * vsattemp * model->B4SOIcox * dWeff_dVg; + dWVCoxRds_dVb = WVCox * dRds_dVb + Rds * vsattemp * model->B4SOIcox * dWeff_dVb; + dWVCoxRds_dVd = WVCox * dRds_dVd + Rds * vsattemp * model->B4SOIcox * dWeff_dVd; + dWVCoxRds_dVe = WVCox * dRds_dVe + Rds * vsattemp * model->B4SOIcox * dWeff_dVe; /* 5 lines new - Wagner */ if (selfheat) dWVCoxRds_dT = model->B4SOIcox * Rds * @@ -3128,6 +3361,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dEsatL_dVg = T0 * dueff_dVg; dEsatL_dVd = T0 * dueff_dVd; dEsatL_dVb = T0 * dueff_dVb; + dEsatL_dVe = T0 * dueff_dVe; /* LFW_FD new line */ if (selfheat) dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; else @@ -3137,8 +3371,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { a1 = pParam->B4SOIa1; if (a1 == 0.0) { Lambda = pParam->B4SOIa2; + /* LFW_FD add/fix 5 derivatives */ dLambda_dVg = 0.0; - dLambda_dT = 0.0; /* new line Wagner */ + dLambda_dVb = 0.0; + dLambda_dVd = 0.0; + dLambda_dVe = 0.0; + dLambda_dT = 0.0; } else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ @@ -3146,11 +3384,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = T0 - pParam->B4SOIa1 * Vgsteff - 0.0001; T2 = sqrt(T1 * T1 + 0.0004 * T0); Lambda = pParam->B4SOIa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); - /* 5 new lines Wagner */ + /* LFW_FD add/fix 5 derivatives */ + dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVg; + dLambda_dVb = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVb; + dLambda_dVd = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVd; + dLambda_dVe = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVe; if (selfheat) { dT1_dT = - pParam->B4SOIa1 * dVgsteff_dT; - /*dT2_dT = 0.5 * T1 * dT1_dT / T2; fixed below */ dT2_dT = T1 * dT1_dT / T2; dLambda_dT = -0.5 * (dT1_dT + dT2_dT); } else dLambda_dT = 0.0; @@ -3159,11 +3399,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T1 = pParam->B4SOIa2 + pParam->B4SOIa1 * Vgsteff - 0.0001; T2 = sqrt(T1 * T1 + 0.0004 * pParam->B4SOIa2); Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); - /* 5 new lines Wagner */ + /* LFW_FD add/fix 5 derivatives */ + dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVg; + dLambda_dVb = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVb; + dLambda_dVd = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVd; + dLambda_dVe = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2) * dVgsteff_dVe; if (selfheat) { dT1_dT = pParam->B4SOIa1 * dVgsteff_dT; - /*dT2_dT = 0.5 * T1 * dT1_dT / T2; fixed below */ dT2_dT = T1 * dT1_dT / T2; dLambda_dT = 0.5 * (dT1_dT + dT2_dT); } else dLambda_dT = 0.0; @@ -3187,19 +3429,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T3 = EsatL * Vgst2Vtm; Vdsat = T3 * T0; - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; + /* LFW_FD add/fix 5 derivatives */ + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + dVgsteff_dVg) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd + EsatL * dAbulk_dVd + dVgsteff_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + dVgsteff_dVb) * T1; + dT0_dVe = -(Abulk * dEsatL_dVe + EsatL * dAbulk_dVe + dVgsteff_dVe) * T1; if (selfheat) - dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; + dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; else dT0_dT = 0.0; - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + /* LFW_FD add/fix 5 derivatives */ + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0 *dVgsteff_dVg; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb + EsatL * T0 *dVgsteff_dVb; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd + EsatL * T0 *dVgsteff_dVd; + dVdsat_dVe = T3 * dT0_dVe + T2 * dEsatL_dVe + EsatL * T0 *dVgsteff_dVe; if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; + dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT + + EsatL * T0 * dVgst2Vtm_dT; else dVdsat_dT = 0.0; } else @@ -3209,13 +3455,15 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T7 = Vgst2Vtm * T9; T6 = Vgst2Vtm * WVCoxRds; T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - /* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; + /* LFW_FD add/fix 4 derivatives */ + dT0_dVg = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVg + + Abulk * Abulk * dWVCoxRds_dVg - Abulk * dLambda_dVg / (Lambda * Lambda)); + dT0_dVb = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVb + + Abulk * Abulk * dWVCoxRds_dVb - Abulk * dLambda_dVb / (Lambda * Lambda)); + dT0_dVd = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVd + + Abulk * Abulk * dWVCoxRds_dVd - Abulk * dLambda_dVd / (Lambda * Lambda)); + dT0_dVe = 2.0 * ((2.0 * Abulk * WVCoxRds - 1.0 + 1.0 / Lambda) * dAbulk_dVe + + Abulk * Abulk * dWVCoxRds_dVe - Abulk * dLambda_dVe / (Lambda * Lambda)); if (selfheat) { @@ -3239,12 +3487,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg - + 3.0 * (T9 + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; + /* LFW_FD add/fix 4 derivatives */ + dT1_dVg = (2.0 / Lambda - 1.0) * dVgsteff_dVg - 2.0 * Vgst2Vtm * dLambda_dVg / (Lambda * Lambda) + + EsatL * dAbulk_dVg + Abulk * dEsatL_dVg + + 3.0 * (dVgsteff_dVg * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVg * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVg); + dT1_dVb = (2.0 / Lambda - 1.0) * dVgsteff_dVb - 2.0 * Vgst2Vtm * dLambda_dVb / (Lambda * Lambda) + + EsatL * dAbulk_dVb + Abulk * dEsatL_dVb + + 3.0 * (dVgsteff_dVb * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVb * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVb); + dT1_dVd = (2.0 / Lambda - 1.0) * dVgsteff_dVd - 2.0 * Vgst2Vtm * dLambda_dVd / (Lambda * Lambda) + + EsatL * dAbulk_dVd + Abulk * dEsatL_dVd + + 3.0 * (dVgsteff_dVd * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVd * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVd); + dT1_dVe = (2.0 / Lambda - 1.0) * dVgsteff_dVe - 2.0 * Vgst2Vtm * dLambda_dVe / (Lambda * Lambda) + + EsatL * dAbulk_dVe + Abulk * dEsatL_dVe + + 3.0 * (dVgsteff_dVe * Abulk * WVCoxRds + Vgst2Vtm * dAbulk_dVe * WVCoxRds + Vgst2Vtm * Abulk * dWVCoxRds_dVe); /* fix below "if" expresssion - Wagner */ /*if (selfheat) @@ -3264,10 +3519,15 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dT1_dT = 0.0; T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; + /* LFW_FD add/fix 4 derivatives */ + dT2_dVg = dVgsteff_dVg * (EsatL + 4.0 * T6) + + Vgst2Vtm * (dEsatL_dVg + 2 * Vgst2Vtm * dWVCoxRds_dVg); + dT2_dVb = dVgsteff_dVb * (EsatL + 4.0 * T6) + + Vgst2Vtm * (dEsatL_dVb + 2 * Vgst2Vtm * dWVCoxRds_dVb); + dT2_dVd = dVgsteff_dVd * (EsatL + 4.0 * T6) + + Vgst2Vtm * (dEsatL_dVd + 2 * Vgst2Vtm * dWVCoxRds_dVd); + dT2_dVe = dVgsteff_dVe * (EsatL + 4.0 * T6) + + Vgst2Vtm * (dEsatL_dVe + 2 * Vgst2Vtm * dWVCoxRds_dVe); if (selfheat) /* fix below expression - Wagner */ /*dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT @@ -3284,7 +3544,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + /* LFW_FD add/fix 2 derivatives */ + dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - dT0_dVd * T2 + - T0 * dT2_dVd) / T3 - Vdsat * dT0_dVd) / T0; + dVdsat_dVe = (dT1_dVe - (T1 * dT1_dVe - dT0_dVe * T2 + - T0 * dT2_dVe) / T3 - Vdsat * dT0_dVe) / T0; if (selfheat) dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; @@ -3298,6 +3562,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dT1_dVg = dVdsat_dVg; dT1_dVd = dVdsat_dVd - 1.0; dT1_dVb = dVdsat_dVb; + dT1_dVe = dVdsat_dVe; /* LFW_FD new line */ dT1_dT = dVdsat_dT; T2 = sqrt(T1 * T1 + 4.0 * pParam->B4SOIdelta * Vdsat); @@ -3306,6 +3571,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + dT2_dVe = T0 * dT1_dVe + T3 * dVdsat_dVe; /* LFW_FD new line */ if (selfheat) dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; else dT2_dT = 0.0; @@ -3314,6 +3580,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + dVdseff_dVe = dVdsat_dVe - 0.5 * (dT1_dVe + dT2_dVe); /* LFW_FD new line */ if (selfheat) dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); else dVdseff_dT = 0.0; @@ -3332,13 +3599,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + /* LFW_FD fix/add 4 derivatives */ + dT0_dVg = dEsatL_dVg + dVdsat_dVg + + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVg + dWVCoxRds_dVg * Vgsteff) + - T9 * (0.5 * (Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat + - Abulk * Vdsat * dVgsteff_dVg / Vgst2Vtm) / Vgst2Vtm)); + dT0_dVb = dEsatL_dVb + dVdsat_dVb + + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVb + dWVCoxRds_dVb * Vgsteff) + - T9 * (0.5 * (Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat + - Abulk * Vdsat * dVgsteff_dVb / Vgst2Vtm) / Vgst2Vtm)); + dT0_dVd = dEsatL_dVd + dVdsat_dVd + + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVd + dWVCoxRds_dVd * Vgsteff) + - T9 * (0.5 * (Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat + - Abulk * Vdsat * dVgsteff_dVd / Vgst2Vtm) / Vgst2Vtm)); + dT0_dVe = dEsatL_dVe + dVdsat_dVe + + 2.0 * (tmp4 * (WVCoxRds * dVgsteff_dVe + dWVCoxRds_dVe * Vgsteff) + - T9 * (0.5 * (Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat + - Abulk * Vdsat * dVgsteff_dVe / Vgst2Vtm) / Vgst2Vtm)); if (selfheat) { @@ -3360,8 +3637,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T9 = WVCoxRds * Abulk; T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + /* LFW_FD fix/add 4 derivatives */ + dT1_dVg = -2.0 * dLambda_dVg / (Lambda * Lambda) + WVCoxRds * dAbulk_dVg + dWVCoxRds_dVg * Abulk; + dT1_dVb = -2.0 * dLambda_dVb / (Lambda * Lambda) + WVCoxRds * dAbulk_dVb + dWVCoxRds_dVb * Abulk; + dT1_dVd = -2.0 * dLambda_dVd / (Lambda * Lambda) + WVCoxRds * dAbulk_dVd + dWVCoxRds_dVd * Abulk; + dT1_dVe = -2.0 * dLambda_dVe / (Lambda * Lambda) + WVCoxRds * dAbulk_dVe + dWVCoxRds_dVe * Abulk; if (selfheat) /* fix below expression - Wagner */ /*dT1_dT = T9 * tmp4;*/ @@ -3374,7 +3654,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vasat = T0 / T1; dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; + /* LFW_FD fix/add 2 derivatives */ + dVasat_dVd = (dT0_dVd - Vasat * dT1_dVd) / T1; + dVasat_dVe = (dT0_dVe - Vasat * dT1_dVe) / T1; if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; else dVasat_dT = 0.0; @@ -3383,12 +3665,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T0 = 1.0 / (pParam->B4SOIpclm * Abulk * pParam->B4SOIlitl); dT0_dVb = -T0 / Abulk * dAbulk_dVb; dT0_dVg = -T0 / Abulk * dAbulk_dVg; + /* LFW_FD add 2 derivatives */ + dT0_dVd = -T0 / Abulk * dAbulk_dVd; + dT0_dVe = -T0 / Abulk * dAbulk_dVe; T2 = Vgsteff / EsatL; T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; + /* LFW_FD add/fix 4 derivatives */ + dT1_dVg = Leff * (dAbulk_dVg + (dVgsteff_dVg - T2 * dEsatL_dVg) / EsatL); + dT1_dVb = Leff * (dAbulk_dVb + (dVgsteff_dVb - T2 * dEsatL_dVb) / EsatL); + dT1_dVd = Leff * (dAbulk_dVd + (dVgsteff_dVd - T2 * dEsatL_dVd) / EsatL); + dT1_dVe = Leff * (dAbulk_dVe + (dVgsteff_dVe - T2 * dEsatL_dVe) / EsatL); /* fix below expression - Wagner */ /*if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; */ if (selfheat) dT1_dT = Leff * (dAbulk_dT @@ -3401,7 +3688,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { + T1 * diffVds * dT0_dVg; dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); + /* LFW_FD add/fix 2 derivatives */ + dVACLM_dVd = (dT0_dVd * T1 + T0 * dT1_dVd) * diffVds + T9 * (1.0 - dVdseff_dVd); + dVACLM_dVe = (dT0_dVe * T1 + T0 * dT1_dVe) * diffVds - T9 * dVdseff_dVe; if (selfheat) /* fix below expression - Wagner */ /*dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT;*/ @@ -3412,7 +3701,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else { VACLM = MAX_EXPL; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dVe = dVACLM_dT = 0.0; /* LFW_FD expand line */ } @@ -3422,13 +3711,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T8 = Abulk * Vdsat; T0 = Vgst2Vtm * T8; T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abulk * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; + /* LFW_FD fix/add 4 derivatives */ + dT0_dVg = T8 * dVgsteff_dVg + Vgst2Vtm * (Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat); + dT0_dVb = T8 * dVgsteff_dVb + Vgst2Vtm * (Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat); + dT0_dVd = T8 * dVgsteff_dVd + Vgst2Vtm * (Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat); + dT0_dVe = T8 * dVgsteff_dVe + Vgst2Vtm * (Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat); + + /* LFW_FD fix/add 4 derivatives */ + dT1_dVg = dVgsteff_dVg + Abulk * dVdsat_dVg + dAbulk_dVg * Vdsat; + dT1_dVb = dVgsteff_dVb + Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; + dT1_dVd = dVgsteff_dVd + Abulk * dVdsat_dVd + dAbulk_dVd * Vdsat; + dT1_dVe = dVgsteff_dVe + Abulk * dVdsat_dVe + dAbulk_dVe * Vdsat; if (selfheat) { /* fix below expression - Wagner */ @@ -3446,9 +3739,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /*T2 = pParam->B4SOIthetaRout; */ /* v4.2 bugfix # 36 */ T2 = thetaRout; VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + /* LFW_FD fix/add 4 derivatives */ + dVADIBL_dVg = (dVgsteff_dVg - (dT0_dVg - T0 * dT1_dVg /T1 )/T1) / T2; + dVADIBL_dVb = (dVgsteff_dVb - (dT0_dVb - T0 * dT1_dVb /T1 )/T1) / T2; + dVADIBL_dVd = (dVgsteff_dVd - (dT0_dVd - T0 * dT1_dVd /T1 )/T1) / T2; + dVADIBL_dVe = (dVgsteff_dVe - (dT0_dVe - T0 * dT1_dVe /T1 )/T1) / T2; + if (selfheat) /*fix below expression Wagner */ /*dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2;*/ @@ -3460,10 +3756,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (T7 >= -0.9) { T3 = 1.0 / (1.0 + T7); VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B4SOIpdiblb) - * T3; - dVADIBL_dVd *= T3; + /* LFW_FD fix/add 4 derivatives */ + dVADIBL_dVg = (dVADIBL_dVg - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVg) * T3; + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVb) * T3; + dVADIBL_dVd = (dVADIBL_dVd - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVd) * T3; + dVADIBL_dVe = (dVADIBL_dVe - VADIBL * pParam->B4SOIpdiblb * dVbseff_dVe) * T3; /*fix below expression Wagner */ /*if (selfheat) dVADIBL_dT *= T3;*/ if (selfheat) @@ -3475,10 +3772,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* Added to avoid the discontinuity problem caused by pdiblcb */ { T4 = 1.0 / (0.8 + T7); T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B4SOIpdiblb * T4 * T4; - dVADIBL_dVd *= T3; + /* LFW_FD fix/add 4 derivatives */ + dVADIBL_dVg = dVADIBL_dVg * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVg; + dVADIBL_dVb = dVADIBL_dVb * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVb; + dVADIBL_dVd = dVADIBL_dVd * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVd; + dVADIBL_dVe = dVADIBL_dVe * T3 + VADIBL * (20.0 - T3) * T4 * pParam->B4SOIpdiblb * dVbseff_dVe; /*fix below expression Wagner */ /*if (selfheat) dVADIBL_dT *= T3;*/ if (selfheat) @@ -3491,7 +3789,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else { VADIBL = MAX_EXPL; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dVe = dVADIBL_dT = 0.0; /* LFW_FD enhance line */ } /* v4.0 DITS */ @@ -3508,14 +3806,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T2 = 1.0 + model->B4SOIpditsl * Leff; VADITS = (1.0 + T2 * T1) / pParam->B4SOIpdits; dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->B4SOIpdits; + /* LFW_FD fix/add 3 derivatives */ + dVADITS_dVd = VADITS * dFP_dVd + FP * T2 * dT1_dVd / pParam->B4SOIpdits; + dVADITS_dVb = VADITS * dFP_dVb; + dVADITS_dVe = VADITS * dFP_dVe; VADITS *= FP; if (selfheat) dVADITS_dT = VADITS * dFP_dT / FP; else dVADITS_dT = 0.0; } else { VADITS = MAX_EXPL; - dVADITS_dVg = dVADITS_dVd = dVADITS_dT = 0; + dVADITS_dVg = dVADITS_dVd = dVADITS_dVb = dVADITS_dVe = dVADITS_dT = 0; /* LFW_FD enhance line */ } /* Calculate VA */ @@ -3524,9 +3825,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T9 = T8 * Vgsteff; if (T9 > -0.9) { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; + /* LFW_FD fix/add 4 derivatives */ + dT0_dVg = T8 * dVgsteff_dVg - T9 * dEsatL_dVg / EsatL; + dT0_dVb = T8 * dVgsteff_dVb - T9 * dEsatL_dVb / EsatL; + dT0_dVd = T8 * dVgsteff_dVd - T9 * dEsatL_dVd / EsatL; + dT0_dVe = T8 * dVgsteff_dVe - T9 * dEsatL_dVe / EsatL; if (selfheat) /* fix below expression - Wagner */ /*dT0_dT = -T9 * dEsatL_dT / EsatL;*/ @@ -3538,11 +3841,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { TL1 = T1 = 1.0 / (17.0 + 20.0 * T9); /* change LHS name - Wagner */ T0 = (0.8 + T9) * T1; T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; + /* LFW_FD fix/add 4 derivatives */ + dT0_dVg = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVg - T9 * dEsatL_dVg / EsatL); + dT0_dVb = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVb - T9 * dEsatL_dVb / EsatL); + dT0_dVd = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVd - T9 * dEsatL_dVd / EsatL); + dT0_dVe = (1.0 - 20.0 * T0) * TL1 * (T8 * dVgsteff_dVe - T9 * dEsatL_dVe / EsatL); if (selfheat) /* fix below expression - Wagner */ /*dT0_dT = -T9 * dEsatL_dT;*/ @@ -3561,6 +3865,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; + dT1_dVe = (tmp1 * dVADIBL_dVe + tmp2 * dVACLM_dVe) / tmp3; /* LFW_FD new line */ if (selfheat) /*fix below expression - Wagner */ /*dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3;*/ @@ -3576,7 +3881,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { tmp3 *= tmp3; dT2_dVg = (tmp1 * dVADITS_dVg + tmp2 * dT1_dVg) / tmp3; dT2_dVd = (tmp1 * dVADITS_dVd + tmp2 * dT1_dVd) / tmp3; - dT2_dVb = ( tmp2 * dT1_dVb) / tmp3; + /* LFW_FD fix/add 2 derivatives */ + dT2_dVb = (tmp1 * dVADITS_dVb + tmp2 * dT1_dVb) / tmp3; + dT2_dVe = (tmp1 * dVADITS_dVe + tmp2 * dT1_dVe) / tmp3; if (selfheat) /*fix below expression - Wagner */ /*dT2_dT = (tmp1 * dVADITS_dT + tmp2 * dT1_dT ) / tmp3;*/ @@ -3598,6 +3905,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVa_dVg = dVasat_dVg + T2 * dT0_dVg + T0 * dT2_dVg; dVa_dVd = dVasat_dVd + T2 * dT0_dVd + T0 * dT2_dVd; dVa_dVb = dVasat_dVb + T2 * dT0_dVb + T0 * dT2_dVb; + dVa_dVe = dVasat_dVe + T2 * dT0_dVe + T0 * dT2_dVe; /* LFW_FD new line */ if (selfheat) dVa_dT = dVasat_dT + T2 * dT0_dT + T0 * dT2_dT; else dVa_dT = 0.0; @@ -3606,19 +3914,25 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { CoxWovL = model->B4SOIcox * Weff / Leff; beta = ueff * CoxWovL; dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; - dbeta_dVd = CoxWovL * dueff_dVd; + /* LFW_FD fix/add 3 derivatives */ + dbeta_dVd = CoxWovL * dueff_dVd + beta * dWeff_dVd / Weff ; dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; + dbeta_dVe = CoxWovL * dueff_dVe + beta * dWeff_dVe / Weff ; /* fix below if expresssion - Wagner */ /*if (selfheat) dbeta_dT = CoxWovL * dueff_dT; */ if (selfheat) dbeta_dT = CoxWovL * dueff_dT + beta * dWeff_dT / Weff ; else dbeta_dT = 0.0; T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; + /* LFW_FD fix/add 4 derivatives */ + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + dAbulk_dVg * Vdseff + -Abulk * Vdseff * dVgsteff_dVg / Vgst2Vtm) / Vgst2Vtm; + dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff + -Abulk * Vdseff * dVgsteff_dVb / Vgst2Vtm) / Vgst2Vtm; + dT0_dVd = -0.5 * (Abulk * dVdseff_dVd + dAbulk_dVd * Vdseff + -Abulk * Vdseff * dVgsteff_dVd / Vgst2Vtm) / Vgst2Vtm; + dT0_dVe = -0.5 * (Abulk * dVdseff_dVe + dAbulk_dVe * Vdseff + -Abulk * Vdseff * dVgsteff_dVe / Vgst2Vtm) / Vgst2Vtm; if (selfheat) /* fix first line of below expression - Wagner */ /*dT0_dT = -0.5 * (Abulk * dVdseff_dT */ @@ -3628,9 +3942,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dT0_dT = 0.0; fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; + /* LFW_FD fix/add 4 derivatives */ + dfgche1_dVg = Vgsteff * dT0_dVg + dVgsteff_dVg * T0; + dfgche1_dVb = Vgsteff * dT0_dVb + dVgsteff_dVb * T0; + dfgche1_dVd = Vgsteff * dT0_dVd + dVgsteff_dVd * T0; + dfgche1_dVe = Vgsteff * dT0_dVe + dVgsteff_dVe * T0; /* fix below expression - Wagner */ /*if (selfheat) dfgche1_dT = Vgsteff * dT0_dT;*/ if (selfheat) dfgche1_dT = Vgsteff * dT0_dT + T0 * dVgsteff_dT; @@ -3641,6 +3957,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + dfgche2_dVe = (dVdseff_dVe - T9 * dEsatL_dVe) / EsatL; /* LFW_FD new line */ if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; else dfgche2_dT = 0.0; @@ -3651,6 +3968,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { - gche * dfgche2_dVd) / fgche2; dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - gche * dfgche2_dVb) / fgche2; + /* LFW_FD add 1 derivative */ + dgche_dVe = (beta * dfgche1_dVe + fgche1 * dbeta_dVe + - gche * dfgche2_dVe) / fgche2; if (selfheat) dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - gche * dfgche2_dT) / fgche2; @@ -3666,9 +3986,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + /* LFW_FD fix/add 3 derivatives */ + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd - Idl * dRds_dVd * gche) / T0; dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; + - Idl * dRds_dVb * gche) / T0; + dIdl_dVe = (gche * dVdseff_dVe + T9 * dgche_dVe - Idl * dRds_dVe * gche) / T0; if (selfheat) dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - Idl * dRds_dT * gche) / T0; @@ -3677,6 +3999,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T9 = diffVds / Va; T0 = 1.0 + T9; here->B4SOIids = Ids = Idl * T0 / here->B4SOInseg; + /* LFW_FD add 4 derivatives */ + dIds_dVg = (dIdl_dVg * T0 - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va)/ here->B4SOInseg; + dIds_dVb = (dIdl_dVb * T0 - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va)/ here->B4SOInseg; + dIds_dVd = (dIdl_dVd * T0 + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va)/ here->B4SOInseg; + dIds_dVe = (dIdl_dVe * T0 - Idl * (dVdseff_dVe + T9 * dVa_dVe) / Va)/ here->B4SOInseg; /* 5 new lines Wagner */ if (selfheat) dIds_dT = dIdl_dT * T0 / here->B4SOInseg @@ -3686,13 +4013,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIidovVds = IdlovVdseff * T0 / here->B4SOInseg; /* v4.0 bug fix */ - IdovVds = IdlovVdseff * T0 / here->B4SOInseg; /* v4.0 */ +/* IdovVds = IdlovVdseff * T0 / here->B4SOInseg; LFW_FD not needed */ Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = 0.0; + Gme0 = dIdl_dVe * T0 - Idl * (dVdseff_dVe + T9 * dVa_dVe) / Va; /* LFW_FD new line */ + /*Gmc = 0.0; LFW_FD not used */ if (selfheat) GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; @@ -3700,16 +4028,30 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* This includes all dependencies from Vgsteff, Vbseff */ - Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / here->B4SOInseg; /* v3.0 */ - Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B4SOInseg; - Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / here->B4SOInseg; /* v3.0 */ - Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / here->B4SOInseg; /* v3.0 */ + /*Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / here->B4SOInseg; v3.0 */ + /*Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B4SOInseg; */ + /*Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / here->B4SOInseg; v3.0 */ + /*Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / here->B4SOInseg; v3.0 */ + /* LFW_FD fix 4 derivatives */ + Gm = dIds_dVg; + Gmb = dIds_dVb; + Gds = dIds_dVd; + Gme = dIds_dVe; if (selfheat) /* fix below expression Wagner */ /* GmT = (Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + GmT0) / here->B4SOInseg; v3.0 */ GmT = dIds_dT; else GmT = 0.0; + /* LFW_FD flexilint inits */ + Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; + Ibddif = dIbddif_dVb = dIbddif_dT = 0; + Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; + Ibs2 = dIbs2_dVb = dIbs2_dT = Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; + Ibs3 = dIbs3_dVb = dIbs3_dT = Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0; + Ibs4 = dIbs4_dVb = dIbs4_dT = Ibd4 = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + dIc_dVd = dIc_dVb = 0.0; /* v3.1 */ if (here->B4SOIsoiMod != 2) /* v3.2 */ @@ -3897,7 +4239,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Ggislt = T3 * dTL1_dT; else Ggislt = 0.0; } - T4 = Vbs - fgisl; + T4 = Vbs - fgisl; /*if (T4==0) T5 =1; else @@ -4114,7 +4456,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); NVtmr = 0.026 * nrecr0s bugfix_snps for DC swapping * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); */ - NVtmf = Vtm00 * nrecf0s /* bugfix_snps for DC swapping*/ + NVtmf = Vtm00 * nrecf0s /* bugfix_snps for DC swapping*/ * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); /* v4.3.1 -Tanvir */ NVtmr = Vtm00 * nrecr0s /* bugfix_snps for DC swapping*/ * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); /* v4.3.1 -Tanvir */ @@ -4123,7 +4465,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { * pParam->B4SOIntrecf * dTempRatio_dT; dNVtmr_dT = nrecr0s * 0.026 bugfix_snps for DC swapping * pParam->B4SOIntrecr * dTempRatio_dT; */ - dNVtmf_dT = nrecf0s * Vtm00 /* bugfix_snps for DC swapping*/ + dNVtmf_dT = nrecf0s * Vtm00 /* bugfix_snps for DC swapping*/ * pParam->B4SOIntrecf * dTempRatio_dT; /* v4.3.1 -Tanvir */ dNVtmr_dT = nrecr0s * Vtm00 /* bugfix_snps for DC swapping*/ * pParam->B4SOIntrecr * dTempRatio_dT; /* v4.3.1 -Tanvir */ @@ -4252,7 +4594,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - /*Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; v4.2 */ + /*Ibddif = dIbddif_dVb = dIbddif_dT = 0; v4.2 */ Ibddif = dIbddif_dVb = dIbddif_dT = 0; here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; } @@ -4288,7 +4630,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if ((Ehlid = Ahlid * (ExpVbdNVtm - 1)) < 1e-5) { Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; EhlidFactor = 1; - dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; + dEhlidFactor_dVb = dEhlidFactor_dT = 0; /* LFW_FD flexilint */ } else { dEhlid_dVb = Ahlid * dExpVbdNVtm_dVb; @@ -4300,7 +4642,6 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { EhlidFactor = 1.0 / sqrt(1 + Ehlid); T0 = -0.5 * EhlidFactor / (1 + Ehlid); dEhlidFactor_dVb = T0 * dEhlid_dVb; - dEhlidFactor_dVd = -dEhlidFactor_dVb; if (selfheat) dEhlidFactor_dT = T0 * dEhlid_dT; else @@ -4511,7 +4852,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dIbd4_dVb = 0; dIbd4_dVd = 0; if (selfheat) - /* dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT;*/ /* Bug fix #8 Jun 09 'typo's corrected for Drain side */ + /* dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; Bug fix #8 Jun 09 'typo's corrected for Drain side */ /* else dIbs4_dT = 0; */ dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; /* Fix */ else dIbd4_dT = 0; @@ -4551,22 +4892,48 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else /* v3.1 soiMod=2: ideal FD */ { here->B4SOIigidl= Igidl - = Ggidld = Ggidlg = Ggidlb = 0.0; - here->B4SOIigisl= Igisl /* Bug fix #9 Jun 09 Code added to set Igisl components to zero */ - = Ggisls = Ggislg = Ggislb = 0.0; /* This is an appx solution */ - /* Final code will comply with BSIM MG in future releases */ + = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; /* LFW_FD inits */ + here->B4SOIigisl= Igisl /* Bug fix #9 Jun 09 Code added to set Igisl components to zero */ + = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; /* This is an appx solution */ + here->B4SOIitun = 0; Ibs = 0; Ibd = 0; - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; + Gjsb = 0.0; + Gjdb = 0.0; + Gjsd = 0.0; + Gjdd = 0.0; - Gjsb = 0; - Gjsd = 0; + /* here->B4SOIigidl= Igidl */ + /* = Ggidld = Ggidlg = Ggidlb = Ggidlt = 0.0; LFW_FD enhance line */ + /* here->B4SOIigisl= Igisl Bug fix #9 Jun 09 Code added to set Igisl components to zero */ + /* = Ggisls = Ggislg = Ggislb = Ggislt = 0.0; This is an appx solution - LFW_FD enhance line */ + /* Final code will comply with BSIM MG in future releases */ + /* here->B4SOIitun = 0; */ + /* LFW_FD next 21 lines; fix Ibs, Ibd, and derivatives Gjs* and Gjd* */ + /* Ibs = 0; */ + /* Ibd = 0; */ + /* Add Gmin since body node is floating - LFW - DIDN'T Converge */ + /* Connect to electrical source, since source is BSIM reference */ + /* Also option to connect to both source and drain */ + /* if (here->B4SOImode == 1) */ + /* { */ + /* Ibs = 1.0e-18 * vbs; */ + /* Ibd = 1.0e-18 * vbd; */ + /* } */ + /* else */ + /* { */ + /* Ibs = 1.0e-18 * vbd; */ + /* Ibd = 1.0e-18 * vbs; */ + /* } */ + /* Gjsb = 1.0e-18; */ + /* Gjdb = 1.0e-18; */ + /* Gjsd = 0.0; */ + /* Gjdd = -1.0e-18; */ GjsT = 0; - - Gjdb = 0; - Gjdd = 0; GjdT = 0; + + here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; } if (here->B4SOImode > 0) { @@ -4578,14 +4945,21 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIibd = Ibs; here->B4SOIibs = Ibd; } - /* 2 new lines Wagner */ + /* LFW_FD 12 new lines per flexilint */ + Vfb = 0.0; + Voxacc = dVoxacc_dVg = dVoxacc_dVd = dVoxacc_dVb = dVoxacc_dVe = 0.0; + Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb + = dVoxdepinv_dT= dVoxdepinv_dVe = 0.0; + + Vgb = Vgs_eff - Vbs; /* flexilint - moved from below if stmt */ + dVgb_dVg = dVgs_eff_dVg - dVbs_dVg; + dVgb_dVd = - dVbs_dVd; + dVgb_dVe = - dVbs_dVe; + dVgb_dVb = - dVbs_dVb; dVoxacc_dT = 0.0; dVfb_dT = 0.0; /* v3.0: gate-tunneling */ if ((model->B4SOIigbMod != 0) || (model->B4SOIigcMod != 0)) { - Vgb = Vgs_eff - Vbs; - dVgb_dVg = dVgs_eff_dVg; - dVgb_dVb = -1; /* Calculate Vox first */ Vfb = model->B4SOItype * here->B4SOIvth0 /* v4.0 */ @@ -4593,15 +4967,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVfb_dT = - dphi_dT - pParam->B4SOIk1eff*dsqrtPhi_dT; /* new line Wagner */ T3 = Vfb - Vgs_eff + Vbs - DELTA_3; - dT3_dVg = -dVgs_eff_dVg; - dT3_dVd = 0; - dT3_dVb = 1; - dTL3_dT = dVfb_dT - dVgs_eff_dT; /* new line Wagner */ + /* LFW_FD add/fix 5 derivatives */ + dT3_dVg = -dVgs_eff_dVg + dVbs_dVg; + dT3_dVd = dVbs_dVd; + dT3_dVe = dVbs_dVe; + dT3_dVb = dVbs_dVb; + dTL3_dT = dVfb_dT - dVgs_eff_dT + dVbs_dT; if (Vfb <= 0.0) { T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + /* LFW_FD add 2 derivatives */ + dT0_dVd = T3 * dT3_dVd / T0; + dT0_dVe = T3 * dT3_dVe / T0; dTL0_dT = (T3 * dTL3_dT - 2.0 * DELTA_3 * dVfb_dT) / T0; /* new line Wagner */ TL1 = -1.0; /* new line Wagner */ } @@ -4609,6 +4988,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + /* LFW_FD add 2 derivatives */ + dT0_dVd = T3 * dT3_dVd / T0; + dT0_dVe = T3 * dT3_dVe / T0; dTL0_dT = (T3 * dTL3_dT + 2.0 * DELTA_3 * dVfb_dT) / T0; /* new line Wagner */ TL1 = 1.0; /* new line Wagner */ } @@ -4616,26 +4998,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vfbeff = Vfb - 0.5 * (T3 + T0); dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); + /* LFW_FD add 2 derivatives */ + dVfbeff_dVd = -0.5 * (dT3_dVd + dT0_dVd); + dVfbeff_dVe = -0.5 * (dT3_dVe + dT0_dVe); /* 2 new lines - Wagner */ if (selfheat) dVfbeff_dT = dVfb_dT - 0.5 * (dTL3_dT + dTL0_dT); else dVfbeff_dT = 0.0; Voxacc = Vfb - Vfbeff; dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVd = 0.0; + /* LFW_FD add/fix 2 derivatives */ + dVoxacc_dVd = -dVfbeff_dVd; + dVoxacc_dVe = -dVfbeff_dVe; dVoxacc_dVb = -dVfbeff_dVb; if (Voxacc < 0.0) - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; + Voxacc = dVoxacc_dVg = dVoxacc_dVb = dVoxacc_dVd = dVoxacc_dVe = 0.0; /* LFW_FD enhance line */ /* 2 new lines Wagner */ if (selfheat) dVoxacc_dT = dVfb_dT - dVfbeff_dT; else dVoxacc_dT = 0.0; T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; + /* LFW_FD add/fix 4 derivatives */ dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg - dVbseff_dVg; /* v3.0 */ - dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; /* v3.0 */ - dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; - dT0_dVe = -dVgsteff_dVe - dVbseff_dVe; + dT0_dVd = -dVgsteff_dVd - dVbseff_dVd - dVfbeff_dVd; + dT0_dVb = -dVgsteff_dVb - dVbseff_dVb - dVfbeff_dVb; + dT0_dVe = -dVgsteff_dVe - dVbseff_dVe - dVfbeff_dVe; + + dVoxdepinv_dT = 0.0; /* flexilint */ if (selfheat) /* fix below expression Wagner */ @@ -4672,21 +5062,27 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; - dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg); - dVoxdepinv_dVd = -(2.0*T1*dT1_dVd); - dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1); - dVoxdepinv_dVe = -(2.0*T1*dT1_dVe); /* v3.0 */ + /* LFW_FD add/fix 5 derivatives */ + dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg) - dVbs_dVg; + dVoxdepinv_dVd = -(2.0*T1*dT1_dVd) - dVbs_dVd; + dVoxdepinv_dVb = -(2.0*T1*dT1_dVb) - dVbs_dVb; + dVoxdepinv_dVe = -(2.0*T1*dT1_dVe) - dVbs_dVe; if (selfheat) - /*fix below expression Wagner */ - /*dVoxdepinv_dT = -(2.0*T1*dT1_dT);*/ - dVoxdepinv_dT = dVgs_eff_dT -(2.0*T1*dT1_dT) - dVfb_dT; + dVoxdepinv_dT = dVgs_eff_dT -(2.0*T1*dT1_dT) - dVbs_dT - dVfb_dT; + else dVoxdepinv_dT = 0.0; } } /* gate-channel tunneling component */ - ExpVxNVt = 0.0; /* new line Wagner */ - dIgcd_dT = dIgcs_dT = 0.0; /* new line Wagner */ + + /* LFW_FD next 6 lines - flexilint inits */ + Igd = dIgd_dVg = dIgd_dVd = 0.0; + Igcd = dIgcd_dVg = dIgcd_dVd = dIgcd_dVb = dIgcd_dVe = 0.0; + Igs = dIgs_dVg = dIgs_dVs = 0.0; + Igcs = dIgcs_dVg = dIgcs_dVd = dIgcs_dVb = dIgcs_dVe = 0.0; + ExpVxNVt = 0.0; + dIgcd_dT = dIgcs_dT = 0.0; if (model->B4SOIigcMod) { T0 = Vtm * pParam->B4SOInigc; @@ -4723,11 +5119,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVaux_dVd = -dVaux_dVg * 0.0; dVaux_dVb = -dVaux_dVg * 0.0; dVaux_dVg *= dVgs_eff_dVg; + /* Wagner New fix (moved from below into else block */ + if (selfheat) + dVaux_dT = dT0_dT*log(1.0+ExpVxNVt) + T0*ExpVxNVt*dVxNVt_dT/(1.0+ExpVxNVt); + else dVaux_dT = 0.0; } - /* 3 new lines Wagner */ - if (selfheat) - dVaux_dT = dT0_dT*log(1.0+ExpVxNVt) + T0*ExpVxNVt*dVxNVt_dT/(1.0+ExpVxNVt); - else dVaux_dT = 0.0; T2 = Vgs_eff * Vaux; dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; @@ -4746,33 +5142,35 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T5 = T12 * (pParam->B4SOIaigc + T3 * Voxdepinv - T4 * Voxdepinv * Voxdepinv); - /* 2 new lines Wagner */ - if (selfheat) dT5_dT = T12 * (T3 - 2 * T4) * dVoxdepinv_dT; + /* LFW_FD fix derivative */ + if (selfheat) dT5_dT = T12 * (T3 - 2 * T4 * Voxdepinv) * dVoxdepinv_dT; else dT5_dT = 0.0; if (T5 > EXPL_THRESHOLD) { T6 = MAX_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + dT6_dVg = dT6_dVd = dT6_dVb = dT6_dVe = dT6_dT = 0.0; /* LFW_FD enhance line */ } else if (T5 < -EXPL_THRESHOLD) { T6 = MIN_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + dT6_dVg = dT6_dVd = dT6_dVb = dT6_dVe = dT6_dT = 0.0; /* LFW_FD enhance line */ } else { T6 = exp(T5); dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); dT6_dVd = dT6_dVg * dVoxdepinv_dVd; + dT6_dVe = dT6_dVg * dVoxdepinv_dVe; /* LFW_FD new line */ dT6_dVb = dT6_dVg * dVoxdepinv_dVb; dT6_dVg *= dVoxdepinv_dVg; + /* LFW_FD fix - move from below into this else block */ + if (selfheat) dT6_dT = T6 * dT5_dT; + else dT6_dT = 0.0; } - /* 2 new lines Wagner */ - if (selfheat) dT6_dT = T6 * dT5_dT; - else dT6_dT = 0.0; Igc = T11 * T2 * T6; dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); + dIgc_dVe = T11 * (T2 * dT6_dVe); /* LFW_FD new line */ dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); /* 3 new lines Wagner */ @@ -4805,6 +5203,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dIgcs_dVg = dIgc_dVg * T10; dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; dIgcs_dVb = dIgc_dVb * T10; + dIgcs_dVe = dIgc_dVe * T10; /* LFW_FD new line */ /* 3 new lines Wagner */ if (selfheat) @@ -4819,6 +5218,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dIgcd_dVg = dIgc_dVg * T10; dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; dIgcd_dVb = dIgc_dVb * T10; + dIgcd_dVe = dIgc_dVe * T10; /* LFW_FD new line */ /* 3 new lines Wagner */ if (selfheat) @@ -4831,12 +5231,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* fix below expression Wagner */ /*here->B4SOIgIgcsb = dIgcs_dVb * dVbseff_dVb;*/ here->B4SOIgIgcsb = dIgcs_dVb; + here->B4SOIgIgcse = dIgcs_dVe; /* LFW_FD new line */ here->B4SOIIgcd = Igcd; here->B4SOIgIgcdg = dIgcd_dVg; here->B4SOIgIgcdd = dIgcd_dVd; /* fix below expression Wagner */ /*here->B4SOIgIgcdb = dIgcd_dVb * dVbseff_dVb;*/ here->B4SOIgIgcdb = dIgcd_dVb; + here->B4SOIgIgcde = dIgcd_dVe; /* LFW_FD new line */ T0 = vgs - pParam->B4SOIvfbsd; @@ -4915,11 +5317,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb); + + here->B4SOIgIgcsb + here->B4SOIgIgcse); /* LFW_FD fix line */ here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb); + + here->B4SOIgIgcdb + here->B4SOIgIgcde); /* LFW_FD fix line */ + Vfb2 = dVox_dT = 0.0; /* gate-body tunneling component */ if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2)) /* v3.2 */ /* v3.1: the Igb calculation is skipped for the ideal FD mode */ @@ -4956,11 +5359,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dVaux_dVd = T2 / (1 + T1) * dVox_dVd; dVaux_dVb = T2 / (1 + T1) * dVox_dVb; dVaux_dVe = T2 / (1 + T1) * dVox_dVe; /* v3.0 */ - /* fix below exprssion Wagner */ - /*if (selfheat) - dVaux_dT = T2 / (1 + T1) * dVox_dT;*/ if (selfheat) - dVaux_dT = model->B4SOIvevb * dT1_dT / (1 + T1); + dVaux_dT = T2 / (1 + T1) * dVox_dT; /* LFW_FD fix line */ else dVaux_dT = 0.0; @@ -4991,6 +5391,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = T2*(T3 - T4 * Vox) / T0; if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + else dT6_dT = 0.0; /* flexilint */ DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); @@ -4999,25 +5400,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* v3.0 */ if (selfheat) dT5_dT = T7 * dT6_dT; + else + dT5_dT = 0.0; /* flexilint */ Igb1 = T1 * Vgb * Vaux * T5; - /* fix expression below - Wagner */ + /* LFW_FD fix 5 derivatives */ dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - /* Vgb*T5*dVaux_dVg);*/ - Vgb*T5*dVaux_dVg) - + Vgb * Vaux * T5 * Leff * dWeff_dVg / here->B4SOInseg; - dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - /* fix expression below - Wagner */ + Vgb*T5*dVaux_dVg) + + Vgb * Vaux * T5 * Leff * dWeff_dVg * agb1 * OxideRatio / here->B4SOInseg; + dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd + dVgb_dVd*Vaux*T5); dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - /*Vgb*T5*dVaux_dVb);*/ - Vgb*T5*dVaux_dVb) - + Vgb * Vaux * T5 * Leff * dWeff_dVb / here->B4SOInseg; - dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe); /* v3.0 */ + Vgb*T5*dVaux_dVb) + + Vgb * Vaux * T5 * Leff * dWeff_dVb * agb1 * OxideRatio / here->B4SOInseg; + dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe + dVgb_dVe*Vaux*T5); if (selfheat) - /* fix expression below - Wagner */ - /* dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);*/ - dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) - + Vgb * Vaux * T5 * Leff * dWeff_dT / here->B4SOInseg; + dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) + + Vgb * Vaux * T5 * Leff * dWeff_dT * agb1 * OxideRatio / here->B4SOInseg + + T1 * dVgs_eff_dT * Vaux * T5; else dIgb1_dT = 0.0; @@ -5032,6 +5431,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vox = Voxeff; dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; + dVox_dVe = dVoxacc_dVe * dVoxeff_dVox; /* LFW_FD new line */ dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; /* fix below expression Wagner */ /*dVox_dT = 0;*/ @@ -5054,9 +5454,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dT1_dT = 0; Vaux = model->B4SOIvecb* log(1 + T1); - dVaux_dVg = -T2 / (1 + T1); - dVaux_dVd = 0; - dVaux_dVb = -dVaux_dVg; + /* LFW_FD fix/add 4 derivatives */ + dVaux_dVg = - T2 / (1 + T1) * dVgb_dVg; + dVaux_dVd = - T2 / (1 + T1) * dVgb_dVd; + dVaux_dVe = - T2 / (1 + T1) * dVgb_dVe; + dVaux_dVb = - T2 / (1 + T1) * dVgb_dVb; /* fix below expression - Wagner */ /*if (selfheat) dVaux_dT = 0;*/ @@ -5091,31 +5493,30 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = T2*(T3 - T4 * Vox) / T0; if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + else dT6_dT = 0.0; /* flexilint */ DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* LFW_FD new line */ if (selfheat) dT5_dT = T7 * dT6_dT; + else + dT5_dT = 0.0; /* flexilint */ Igb2 = T1 * Vgb * Vaux * T5; - /* fix below expression - Wagner */ - dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - /*Vgb*T5*dVaux_dVg);*/ - Vgb*T5*dVaux_dVg) - + Vgb * Vaux * T5 * Leff * dWeff_dVg / here->B4SOInseg; - dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - /* fix below expression - Wagner */ - dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - /*Vgb*T5*dVaux_dVb);*/ - Vgb*T5*dVaux_dVb) - + Vgb * Vaux * T5 * Leff * dWeff_dVb / here->B4SOInseg; + /* LFW_FD fix 5 derivatives */ + dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + Vgb*T5*dVaux_dVg) + + Vgb * Vaux * T5 * Leff * dWeff_dVg *agb2 * OxideRatio / here->B4SOInseg; + dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + dVgb_dVd*Vaux*T5 + Vgb*T5*dVaux_dVd); + dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + Vgb*T5*dVaux_dVb) + + Vgb * Vaux * T5 * Leff * dWeff_dVb * agb2 * OxideRatio / here->B4SOInseg; + dIgb2_dVe = T1 * (Vgb*Vaux*dT5_dVe + dVgb_dVe*Vaux*T5 + Vgb*T5*dVaux_dVe); if (selfheat) - /* fix below expression - Wagner */ - /* dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);*/ - dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) - + Vgb * Vaux * T5 * Leff * dWeff_dT / here->B4SOInseg; + dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT) + + Vgb * Vaux * T5 * Leff * dWeff_dT * agb2 * OxideRatio / here->B4SOInseg + + T1 * dVgs_eff_dT * Vaux * T5; else dIgb2_dT = 0.0; @@ -5136,7 +5537,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dIgb_dVg = dIgb2_dVg; dIgb_dVd = dIgb2_dVd; dIgb_dVb = dIgb2_dVb; - dIgb_dVe = 0; /* v3.0 */ + dIgb_dVe = dIgb2_dVe; /* LFW_FD fix line */ dIgb_dT = dIgb2_dT; } /*Vfb2 = Vfb + 1.12; Bug fix #18 Jul09*/ @@ -5174,17 +5575,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { vgp_eff = 0.5 * (-T0 + T1 - 1.0e-2); dvgp_eff_dvg = 0.5 * (-1.0 + T0 / T1); dvgp_eff_dvp = -dvgp_eff_dvg; + dvgp_eff_dT = 0.5 * (1.0 - T0 / T1) * dVfb_dT; /* LFW_FD new line */ /* T11=A* T12=B* */ /*T11 = (model->B4SOItype == NMOS) ? 3.42537e-7 : 4.97232e-7; T12 = (model->B4SOItype == NMOS) ? 1.16645e12 : 7.45669e11; */ - T11 = (model->B4SOItype == NMOS) ? agbc2n : agbc2p; /* bugfix 4.3.1 -Tanvir */ + T11 = (model->B4SOItype == NMOS) ? agbc2n : agbc2p; /* bugfix 4.3.1 -Tanvir */ T12 = (model->B4SOItype == NMOS) ? bgbc2n : bgbc2p; /* bugfix 4.3.1 -Tanvir */ T2 = vgp * vgp_eff; dT2_dVg = vgp * dvgp_eff_dvg + vgp_eff; dT2_dVp = vgp * dvgp_eff_dvp - vgp_eff; + dT2_dT = vgp * dvgp_eff_dT; /* LFW_FD new line */ T3 = pParam->B4SOIaigbcp2 * pParam->B4SOIcigbcp2 - pParam->B4SOIbigbcp2; @@ -5196,12 +5599,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = MAX_EXPL; dT6_dVg = 0.0; dT6_dVp = 0.0; + dT6_dT = 0.0; /* LFW_FD new line */ } else if (T5 < -EXPL_THRESHOLD) { T6 = MIN_EXPL; dT6_dVg = 0.0; dT6_dVp = 0.0; + dT6_dT = 0.0; /* LFW_FD new line */ } else { @@ -5210,16 +5615,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { (T3 - 2.0 * T4 * vgp_eff); dT6_dVg = T7 * dvgp_eff_dvg; dT6_dVp = T7 * dvgp_eff_dvg; + dT6_dT = T7 * dvgp_eff_dT; /* LFW_FD new line */ } T11 = T11 * here->B4SOIagbcp2 * pParam->B4SOIoxideRatio; Ig_agbcp2 = T11 * T2 * T6; dIg_agbcp2_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); dIg_agbcp2_dVp = -dIg_agbcp2_dVg; + dIg_agbcp2_dT = T11 * (T2 * dT6_dT + T6 * dT2_dT); /* LFW_FD new line */ } else { Ig_agbcp2 = 0.0; dIg_agbcp2_dVg = 0.0; dIg_agbcp2_dVp = 0.0; + dIg_agbcp2_dT = 0.0; /* LFW_FD new line */ } here->B4SOIigp = Ig_agbcp2; here->B4SOIgigpg = dIg_agbcp2_dVg; @@ -5239,7 +5647,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (pParam->B4SOIalpha0 <= 0.0) { Giig = Giib = Giid = GiiT = 0.0; Giie = 0; /* v3.0 */ - here->B4SOIiii = Iii = 0.0; + here->B4SOIiii = Iii = Idsmosfet = dIiibjt_dVb = dIiibjt_dVd = dIiibjt_dT = 0.0; } else { Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) @@ -5364,13 +5772,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { /*Idsmosfet part*/ if (pParam->B4SOIalpha0 <= 0.0) { - /* Giig = Giib = Giid = GiiT = 0.0; - Giie = 0;*/ /* v3.0 */ - /* here->B4SOIiii = Iii = 0.0; */ /* v4.2 bugfix # 38 */ - /* Idsmosfet = 0.0; */ /*v 4.2 bugfix #38 */ - /*dIiibjt_dVb = 0.0; */ /* v4.2 bugfix # 38 */ - /*dIiibjt_dVd = 0.0; - dIiibjt_dT = 0.0; */ + /* Giig = Giib = Giid = GiiT = 0.0; */ + Giie = 0; /* v3.0 */ + /* here->B4SOIiii = Iii = 0.0; v4.2 bugfix #38 */ + /* Idsmosfet = 0.0; v4.2 bugfix #38 */ + /*dIiibjt_dVb = 0.0; v4.2 bugfix #38 */ + /*dIiibjt_dVd = 0.0; */ + /*dIiibjt_dT = 0.0; */ Ratio = 0; /* v4.2 bugfix # 38 */ } else { @@ -5483,7 +5891,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vbci= pParam->B4SOIvbci*(1.0+model->B4SOItvbci*(TempRatio-1.0)); /*T1 = Vbci - (Vbs - Vds); v4.3 bugfix*/ - T1 = Vbci - (vbs_jct - Vds); + T1 = Vbci - (vbs_jct - Vds); T2 = pParam->B4SOImbjtii -1.0; @@ -5543,9 +5951,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else {T5 = T2-1.0; if (T1<=0.0) - {dT4_dVd = 0.0; - dT4_dVd = 0.0; - + { dT4_dVd = 0.0; + dT4_dVb = 0.0; } else { @@ -5727,6 +6134,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } /* v3.1 added Rg for RF end */ /* v4.0 Calculate bias-dependent external S/D resistance */ + Rs = Rd = 0.0; /* flexilint */ if (model->B4SOIrdsMod) { /* Rs(V) */ T0 = vgs - pParam->B4SOIvfbsd; @@ -5953,6 +6361,10 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIcdrain *= here->B4SOInf; here->B4SOIcd *= here->B4SOInf; here->B4SOIcb *= here->B4SOInf; + +/* Fix NF problem with tnoimod=1 - LFW */ + here->B4SOIidovVds *= here->B4SOInf; + here->B4SOIgds *= here->B4SOInf; here->B4SOIgm *= here->B4SOInf; here->B4SOIgmbs *= here->B4SOInf; @@ -5967,10 +6379,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIgIgcsg *= here->B4SOInf; here->B4SOIgIgcsd *= here->B4SOInf; here->B4SOIgIgcsb *= here->B4SOInf; + here->B4SOIgIgcse *= here->B4SOInf; /* LFW_FD new line */ here->B4SOIIgcd *= here->B4SOInf; here->B4SOIgIgcdg *= here->B4SOInf; here->B4SOIgIgcdd *= here->B4SOInf; here->B4SOIgIgcdb *= here->B4SOInf; + here->B4SOIgIgcde *= here->B4SOInf; /* LFW_FD new line */ here->B4SOIIgs *= here->B4SOInf; here->B4SOIgIgsg *= here->B4SOInf; @@ -6024,13 +6438,25 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } here->B4SOIgigs = -(here->B4SOIgigg + here->B4SOIgigd + here->B4SOIgigb + here->B4SOIgige); + /* LFW_FD fix 2 derivatives */ here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb); + + here->B4SOIgIgcsb + here->B4SOIgIgcse); here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb); + + here->B4SOIgIgcdb + here->B4SOIgIgcde); /* Begin CV (charge) model */ + /* LFW_FD 9 new lines - flexilint */ + Cbb = Cbd = Cbg = 0.0; + Qsub0 = Qac0 = 0.0; + qjs = qjd = 0.0; + CboxWL = 0.0; + Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0; + Vfbeff2=dVfbeff2_dVd=dVfbeff2_dVrg=dVfbeff2_dVg=dVfbeff2_dVb=dVfbeff2_dVe=dVfbeff2_dT=0.0; + VdseffCV2 = dVdseffCV2_dVg = dVdseffCV2_dVd = dVdseffCV2_dVb = dVdseffCV2_dVe = 0.0; + Vgsteff2 = 0.0; + dVgsteff2_dVd=dVgsteff2_dVg=dVgsteff2_dVb=dVgsteff2_dVe=dVgsteff2_dT=0.0; + if ((model->B4SOIxpart < 0) || (!ChargeComputationNeeded)) { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ Qsub0=Qac0=Cbb=Cbg=Cbd=0; /* Bugfix #19 Jul09*/ @@ -6041,6 +6467,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else { + qgate = qdrn = qsrc = qbody = qsub = 0.0; /* flexilint */ CoxWL = model->B4SOIcox * (pParam->B4SOIweffCV / here->B4SOInseg * here->B4SOInf /* v4.0 */ * pParam->B4SOIleffCV + here->B4SOIagbcp); @@ -6057,76 +6484,106 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v3.2 Seperate VgsteffCV with noff */ noff = n * pParam->B4SOInoff; + dnoff_dVg = pParam->B4SOInoff * dn_dVg; /* LFW_FD new line */ dnoff_dVd = pParam->B4SOInoff * dn_dVd; dnoff_dVb = pParam->B4SOInoff * dn_dVb; + dnoff_dVe = pParam->B4SOInoff * dn_dVe; /* LFW_FD new line */ dnoff_dT = pParam->B4SOInoff * dn_dT; /* new line Wagner */ if (model->B4SOIvgstcvMod == 0) { if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) { + TL1 = ExpVgst; /* LFW_FD new line */ ExpVgst *= ExpVgst; ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + /* LFW_FD 4 new derivatives */ + dExpVgst_dVg = 2.0 * TL1 * dExpVgst_dVg * exp( -pParam->B4SOIdelvt / (noff * Vtm)) + + ExpVgst * pParam->B4SOIdelvt * dnoff_dVg / (noff * noff * Vtm); + dExpVgst_dVd = 2.0 * TL1 * dExpVgst_dVd * exp( -pParam->B4SOIdelvt / (noff * Vtm)) + + ExpVgst * pParam->B4SOIdelvt * dnoff_dVd / (noff * noff * Vtm); + dExpVgst_dVb = 2.0 * TL1 * dExpVgst_dVb * exp( -pParam->B4SOIdelvt / (noff * Vtm)) + + ExpVgst * pParam->B4SOIdelvt * dnoff_dVb / (noff * noff * Vtm); + dExpVgst_dVe = 2.0 * TL1 * dExpVgst_dVe * exp( -pParam->B4SOIdelvt / (noff * Vtm)) + + ExpVgst * pParam->B4SOIdelvt * dnoff_dVe / (noff * noff * Vtm); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + /* LFW_FD 4 fix derivatives */ + dVgsteff_dVg = Vgsteff * dnoff_dVg / noff + noff * Vtm * dExpVgst_dVg / (1.0 + ExpVgst); + dVgsteff_dVd = Vgsteff * dnoff_dVd / noff + noff * Vtm * dExpVgst_dVd / (1.0 + ExpVgst); + dVgsteff_dVb = Vgsteff * dnoff_dVb / noff + noff * Vtm * dExpVgst_dVb / (1.0 + ExpVgst); + dVgsteff_dVe = Vgsteff * dnoff_dVe / noff + noff * Vtm * dExpVgst_dVe / (1.0 + ExpVgst); T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt)/ noff * dnoff_dVd) - + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - /*fix below expression Wagner */ - /*dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT */ - dVgsteff_dT = -T0 * (-dVgst_dT - + (Vgst - pParam->B4SOIdelvt) / Temp) - + Vgsteff / Temp; + T2 = 2.0 * pParam->B4SOImstar * pParam->B4SOInoff; /* LFW_FD new line */ + T1 = -T0 * (T2*dVth_dVb + (T2*Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff / noff * dnoff_dVb; /* LFW_FD fix line */ + /* LFW_FD fix _dT derivatives */ + if (selfheat) { + dExpVgst_dT = 2.0 * TL1 * dExpVgst_dT * exp( -pParam->B4SOIdelvt / (noff * Vtm)) + + ExpVgst * pParam->B4SOIdelvt * (dVtm_dT / Vtm + dnoff_dT / noff) / (noff * Vtm); + dVgsteff_dT = Vgsteff * (dnoff_dT / noff + dVtm_dT / Vtm) + noff * Vtm * dExpVgst_dT / (1.0 + ExpVgst); + } else dVgsteff_dT = 0.0; + /* v4.1 */ if (here->B4SOIagbcp2 > 0) { /* ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); */ - ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ + ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ + /* LFW_FD add 4 derivatives */ + dExpVgst2_dVg = dExpVgst_dVg * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVg / (noff * noff * Vtm); + dExpVgst2_dVd = dExpVgst_dVd * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVd / (noff * noff * Vtm); + dExpVgst2_dVb = dExpVgst_dVb * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVb / (noff * noff * Vtm); + dExpVgst2_dVe = dExpVgst_dVe * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVe / (noff * noff * Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + /* LFW_FD fix 4 derivatives */ + dVgsteff2_dVg = Vgsteff2 * dnoff_dVg / noff + noff * Vtm * dExpVgst2_dVg / (1.0 + ExpVgst2); + dVgsteff2_dVd = Vgsteff2 * dnoff_dVd / noff + noff * Vtm * dExpVgst2_dVd / (1.0 + ExpVgst2); + dVgsteff2_dVb = Vgsteff2 * dnoff_dVb / noff + noff * Vtm * dExpVgst2_dVb / (1.0 + ExpVgst2); + dVgsteff2_dVe = Vgsteff2 * dnoff_dVe / noff + noff * Vtm * dExpVgst2_dVe / (1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); /* T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) + Vgsteff2 / noff * dnoff_dVb; */ - T12 = -T02 * (dVth_dVb + (Vgst-eggbcp2-pParam->B4SOIdelvt) / noff * dnoff_dVb) + T12 = -T02 * (dVth_dVb + (Vgst-eggbcp2-pParam->B4SOIdelvt) / noff * dnoff_dVb) + Vgsteff2 / noff * dnoff_dVb; /* bugfix 4.3.1 -Tanvir */ - /* dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt-1.12) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; */ - dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt-eggbcp2) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; /* bugfix 4.3.1 -Tanvir */ - dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff2_dVb = T12 * dVbseff_dVb; - dVgsteff2_dVe = T12 * dVbseff_dVe; if (selfheat) /*fix below expression Wagner */ /*dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT */ /* dVgsteff2_dT = -T02 * (-dVgst_dT + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) + Vgsteff2 / Temp; */ /* bugfix 4.3.1 -Tanvir */ - dVgsteff2_dT = -T02 * (-dVgst_dT - + (Vgst - eggbcp2 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; + dVgsteff2_dT = -T02 * (-dVgst_dT + + (Vgst - eggbcp2 - pParam->B4SOIdelvt) / Temp) + + Vgsteff2 / Temp; else dVgsteff2_dT = 0.0; } } } else if (model->B4SOIvgstcvMod == 1) - {ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); + { ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + /* LFW_FD add 4 derivatives */ + dExpVgst_dVg = ExpVgst * (dVgstNVt_dVg/(pParam->B4SOImstar * pParam->B4SOInoff) + + pParam->B4SOIdelvt * dnoff_dVg / (noff * noff * Vtm)); + dExpVgst_dVd = ExpVgst * (dVgstNVt_dVd/(pParam->B4SOImstar * pParam->B4SOInoff) + + pParam->B4SOIdelvt * dnoff_dVd / (noff * noff * Vtm)); + dExpVgst_dVb = ExpVgst * (dVgstNVt_dVb/(pParam->B4SOImstar * pParam->B4SOInoff) + + pParam->B4SOIdelvt * dnoff_dVb / (noff * noff * Vtm)); + dExpVgst_dVe = ExpVgst * (dVgstNVt_dVe/(pParam->B4SOImstar * pParam->B4SOInoff) + + pParam->B4SOIdelvt * dnoff_dVe / (noff * noff * Vtm)); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + /* LFW_FD fix 4 derivatives */ + dVgsteff_dVg = Vgsteff * dnoff_dVg / noff + noff * Vtm * dExpVgst_dVg / (1.0 + ExpVgst); + dVgsteff_dVd = Vgsteff * dnoff_dVd / noff + noff * Vtm * dExpVgst_dVd / (1.0 + ExpVgst); + dVgsteff_dVb = Vgsteff * dnoff_dVb / noff + noff * Vtm * dExpVgst_dVb / (1.0 + ExpVgst); + dVgsteff_dVe = Vgsteff * dnoff_dVe / noff + noff * Vtm * dExpVgst_dVe / (1.0 + ExpVgst); T0 = ExpVgst / (1.0 + ExpVgst); T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVd) - + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; if (selfheat) /*fix below expression Wagner */ /*dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT */ @@ -6137,18 +6594,25 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.1 */ if (here->B4SOIagbcp2 > 0) { /* ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); */ - ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ + ExpVgst2 = ExpVgst * exp(-eggbcp2 / noff / Vtm); /* bugfix 4.3.1 -Tanvir */ + /* LFW_FD add 4 derivatives */ + dExpVgst2_dVg = dExpVgst_dVg * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVg / (noff * noff * Vtm); + dExpVgst2_dVd = dExpVgst_dVd * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVd / (noff * noff * Vtm); + dExpVgst2_dVb = dExpVgst_dVb * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVb / (noff * noff * Vtm); + dExpVgst2_dVe = dExpVgst_dVe * exp(-eggbcp2 / noff / Vtm) + ExpVgst2 * eggbcp2 * dnoff_dVe / (noff * noff * Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + /* LFW_FD fix 4 derivatives */ + dVgsteff2_dVg = Vgsteff2 * dnoff_dVg / noff + noff * Vtm * dExpVgst2_dVg / (1.0 + ExpVgst2); + dVgsteff2_dVd = Vgsteff2 * dnoff_dVd / noff + noff * Vtm * dExpVgst2_dVd / (1.0 + ExpVgst2); + dVgsteff2_dVb = Vgsteff2 * dnoff_dVb / noff + noff * Vtm * dExpVgst2_dVb / (1.0 + ExpVgst2); + dVgsteff2_dVe = Vgsteff2 * dnoff_dVe / noff + noff * Vtm * dExpVgst2_dVe / (1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); /* T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) + Vgsteff2 / noff * dnoff_dVb; */ T12 = -T02 * (dVth_dVb + (Vgst-eggbcp2-pParam->B4SOIdelvt) / noff * dnoff_dVb) + Vgsteff2 / noff * dnoff_dVb; /* bugfix 4.3.1 -Tanvir */ - /* dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; */ - dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt - eggbcp2) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; /* bugfix 4.3.1 -Tanvir */ - dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); dVgsteff2_dVb = T12 * dVbseff_dVb; dVgsteff2_dVe = T12 * dVbseff_dVe; if (selfheat) @@ -6169,8 +6633,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { T10 = noff * Vtm; VgstNVt = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt) / T10; + /* LFW_FD add 4 derivatives */ + dVgstNVt_dVg = (pParam->B4SOImstarcv * dVgst_dVg - VgstNVt * dnoff_dVg * Vtm) / T10; + dVgstNVt_dVd = (pParam->B4SOImstarcv * dVgst_dVd - VgstNVt * dnoff_dVd * Vtm) / T10; + dVgstNVt_dVb = (pParam->B4SOImstarcv * dVgst_dVb - VgstNVt * dnoff_dVb * Vtm) / T10; + dVgstNVt_dVe = (pParam->B4SOImstarcv * dVgst_dVe - VgstNVt * dnoff_dVe * Vtm) / T10; + ExpArg = (pParam->B4SOIvoffcv - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt))/ T10; + /* LFW_FD add 4 derivatives */ + dExpArg_dVg = (-(1- pParam->B4SOImstarcv) * dVgst_dVg - ExpArg * dnoff_dVg * Vtm) / T10; + dExpArg_dVd = (-(1- pParam->B4SOImstarcv) * dVgst_dVd - ExpArg * dnoff_dVd * Vtm) / T10; + dExpArg_dVb = (-(1- pParam->B4SOImstarcv) * dVgst_dVb - ExpArg * dnoff_dVb * Vtm) / T10; + dExpArg_dVe = (-(1- pParam->B4SOImstarcv) * dVgst_dVe - ExpArg * dnoff_dVe * Vtm) / T10; + /* 11 lines new Wagner */ if (selfheat) { dT10_dT = noff * dVtm_dT + dnoff_dT * Vtm; @@ -6192,10 +6668,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { { Vgsteff = Vgst - pParam->B4SOIdelvt; /* T0 is dVgsteff_dVbseff */ T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; + /* LFW_FD fix 4 derivatives */ + dVgsteff_dVg = dVgst_dVg; + dVgsteff_dVd = dVgst_dVd; + dVgsteff_dVb = dVgst_dVb; + dVgsteff_dVe = dVgst_dVe; if (selfheat) /*fix below expression Wagner */ /*dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; */ @@ -6206,15 +6683,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else if (ExpArg > EXPL_THRESHOLD) { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv) / (noff * Vtm); ExpVgst = exp(T0); + /* LFW_FD add 4 derivatives */ + dExpVgst_dVg = (dVgst_dVg - T0 * dnoff_dVg * Vtm) /(noff * Vtm); + dExpVgst_dVd = (dVgst_dVd - T0 * dnoff_dVd * Vtm) /(noff * Vtm); + dExpVgst_dVb = (dVgst_dVb - T0 * dnoff_dVb * Vtm) /(noff * Vtm); + dExpVgst_dVe = (dVgst_dVe - T0 * dnoff_dVe * Vtm) /(noff * Vtm); + /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst;*/ /*v4.2 bug fix*/ Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ T3 = Vgsteff / (noff * Vtm) ; /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; - dVgsteff_dVe = T1 * dVbseff_dVe; - dVgsteff_dVb = T1 * dVbseff_dVb; + /* T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); */ + T1 = -T3 * ( T0 * Vtm * dnoff_dVb); /* LFW_FD fixed line */ + /* LFW_FD fix 4 derivatives */ + dVgsteff_dVg = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVg; + dVgsteff_dVd = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVd; + dVgsteff_dVb = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVb; + dVgsteff_dVe = Vtm * cdep0 / model->B4SOIcox * dExpVgst_dVe; if (selfheat) /*fix below expression Wagner */ /*dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) @@ -6227,12 +6712,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else { ExpVgst = exp(VgstNVt); + /* LFW_FD add 4 derivatives */ + dExpVgst_dVg = ExpVgst * dVgstNVt_dVg; + dExpVgst_dVd = ExpVgst * dVgstNVt_dVd; + dExpVgst_dVb = ExpVgst * dVgstNVt_dVb; + dExpVgst_dVe = ExpVgst * dVgstNVt_dVe; + T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstarcv; - dT1_dVb = -dT1_dVg * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + T1 / noff * dnoff_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVd) - + T1 / noff * dnoff_dVd; + /* LFW_FD fix 4 derivatives */ + dT1_dVg = T10 * dExpVgst_dVg / (1.0 + ExpVgst) + T1 * dnoff_dVg / noff; + dT1_dVd = T10 * dExpVgst_dVd / (1.0 + ExpVgst) + T1 * dnoff_dVd / noff; + dT1_dVb = T10 * dExpVgst_dVb / (1.0 + ExpVgst) + T1 * dnoff_dVb / noff; + dT1_dVe = T10 * dExpVgst_dVe / (1.0 + ExpVgst) + T1 * dnoff_dVe / noff; + /*fix below expression Wagner */ /*T3 = (1.0 / Temp); */ T3 = (1.0 / Temp + dnoff_dT / noff); @@ -6243,24 +6735,28 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dT1_dT = 0.0; - /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstarcv);*/ /* v4.2 bug fix */ + /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) */ + /* * exp(ExpArg) * (1 - pParam->B4SOImstarcv); v4.2 bug fix */ dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) * exp(ExpArg) * (1 - pParam->B4SOImstarcv); /* v4.2 bug fix */ T2 = pParam->B4SOImstarcv - T10 * dT2_dVg / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dnoff_dVd - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dnoff_dVb - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + + /* LFW_FD 5 new lines */ + TL1 = dT2_dVg; + dTL1_dVg = TL1 * dExpArg_dVg; + dTL1_dVd = TL1 * dExpArg_dVd; + dTL1_dVb = TL1 * dExpArg_dVb; + dTL1_dVe = TL1 * dExpArg_dVe; + + /* LFW_FD fix/add 5 derivatives */ + dT2_dVg = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -(dnoff_dVd * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstarcv); + dT2_dVb = -(dnoff_dVb * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstarcv); + dT2_dVe = -(dnoff_dVe * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstarcv); if (selfheat) - /*fix below expression Wagner */ - /*dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 - / (1.0 - pParam->B4SOImstarcv) ); */ - dT2_dT = -(dT10_dT*dT2_dVg - +T10*dT2_dVg*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) + dT2_dT = -(dT10_dT*TL1 + +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg_dT) )/(1.0 - pParam->B4SOImstarcv); else dT2_dT = 0.0; @@ -6270,14 +6766,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T3 = T2 * T2; /* T4 is dVgsteff_dVbseff */ T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; + /* LFW_FD fix 4 derivatives */ + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; if (selfheat) /*fix below expression Wagner */ /*dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) @@ -6292,11 +6785,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (here->B4SOIagbcp2 > 0) { /* VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - 1.12) / T10; */ - VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - eggbcp2) / T10; /* bugfix 4.3.1 -Tanvir */ + VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - eggbcp2) / T10; /* bugfix 4.3.1 -Tanvir */ + /* LFW_FD add 4 derivatives */ + dVgstNVt2_dVg = (pParam->B4SOImstarcv * dVgst_dVg - VgstNVt2 * dnoff_dVg * Vtm) / T10; + dVgstNVt2_dVd = (pParam->B4SOImstarcv * dVgst_dVd - VgstNVt2 * dnoff_dVd * Vtm) / T10; + dVgstNVt2_dVb = (pParam->B4SOImstarcv * dVgst_dVb - VgstNVt2 * dnoff_dVb * Vtm) / T10; + dVgstNVt2_dVe = (pParam->B4SOImstarcv * dVgst_dVe - VgstNVt2 * dnoff_dVe * Vtm) / T10; + /* ExpArg2 = (pParam->B4SOIvoffcv - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - 1.12))/ T10; */ - ExpArg2 = (pParam->B4SOIvoffcv - + ExpArg2 = (pParam->B4SOIvoffcv - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - eggbcp2))/ T10; /* bugfix 4.3.1 -Tanvir */ + /* LFW_FD add 4 derivatives */ + dExpArg2_dVg = (-(1- pParam->B4SOImstarcv) * dVgst_dVg - ExpArg2 * dnoff_dVg * Vtm) / T10; + dExpArg2_dVd = (-(1- pParam->B4SOImstarcv) * dVgst_dVd - ExpArg2 * dnoff_dVd * Vtm) / T10; + dExpArg2_dVb = (-(1- pParam->B4SOImstarcv) * dVgst_dVb - ExpArg2 * dnoff_dVb * Vtm) / T10; + dExpArg2_dVe = (-(1- pParam->B4SOImstarcv) * dVgst_dVe - ExpArg2 * dnoff_dVe * Vtm) / T10; + /* 11 new lines Wagner */ if (selfheat) { /*fix below expression Wagner */ @@ -6317,13 +6822,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* MCJ: Very small Vgst */ if (VgstNVt2 > EXPL_THRESHOLD) { /* Vgsteff2 = Vgst - pParam->B4SOIdelvt - 1.12; */ - Vgsteff2 = Vgst - pParam->B4SOIdelvt - eggbcp2; /* bugfix 4.3.1 -Tanvir */ - /* T0 is dVgsteff2_dVbseff */ + Vgsteff2 = Vgst - pParam->B4SOIdelvt - eggbcp2; /* bugfix 4.3.1 -Tanvir */ T0 = -dVth_dVb; - dVgsteff2_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff2_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff2_dVb = T0 * dVbseff_dVb; - dVgsteff2_dVe = T0 * dVbseff_dVe; + /* LFW_FD fix 4 derivatives */ + dVgsteff2_dVg = dVgst_dVg; + dVgsteff2_dVd = dVgst_dVd; + dVgsteff2_dVb = dVgst_dVb; + dVgsteff2_dVe = dVgst_dVe; + if (selfheat) /*fix below expression Wagner */ /*dVgsteff2_dT = -dVth_dT + T0 * dVbseff_dT;*/ @@ -6334,17 +6840,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else if (ExpArg2 > EXPL_THRESHOLD) { /* T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - 1.12) / (noff * Vtm); ExpVgst2 = exp(T0); */ - T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - eggbcp2) / (noff * Vtm); + T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - eggbcp2) / (noff * Vtm); ExpVgst2 = exp(T0); /* bugfix 4.3.1 -Tanvir */ /*Vgsteff2 = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst*/ Vgsteff2 = Vtm * cdep0 / model->B4SOIcox * ExpVgst2; /*v4.2 bug fix */ T3 = Vgsteff2 / (noff * Vtm) ; /* T1 is dVgsteff2_dVbseff */ T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); - dVgsteff2_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; - dVgsteff2_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; - dVgsteff2_dVe = T1 * dVbseff_dVe; - dVgsteff2_dVb = T1 * dVbseff_dVb; + /* LFW_FD fix 4 derivatives */ + dVgsteff2_dVg = Vgsteff2 * (dVgst_dVg / Vtm - T0 * dnoff_dVg) / noff; + dVgsteff2_dVd = Vgsteff2 * (dVgst_dVd / Vtm - T0 * dnoff_dVd) / noff; + dVgsteff2_dVb = Vgsteff2 * (dVgst_dVb / Vtm - T0 * dnoff_dVb) / noff; + dVgsteff2_dVe = Vgsteff2 * (dVgst_dVe / Vtm - T0 * dnoff_dVe) / noff; + if (selfheat) /* fix 1st line in below expression Wagner */ /*dVgsteff2_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) */ @@ -6356,15 +6864,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else { ExpVgst2 = exp(VgstNVt2); T1 = T10 * log(1.0 + ExpVgst2); - dT1_dVg = ExpVgst2 / (1.0 + ExpVgst2) * pParam->B4SOImstarcv; - /* dT1_dVb = -dT1_dVg * (dVth_dVb + (Vgst - pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVb) - + T1 / noff * dnoff_dVb; */ - dT1_dVb = -dT1_dVg * (dVth_dVb + (Vgst - pParam->B4SOIdelvt - eggbcp2) / noff * dnoff_dVb) - + T1 / noff * dnoff_dVb; /* bugfix 4.3.1 -Tanvir */ - /* dT1_dVd = -dT1_dVg * (dVth_dVd + (Vgst - pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVd) - + T1 / noff * dnoff_dVd; */ - dT1_dVd = -dT1_dVg * (dVth_dVd + (Vgst - pParam->B4SOIdelvt - eggbcp2) / noff * dnoff_dVd) - + T1 / noff * dnoff_dVd; /* bugfix 4.3.1 -Tanvir */ + /* LFW_FD fix 4 derivatives */ + dT1_dVg = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVg / (1.0 + ExpVgst2); + dT1_dVd = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVd / (1.0 + ExpVgst2); + dT1_dVb = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVb / (1.0 + ExpVgst2); + dT1_dVe = dnoff_dVg * T1 / noff + T10 * ExpVgst2 * dVgstNVt2_dVe / (1.0 + ExpVgst2); /*fix below expression Wagner */ /*T3 = (1.0 / Temp); */ T3 = (1.0 / Temp + dnoff_dT / noff); @@ -6372,9 +6876,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /*fix below expression */ /*dT1_dT = -dT1_dVg * (dVth_dT + (Vgst - pParam->B4SOIdelvt - 1.12) * T3) + T1 * T3;*/ /* dT1_dT = -dT1_dVg * (-dVgst_dT + (Vgst-pParam->B4SOIdelvt-1.12) * T3) + T1 * T3; */ - dT1_dT = -dT1_dVg * (-dVgst_dT + (Vgst-pParam->B4SOIdelvt-eggbcp2) * T3) + T1 * T3; /* bugfix 4.3.1 -Tanvir */ + dT1_dT = -dT1_dVg * (-dVgst_dT + (Vgst-pParam->B4SOIdelvt-eggbcp2) * T3) + T1 * T3; /* bugfix 4.3.1 -Tanvir */ else - dT1_dT = 0.0; + dT1_dT = 0.0; /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) * exp(ExpArg2) * (1 - pParam->B4SOImstarcv);*/ @@ -6382,33 +6886,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { * exp(ExpArg2) * (1 - pParam->B4SOImstarcv); /*v4.2 bug fix */ T2 = pParam->B4SOImstarcv - T10 * dT2_dVg / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg2 * dnoff_dVd - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg2 * dnoff_dVb - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + /* LFW_FD next 5 lines new */ + TL1 = dT2_dVg; + dTL1_dVg = TL1 * dExpArg2_dVg; + dTL1_dVd = TL1 * dExpArg2_dVd; + dTL1_dVb = TL1 * dExpArg2_dVb; + dTL1_dVe = TL1 * dExpArg2_dVe; + + /* LFW_FD fix next 5 derivatives */ + dT2_dVg = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVg) / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVd) / (1.0 - pParam->B4SOImstarcv); + dT2_dVb = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVb) / (1.0 - pParam->B4SOImstarcv); + dT2_dVe = -(dnoff_dVg * Vtm * TL1 + T10 * dTL1_dVe) / (1.0 - pParam->B4SOImstarcv); if (selfheat) - /*fix below expression Wagner */ - /*dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg2 * T10 * T3 - / (1.0 - pParam->B4SOImstarcv) ); */ - dT2_dT = -(dT10_dT*dT2_dVg - +T10*dT2_dVg*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg2_dT) - )/(1.0 - pParam->B4SOImstarcv); + dT2_dT = -(dT10_dT*TL1 + +T10*TL1*(-dVtm_dT/Vtm-dcdep0_dT/cdep0+dExpArg2_dT) + )/(1.0 - pParam->B4SOImstarcv); else - dT2_dT = 0.0; + dT2_dT = 0.0; Vgsteff2 = T1 / T2; T3 = T2 * T2; /* T4 is dVgsteff2_dVbseff */ T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff2_dVb = T4 * dVbseff_dVb; - dVgsteff2_dVe = T4 * dVbseff_dVe; - dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; + /* LFW_FD fix next 4 derivatives */ + dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3; + dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + dVgsteff2_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff2_dVe = (T2 * dT1_dVe - T1 * dT2_dVe) / T3; if (selfheat) /*fix below expression Wagner */ /*dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) @@ -6422,8 +6927,14 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v3.2 */ /* v3.2 */ - dqsrc_dT = 0.0; /* new line Wagner */ - dVdseffCV2_dT = 0; /* new line Wagner */ + /* LFW_FD flexilint initializations next 9 lines */ + Qsub02 = dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; + Qac02 = dQac02_dVrg = dQac02_dVg = dQac02_dVd = dQac02_dVb = dQac02_dVe = dQac02_dT = 0.0; + dqsrc_dT = 0.0; + dVdseffCV2_dT = 0; + T02 = dT02_dVg = dT02_dVd = dT02_dVb = dT02_dVe = 0.0; + T12 = dT12_dVg = dT12_dVd = dT12_dVb = dT12_dVe = 0.0; + T22 = dT22_dVg = dT22_dVd = dT22_dVb = dT22_dVe = 0.0; if (model->B4SOIcapMod == 2) { @@ -6431,16 +6942,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v3.1 */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { - Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0; - dQac02_dVrg = dQac02_dVd = dQac02_dVb = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; - dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; + /* LFW_FD flexilint initializations next 4 lines */ + Qac0 = dQac0_dVrg = dQac0_dVg = dQac0_dVd = dQac0_dVb = dQac0_dVe = dQac0_dT = 0.0; + dQac02_dVrg = dQac02_dVg = dQac02_dVd = dQac02_dVb = dQac02_dVe = dQac02_dT = 0.0; + Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dVe = dQsub0_dT = 0.0; + dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; } else /* soiMod = 0 or 1 */ { Vfb = Vth - phi - pParam->B4SOIk1eff * sqrtPhis + pParam->B4SOIdelvt; dVfb_dVb = dVth_dVb - pParam->B4SOIk1eff * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; + /* LFW_FD fix/add next 3 derivatives */ + dVfb_dVd = dVth_dVd - pParam->B4SOIk1eff * dsqrtPhis_dVd; + dVfb_dVg = dVth_dVg - pParam->B4SOIk1eff * dsqrtPhis_dVg; + dVfb_dVe = dVth_dVe - pParam->B4SOIk1eff * dsqrtPhis_dVe; /*fix below expression Wagner */ /*dVfb_dT = dVth_dT; */ dVfb_dT = dVth_dT - dphi_dT - pParam->B4SOIk1eff*dsqrtPhis_dT; @@ -6457,8 +6972,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; + /* LFW_FD fix/add next 4 derivatives */ + dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd - T1 * dVbseff_dVd; + dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseff_dVb; + dVfbeff_dVg = (1.0 - T1 - T2) * dVfb_dVg - T1 * (dVbseff_dVg - dVgs_eff_dVg); + dVfbeff_dVe = (1.0 - T1 - T2) * dVfb_dVe - T1 * dVbseff_dVe; dVfbeff_dVrg = T1 * dVgs_eff_dVg; /*fix below expression Wagner */ /*if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; @@ -6471,6 +6989,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dQac0_dVrg = CoxWLb * dVfbeff_dVrg; dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); + /* LFW_FD add next 2 derivatives */ + dQac0_dVg = CoxWLb * (dVfbeff_dVg - dVfb_dVg); + dQac0_dVe = CoxWLb * (dVfbeff_dVe - dVfb_dVe); if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); else dQac0_dT = 0.0; /* v4.1 */ @@ -6481,6 +7002,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Vfb2 = Vfb + eggbcp2; /* bugfix 4.3.1 -Tanvir */ dVfb2_dVb = dVfb_dVb; dVfb2_dVd = dVfb_dVd; + /* LFW_FD add next 2 derivatives */ + dVfb2_dVg = dVfb_dVg; + dVfb2_dVe = dVfb_dVe; dVfb2_dT = dVfb_dT; DELTA_3_SOI2 = DELTA_3_SOI; V3 = Vfb2 - Vgs_eff2 + Vbseff - DELTA_3_SOI2; @@ -6494,8 +7018,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff2 = Vfb2 - 0.5 * (V3 + T0); - dVfbeff2_dVd = (1.0 - T1 - T2) * dVfb2_dVd; /* Samuel Mertens */ - dVfbeff2_dVb = (1.0 - T1 - T2) * dVfb2_dVb - T1; /* Samuel Mertens */ + /* LFW_FD fix/add next 4 derivatives */ + dVfbeff2_dVg = (1.0 - T2) * dVfb2_dVg - T1 * (dVfb2_dVg - dVgs_eff2_dVg + dVbseff_dVg); + dVfbeff2_dVd = (1.0 - T2) * dVfb2_dVd - T1 * (dVfb2_dVd + dVbseff_dVd); + dVfbeff2_dVb = (1.0 - T2) * dVfb2_dVb - T1 * (dVfb2_dVb + dVbseff_dVb); + dVfbeff2_dVe = (1.0 - T2) * dVfb2_dVe - T1 * (dVfb2_dVe + dVbseff_dVe); dVfbeff2_dVrg = T1 * dVgs_eff2_dVg; /*fix below expression Wagner */ /*if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT; */ @@ -6507,6 +7034,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dQac02_dVrg = CoxWLb2 * dVfbeff2_dVrg; dQac02_dVd = CoxWLb2 * (dVfbeff2_dVd - dVfb2_dVd); dQac02_dVb = CoxWLb2 * (dVfbeff2_dVb - dVfb2_dVb); + /* LFW_FD add next 2 derivatives */ + dQac02_dVg = CoxWLb2 * (dVfbeff2_dVg - dVfb2_dVg); + dQac02_dVe = CoxWLb2 * (dVfbeff2_dVe - dVfb2_dVe); if (selfheat) dQac02_dT = CoxWLb2 * (dVfbeff2_dT - dVfb2_dT); else dQac02_dT = 0.0; @@ -6530,9 +7060,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Qsub0 = CoxWLb * pParam->B4SOIk1ox * (T1 - T0); /* 4.1 bug fix */ dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); - dQsub0_dVg = -T2; - dQsub0_dVd = -T2 * dVfbeff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); + /* LFW_FD fix/add next 4 derivatives */ + dQsub0_dVd = -T2 * (dVfbeff_dVd + dVbseff_dVd + dVgsteff_dVd); + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVbseff_dVg - dVgsteff_dVg); + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseff_dVb + dVgsteff_dVb); + dQsub0_dVe = -T2 * (dVfbeff_dVe + dVbseff_dVe + dVgsteff_dVe); /*fix below expression Wagner */ /*if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; */ if (selfheat) dQsub0_dT = -T2 * (-dVgs_eff_dT + dVfbeff_dT + dVbseff_dT + dVgsteff_dT); @@ -6551,9 +7083,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } Qsub0 += CoxWLb2 * pParam->B4SOIk1ox * (T1 - T0); dQsub02_dVrg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVrg); - dQsub02_dVg = -T2; - dQsub02_dVd = -T2 * dVfbeff2_dVd; - dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1); + /* LFW_FD fix/add next 4 derivatives */ + dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVbseff_dVg - dVgsteff2_dVg); + dQsub02_dVd = -T2 * ( dVfbeff2_dVd + dVbseff_dVd + dVgsteff2_dVd); + dQsub02_dVb = -T2 * ( dVfbeff2_dVb + dVbseff_dVb + dVgsteff2_dVb); + dQsub02_dVe = -T2 * ( dVfbeff2_dVe + dVbseff_dVe + dVgsteff2_dVe); /*fix below expression Wagner */ /*if (selfheat) dQsub02_dT = -T2 * dVfbeff2_dT; */ if (selfheat) dQsub02_dT = -T2 * (dVfbeff2_dT + dVbseff_dT + dVgsteff2_dT); @@ -6566,12 +7100,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; + /* LFW_FD add next 3 derivatives */ + dAbulkCV_dVg = pParam->B4SOIabulkCVfactor * dAbulk0_dVg; + dAbulkCV_dVd = pParam->B4SOIabulkCVfactor * dAbulk0_dVd; + dAbulkCV_dVe = pParam->B4SOIabulkCVfactor * dAbulk0_dVe; dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; dAbulkCV_dT = dAbulk0_dT * pParam->B4SOIabulkCVfactor; /* new line Wagner */ VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + /* LFW_FD fix/add next 4 derivatives */ + dVdsatCV_dVg = (dVgsteff_dVg -VdsatCV * dAbulkCV_dVg) / AbulkCV; + dVdsatCV_dVd = (dVgsteff_dVd -VdsatCV * dAbulkCV_dVd) / AbulkCV; + dVdsatCV_dVb = (dVgsteff_dVb -VdsatCV * dAbulkCV_dVb) / AbulkCV; + dVdsatCV_dVe = (dVgsteff_dVe -VdsatCV * dAbulkCV_dVe) / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); @@ -6579,9 +7120,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + /* LFW_FD fix/add next 4 derivatives */ + dVdseffCV_dVg = ( 1.0 - T1 - T2) * dVdsatCV_dVg; + dVdseffCV_dVd = ( 1.0 - T1 - T2) * dVdsatCV_dVd + T1; + dVdseffCV_dVb = ( 1.0 - T1 - T2) * dVdsatCV_dVb; + dVdseffCV_dVe = ( 1.0 - T1 - T2) * dVdsatCV_dVe; /* 10 new lines Wagner */ if (selfheat) { dVdsatCV_dT = dVgsteff_dT/AbulkCV @@ -6596,18 +7139,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.1 */ if (here->B4SOIagbcp2 > 0) - { VdsatCV2 = Vgsteff2 / AbulkCV; - dVdsatCV2_dVg = 1.0 / AbulkCV; - dVdsatCV2_dVb = -VdsatCV2 * dAbulkCV_dVb / AbulkCV; + { VdsatCV2 = Vgsteff2 / AbulkCV; + /* LFW_FD fix/add next 4 derivatives */ + dVdsatCV2_dVg = (dVgsteff2_dVg - VdsatCV2 * dAbulkCV_dVg) / AbulkCV; + dVdsatCV2_dVd = (dVgsteff2_dVd - VdsatCV2 * dAbulkCV_dVd) / AbulkCV; + dVdsatCV2_dVb = (dVgsteff2_dVb - VdsatCV2 * dAbulkCV_dVb) / AbulkCV; + dVdsatCV2_dVe = (dVgsteff2_dVe - VdsatCV2 * dAbulkCV_dVe) / AbulkCV; V4 = VdsatCV2 - Vds - DELTA_4; T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T0); T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV2_dVg = T3; - dVdseffCV2_dVd = T1; - dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + /* LFW_FD fix/add next 4 derivatives */ + dVdseffCV2_dVg = (1.0 - T1 - T2 ) * dVdsatCV2_dVg; + dVdseffCV2_dVd = (1.0 - T1 - T2 ) * dVdsatCV2_dVd + T1; + dVdseffCV2_dVb = (1.0 - T1 - T2 ) * dVdsatCV2_dVb; + dVdseffCV2_dVe = (1.0 - T1 - T2 ) * dVdsatCV2_dVe; /* 10 new lines Wagner */ if (selfheat) { dVdsatCV2_dT = dVgsteff2_dT/AbulkCV @@ -6623,11 +7171,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* end v4.1 */ /* v3.1 */ + Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; /* LFW_FD flexilint */ dqbulk_dT = 0; /* new line Wagner */ if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { - qbulk = Cbg1 = Cbd1 = Cbb1 = 0; - Cbg12 = Cbd12 = Cbb12 = 0; /* v4.1 */ + qbulk = Cbg1 = Cbd1 = Cbb1 = Cbe1 = 0; /* LFW_FD enhance 2 lines */ + Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; /* v4.1 */ } else { @@ -6645,9 +7194,33 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T5 = -T7 * T5; T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; - Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 20 lines */ +/* Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); */ +/* Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; */ +/* Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ + + dT0_dVg = AbulkCV * dVdseffCV_dVg + dAbulkCV_dVg * VdseffCV; + dT0_dVd = AbulkCV * dVdseffCV_dVd + dAbulkCV_dVd * VdseffCV; + dT0_dVb = AbulkCV * dVdseffCV_dVb + dAbulkCV_dVb * VdseffCV; + dT0_dVe = AbulkCV * dVdseffCV_dVe + dAbulkCV_dVe * VdseffCV; + + dT1_dVg = 12.0 * (dVgsteff_dVg - 0.5 * dT0_dVg); + dT1_dVd = 12.0 * (dVgsteff_dVd - 0.5 * dT0_dVd); + dT1_dVb = 12.0 * (dVgsteff_dVb - 0.5 * dT0_dVb); + dT1_dVe = 12.0 * (dVgsteff_dVe - 0.5 * dT0_dVe); + + Cbg1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVg + - T7 * VdseffCV * ((dT0_dVg - T0 * dT1_dVg / T1) / T1) + - dAbulkCV_dVg * (0.5 * VdseffCV - T3) ); + Cbd1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVd + - T7 * VdseffCV * ((dT0_dVd - T0 * dT1_dVd / T1) / T1) + - dAbulkCV_dVd * (0.5 * VdseffCV - T3) ); + Cbb1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVb + - T7 * VdseffCV * ((dT0_dVb - T0 * dT1_dVb / T1) / T1) + - dAbulkCV_dVb * (0.5 * VdseffCV - T3) ); + Cbe1 = CoxWLb * (T7 * (0.5 - T0 / T1) * dVdseffCV_dVe + - T7 * VdseffCV * ((dT0_dVe - T0 * dT1_dVe / T1) / T1) + - dAbulkCV_dVe * (0.5 * VdseffCV - T3) ); /* 10 new lines Wagner */ if (selfheat) { @@ -6676,9 +7249,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = -T7 * (T4 - 1.0); T5 = -T7 * T5; T6 = -(T7 * T6 + (0.5 * VdseffCV2 - T3)); - Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg); - Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; - Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 20 lines */ +/* Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg);*/ +/* Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; */ +/* Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ + + dT0_dVg = AbulkCV * dVdseffCV2_dVg + dAbulkCV_dVg * VdseffCV2; + dT0_dVd = AbulkCV * dVdseffCV2_dVd + dAbulkCV_dVd * VdseffCV2; + dT0_dVb = AbulkCV * dVdseffCV2_dVb + dAbulkCV_dVb * VdseffCV2; + dT0_dVe = AbulkCV * dVdseffCV2_dVe + dAbulkCV_dVe * VdseffCV2; + + dT1_dVg = 12.0 * (dVgsteff2_dVg - 0.5 * dT0_dVg); + dT1_dVd = 12.0 * (dVgsteff2_dVd - 0.5 * dT0_dVd); + dT1_dVb = 12.0 * (dVgsteff2_dVb - 0.5 * dT0_dVb); + dT1_dVe = 12.0 * (dVgsteff2_dVe - 0.5 * dT0_dVe); + + Cbg12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVg + - T7 * VdseffCV2 * ((dT0_dVg - T0 * dT1_dVg / T1) / T1) + - dAbulkCV_dVg * (0.5 * VdseffCV2 - T3) ); + Cbd12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVd + - T7 * VdseffCV2 * ((dT0_dVd - T0 * dT1_dVd / T1) / T1) + - dAbulkCV_dVd * (0.5 * VdseffCV2 - T3) ); + Cbb12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVb + - T7 * VdseffCV2 * ((dT0_dVb - T0 * dT1_dVb / T1) / T1) + - dAbulkCV_dVb * (0.5 * VdseffCV2 - T3) ); + Cbe12 = CoxWLb2 * (T7 * (0.5 - T0 / T1) * dVdseffCV2_dVe + - T7 * VdseffCV2 * ((dT0_dVe - T0 * dT1_dVe / T1) / T1) + - dAbulkCV_dVe * (0.5 * VdseffCV2 - T3) ); + /* 10 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -6721,9 +7319,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIqinv = -qinv; /* for noise v3.2 */ - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 20 lines */ + /* Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); */ + /* Cgd1 = CoxWL * T5 * dVdseffCV_dVd; */ + /* Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ + dT0_dVg = dAbulkCV_dVg * VdseffCV + AbulkCV * dVdseffCV_dVg; + dT0_dVd = dAbulkCV_dVd * VdseffCV + AbulkCV * dVdseffCV_dVd; + dT0_dVb = dAbulkCV_dVb * VdseffCV + AbulkCV * dVdseffCV_dVb; + dT0_dVe = dAbulkCV_dVe * VdseffCV + AbulkCV * dVdseffCV_dVe; + + dT1_dVg = 12.0 * (dVgsteff_dVg - 0.5 * dT0_dVg); + dT1_dVd = 12.0 * (dVgsteff_dVd - 0.5 * dT0_dVd); + dT1_dVb = 12.0 * (dVgsteff_dVb - 0.5 * dT0_dVb); + dT1_dVe = 12.0 * (dVgsteff_dVe - 0.5 * dT0_dVe); + + dT2_dVg = (dT0_dVg - T2 * dT1_dVg) / T1; + dT2_dVd = (dT0_dVd - T2 * dT1_dVd) / T1; + dT2_dVb = (dT0_dVb - T2 * dT1_dVb) / T1; + dT2_dVe = (dT0_dVe - T2 * dT1_dVe) / T1; + + dT3_dVg = dT0_dVg * T2 + T0 * dT2_dVg; + dT3_dVd = dT0_dVd * T2 + T0 * dT2_dVd; + dT3_dVb = dT0_dVb * T2 + T0 * dT2_dVb; + dT3_dVe = dT0_dVe * T2 + T0 * dT2_dVe; + + Cgg1 = CoxWL * (dVgsteff_dVg - 0.5 * dT0_dVg + dT3_dVg); + Cgd1 = CoxWL * (dVgsteff_dVd - 0.5 * dT0_dVd + dT3_dVd); + Cgb1 = CoxWL * (dVgsteff_dVb - 0.5 * dT0_dVb + dT3_dVb); + Cge1 = CoxWL * (dVgsteff_dVe - 0.5 * dT0_dVe + dT3_dVe); /* 7 new lines Wagner */ if (selfheat) { @@ -6735,6 +7358,9 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { else dqgate_dT = 0; /* v4.1 */ + /* LFW_FD 2 new lines per flexilint */ + T12 = T02 = Cgg12 = Cgd12 = Cgb12 = Cge12 = 0.0; + Csg12 = Csd12 = Csb12 = Cse12 = 0.0; dqsrc2_dT = 0; /* new line Wagner */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) @@ -6753,9 +7379,36 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { qgate = qinv; /* new line Wagner */ here->B4SOIqinv = -qinv; - Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); - Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; - Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 20 lines */ + /* Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); */ + /* Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; */ + /* Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ + + dT02_dVg = dAbulkCV_dVg * VdseffCV2 + AbulkCV * dVdseffCV2_dVg; + dT02_dVd = dAbulkCV_dVd * VdseffCV2 + AbulkCV * dVdseffCV2_dVd; + dT02_dVb = dAbulkCV_dVb * VdseffCV2 + AbulkCV * dVdseffCV2_dVb; + dT02_dVe = dAbulkCV_dVe * VdseffCV2 + AbulkCV * dVdseffCV2_dVe; + + dT12_dVg = 12.0 * (dVgsteff2_dVg - 0.5 * dT02_dVg); + dT12_dVd = 12.0 * (dVgsteff2_dVd - 0.5 * dT02_dVd); + dT12_dVb = 12.0 * (dVgsteff2_dVb - 0.5 * dT02_dVb); + dT12_dVe = 12.0 * (dVgsteff2_dVe - 0.5 * dT02_dVe); + + dT2_dVg = (dT02_dVg - T2 * dT12_dVg) / T12; + dT2_dVd = (dT02_dVd - T2 * dT12_dVd) / T12; + dT2_dVb = (dT02_dVb - T2 * dT12_dVb) / T12; + dT2_dVe = (dT02_dVe - T2 * dT12_dVe) / T12; + + dT3_dVg = dT02_dVg * T2 + T02 * dT2_dVg; + dT3_dVd = dT02_dVd * T2 + T02 * dT2_dVd; + dT3_dVb = dT02_dVb * T2 + T02 * dT2_dVb; + dT3_dVe = dT02_dVe * T2 + T02 * dT2_dVe; + + Cgg12 = CoxWL2 * (dVgsteff2_dVg - 0.5 * dT02_dVg + dT3_dVg); + Cgd12 = CoxWL2 * (dVgsteff2_dVd - 0.5 * dT02_dVd + dT3_dVd); + Cgb12 = CoxWL2 * (dVgsteff2_dVb - 0.5 * dT02_dVb + dT3_dVb); + Cge12 = CoxWL2 * (dVgsteff2_dVe - 0.5 * dT02_dVe + dT3_dVe); + /* 8 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -6777,9 +7430,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 12 lines */ + /* Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); */ + /* Csd1 = CoxWL * T5 * dVdseffCV_dVd; */ + /* Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);*/ + dT1_dVg = 2.0 * dT1_dVg; + dT1_dVd = 2.0 * dT1_dVd; + dT1_dVb = 2.0 * dT1_dVb; + dT1_dVe = 2.0 * dT1_dVe; + + Csg1 = -CoxWL * (0.5 * dVgsteff_dVg + 0.25 * dT0_dVg + - 2.0 * T0 * dT0_dVg / T1 + T0 * T0 * dT1_dVg / (T1 * T1)); + Csd1 = -CoxWL * (0.5 * dVgsteff_dVd + 0.25 * dT0_dVd + - 2.0 * T0 * dT0_dVd / T1 + T0 * T0 * dT1_dVd / (T1 * T1)); + Csb1 = -CoxWL * (0.5 * dVgsteff_dVb + 0.25 * dT0_dVb + - 2.0 * T0 * dT0_dVb / T1 + T0 * T0 * dT1_dVb / (T1 * T1)); + Cse1 = -CoxWL * (0.5 * dVgsteff_dVe + 0.25 * dT0_dVe + - 2.0 * T0 * dT0_dVe / T1 + T0 * T0 * dT1_dVe / (T1 * T1)); /* 8 new lines Wagner */ if (selfheat) { @@ -6805,9 +7472,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = -(0.5 + 24.0 * T02 * T02 / (T12 * T12)); T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T02 * T7); T6 = -(0.25 * VdseffCV2 - 12.0 * T02 * VdseffCV2 * T7); - Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); - Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; - Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + /* LFW_FD fix next 3 lines with next 12 lines */ + /* Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); */ + /* Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; */ + /* Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb);*/ + dT12_dVg = 2.0 * dT12_dVg; + dT12_dVd = 2.0 * dT12_dVd; + dT12_dVb = 2.0 * dT12_dVb; + dT12_dVe = 2.0 * dT12_dVe; + + Csg12 = -CoxWL2 * (0.5 * dVgsteff2_dVg + 0.25 * dT02_dVg + - 2.0 * T02 * dT02_dVg / T12 + T02 * T02 * dT12_dVg / (T12 * T12)); + Csd12 = -CoxWL2 * (0.5 * dVgsteff2_dVd + 0.25 * dT02_dVd + - 2.0 * T02 * dT02_dVd / T12 + T02 * T02 * dT12_dVd / (T12 * T12)); + Csb12 = -CoxWL2 * (0.5 * dVgsteff2_dVb + 0.25 * dT02_dVb + - 2.0 * T02 * dT02_dVb / T12 + T02 * T02 * dT12_dVb / (T12 * T12)); + Cse12 = -CoxWL2 * (0.5 * dVgsteff2_dVe + 0.25 * dT02_dVe + - 2.0 * T02 * dT02_dVe / T12 + T02 * T02 * dT12_dVe / (T12 * T12)); /* 11 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -6833,6 +7514,39 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { - 2.0 * T0 * T0 * T0 / 15.0; qsrc = -T2 * T3; + /* LFW_FD add next 28 lines of code */ + dT1_dVg = dVgsteff_dVg - 0.5 * dT0_dVg; + dT1_dVd = dVgsteff_dVd - 0.5 * dT0_dVd; + dT1_dVb = dVgsteff_dVb - 0.5 * dT0_dVb; + dT1_dVe = dVgsteff_dVe - 0.5 * dT0_dVe; + + dT2_dVg = - 2.0 * T2 * dT1_dVg / T1; + dT2_dVd = - 2.0 * T2 * dT1_dVd / T1; + dT2_dVb = - 2.0 * T2 * dT1_dVb / T1; + dT2_dVe = - 2.0 * T2 * dT1_dVe / T1; + + dT3_dVg = dVgsteff_dVg * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) + + Vgsteff * (4.0 * T0 *dT0_dVg /3 + dVgsteff_dVg * (Vgsteff - 4.0 * T0 / 3.0) + + Vgsteff * (dVgsteff_dVg -4.0 * dT0_dVg / 3.0)) + - 2.0 * T0 * T0 * dT0_dVg / 5.0; + dT3_dVd = dVgsteff_dVd * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) + + Vgsteff * (4.0 * T0 *dT0_dVd /3 + dVgsteff_dVd * (Vgsteff - 4.0 * T0 / 3.0) + + Vgsteff * (dVgsteff_dVd -4.0 * dT0_dVd / 3.0)) + - 2.0 * T0 * T0 * dT0_dVd / 5.0; + dT3_dVb = dVgsteff_dVb * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) + + Vgsteff * (4.0 * T0 *dT0_dVb /3 + dVgsteff_dVb * (Vgsteff - 4.0 * T0 / 3.0) + + Vgsteff * (dVgsteff_dVb -4.0 * dT0_dVb / 3.0)) + - 2.0 * T0 * T0 * dT0_dVb / 5.0; + dT3_dVe = dVgsteff_dVe * (2.0 * T0 * T0 / 3.0 + Vgsteff * (Vgsteff - 4.0 * T0 / 3.0)) + + Vgsteff * (4.0 * T0 *dT0_dVe /3 + dVgsteff_dVe * (Vgsteff - 4.0 * T0 / 3.0) + + Vgsteff * (dVgsteff_dVe -4.0 * dT0_dVe / 3.0)) + - 2.0 * T0 * T0 * dT0_dVe / 5.0; + + Csg1 = - T2 * dT3_dVg - dT2_dVg * T3; + Csd1 = - T2 * dT3_dVd - dT2_dVd * T3; + Csb1 = - T2 * dT3_dVb - dT2_dVb * T3; + Cse1 = - T2 * dT3_dVe - dT2_dVe * T3; + /* 13 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; @@ -6848,16 +7562,17 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else dqsrc_dT = 0; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; + /* LFW_FD delete next 10 lines of code */ + /* T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) */ + /* + 0.4 * T0 * T0; */ + /* T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 */ + /* * Vgsteff - 8.0 * T0 / 3.0) */ + /* + 2.0 * T0 * T0 / 3.0); */ + /* T5 = (qsrc / T1 + T2 * T7) * AbulkCV; */ + /* T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);*/ + /* Csg1 = T4 + T5 * dVdseffCV_dVg; */ + /* Csd1 = T5 * dVdseffCV_dVd; */ + /* Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; */ /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) @@ -6876,9 +7591,42 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { + 2.0 * T02 * T02 / 3.0); T5 = (qsrc2 / T12 + T2 * T7) * AbulkCV; T6 = (qsrc2 / T12 * VdseffCV2 + T2 * T7 * VdseffCV2); - Csg12 = T4 + T5 * dVdseffCV2_dVg; - Csd12 = T5 * dVdseffCV2_dVd; - Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb; + /* LFW_FD fix next 3 lines with next 28 lines */ + /* Csg12 = T4 + T5 * dVdseffCV2_dVg; */ + /* Csd12 = T5 * dVdseffCV2_dVd; */ + /* Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb;*/ + + dT12_dVg = dVgsteff2_dVg - 0.5 * dT02_dVg; + dT12_dVd = dVgsteff2_dVd - 0.5 * dT02_dVd; + dT12_dVb = dVgsteff2_dVb - 0.5 * dT02_dVb; + dT12_dVe = dVgsteff2_dVe - 0.5 * dT02_dVe; + + dT2_dVg = - 2.0 * T2 * dT12_dVg / T12; + dT2_dVd = - 2.0 * T2 * dT12_dVd / T12; + dT2_dVb = - 2.0 * T2 * dT12_dVb / T12; + dT2_dVe = - 2.0 * T2 * dT12_dVe / T12; + + dT3_dVg = dVgsteff2_dVg * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) + + Vgsteff2 * (4.0 * T02 *dT02_dVg /3 + dVgsteff2_dVg * (Vgsteff2 - 4.0 * T02 / 3.0) + + Vgsteff2 * (dVgsteff2_dVg -4.0 * dT02_dVg / 3.0)) + - 2.0 * T02 * T02 * dT02_dVg / 5.0; + dT3_dVd = dVgsteff2_dVd * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) + + Vgsteff2 * (4.0 * T02 *dT02_dVd /3 + dVgsteff2_dVd * (Vgsteff2 - 4.0 * T02 / 3.0) + + Vgsteff2 * (dVgsteff2_dVd -4.0 * dT02_dVd / 3.0)) + - 2.0 * T02 * T02 * dT02_dVd / 5.0; + dT3_dVb = dVgsteff2_dVb * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) + + Vgsteff2 * (4.0 * T02 *dT02_dVb /3 + dVgsteff2_dVb * (Vgsteff2 - 4.0 * T02 / 3.0) + + Vgsteff2 * (dVgsteff2_dVb -4.0 * dT02_dVb / 3.0)) + - 2.0 * T02 * T02 * dT02_dVb / 5.0; + dT3_dVe = dVgsteff2_dVe * (2.0 * T02 * T02 / 3.0 + Vgsteff2 * (Vgsteff2 - 4.0 * T02 / 3.0)) + + Vgsteff2 * (4.0 * T02 *dT02_dVe /3 + dVgsteff2_dVe * (Vgsteff2 - 4.0 * T02 / 3.0) + + Vgsteff2 * (dVgsteff2_dVe -4.0 * dT02_dVe / 3.0)) + - 2.0 * T02 * T02 * dT02_dVe / 5.0; + + Csg12 = - T2 * dT3_dVg - dT2_dVg * T3; + Csd12 = - T2 * dT3_dVd - dT2_dVd * T3; + Csb12 = - T2 * dT3_dVb - dT2_dVb * T3; + Cse12 = - T2 * dT3_dVe - dT2_dVe * T3; /* 13 new lines Wagner */ if (selfheat) { @@ -6907,6 +7655,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Csg1 = - 0.5 * (Cgg1 + Cbg1); Csb1 = - 0.5 * (Cgb1 + Cbb1); Csd1 = - 0.5 * (Cgd1 + Cbd1); + Cse1 = - 0.5 * (Cge1 + Cbe1); /* LFW_FD new line */ /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) @@ -6914,6 +7663,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Csg12 = -0.5 * (Cgg12 + Cbg12); Csb12 = -0.5 * (Cgb12 + Cbb12); Csd12 = -0.5 * (Cgd12 + Cbd12); + Cse12 = -0.5 * (Cge12 + Cbe12); /* LFW_FD new line */ } dqsrc_dT = -0.5 * (dqgate_dT + dqbulk_dT); /* new line Wagner */ /* end v4.1 */ @@ -6943,6 +7693,10 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { qgate = qinv + Qac0 + Qsub0; + /* LFW_FD commentary only; next 2 lines */ + /* Correct definition of qgate below. Not used because it changes CMC defined model.*/ + /* qgate = qinv + Qac0 + Qsub0 - qbulk;*/ + qbody = (qbulk - Qac0 - Qsub0 - Qe1); qsub = Qe1; qdrn = -(qgate + qsrc + qbody + qsub); @@ -6958,20 +7712,30 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Ce1b = dQe1_dVb; Ce1e = dQe1_dVe; - Csg = Csg1 * dVgsteff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; + /* LFW_FD fix/add next 4 lines */ + Csg = Csg1; + Csd = Csd1; + Csb = Csb1; + Cse = Cse1; + /*fix expression below Wagner */ /*if (selfheat) CsT = Csg1 * dVgsteff_dT;*/ if (selfheat) CsT = dqsrc_dT; else CsT = 0.0; - Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg - + dQac0_dVrg + dQsub0_dVrg; - Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 - + dQac0_dVd + dQsub0_dVd; - Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb - + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; + /* LFW_FD fix/add next 4 lines */ + Cgg = Cgg1 + dQsub0_dVg + dQac0_dVg; + Cgd = Cgd1 + dQsub0_dVd + dQac0_dVd; + Cgb = Cgb1 + dQsub0_dVb + dQac0_dVb; + Cge = Cge1 + dQsub0_dVe + dQac0_dVe; + + /* LFW_FD commentary only; next 5 lines */ +/* Use these with correct definition of qgate above */ +/* Cgg = Cgg1 + dQsub0_dVg + dQac0_dVg - Cbg1; */ +/* Cgd = Cgd1 + dQsub0_dVd + dQac0_dVd - Cbd1; */ +/* Cgb = Cgb1 + dQsub0_dVb + dQac0_dVb - Cbb1; */ +/* Cge = Cge1 + dQsub0_dVe + dQac0_dVe - Cbe1; */ + if (selfheat) /*fix expression below Wagner */ /*CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT @@ -6979,12 +7743,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { CgT = dqgate_dT; else CgT = 0.0; - Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - - dQac0_dVrg - dQsub0_dVrg; - Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - - dQac0_dVd - dQsub0_dVd; - Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb - + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; + /* LFW_FD fix/add next 4 lines */ + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b; + Cbe = Cbe1 - dQac0_dVe - dQsub0_dVe - Ce1e; + if (selfheat) /*fix expression below Wagner */ /*CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT @@ -6994,46 +7758,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) { - Csg += Csg12 * dVgsteff2_dVg; - Csd += Csd12 + Csg12 * dVgsteff2_dVd; - Csb += Csg12 * dVgsteff2_dVb + Csb12 * dVbseff_dVb; - /* commented out next "if" Wagner */ - /* if (selfheat) CsT += Csg12 * dVgsteff2_dT; */ + /* LFW_FD fixed next 12 lines */ + Csg += Csg12; + Csd += Csd12; + Csb += Csb12; + Cse += Cse12; - Cgg += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVg - + dQac02_dVrg + dQsub02_dVrg; - Cgd += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVd + Cgd12 - + dQac02_dVd + dQsub02_dVd; - Cgb += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVb - + (Cgb12 + dQsub02_dVb + dQac02_dVb) * dVbseff_dVb; - /* commented out next "if" Wagner */ - /* if (selfheat) - CgT += (Cgg12 + dQsub02_dVg) * dVgsteff2_dT - + dQac02_dT + dQsub02_dT; */ + Cgg += Cgg12 + dQsub02_dVg + dQac02_dVg; + Cgd += Cgd12 + dQsub02_dVd + dQac02_dVd; + Cgb += Cgb12 + dQsub02_dVb + dQac02_dVb; + Cge += Cge12 + dQsub02_dVe + dQac02_dVe; - Cbg += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVg - - dQac02_dVrg - dQsub02_dVrg; - Cbd += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVd + Cbd12 - - dQac02_dVd - dQsub02_dVd; - Cbb += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVb - + (Cbb12 - dQsub02_dVb - dQac02_dVb) * dVbseff_dVb; - /* commented out next "if" Wagner */ - /* if (selfheat) - CbT += (Cbg12 - dQsub02_dVg) * dVgsteff2_dT - - dQac02_dT - dQsub02_dT; */ + Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; + Cbd += Cbd12 - dQac02_dVd - dQsub02_dVd; + Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; + Cbe += Cbe12 - dQac02_dVe - dQsub02_dVe; } /* end v4.1 */ here->B4SOIcggb = Cgg ; - here->B4SOIcgsb = - (Cgg + Cgd + Cgb); + here->B4SOIcgsb = - (Cgg + Cgd + Cgb + Cge); /* LFW_FD fixed line */ here->B4SOIcgdb = Cgd; + here->B4SOIcgeb = Cge; /* LFW_FD new line */ here->B4SOIcgT = CgT; here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; + here->B4SOIcbsb = -(Cbg + Cbd + Cbb + Cbe); /* LFW_FD fixed line */ here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = - Ce1e ; + here->B4SOIcbeb = Cbe; /* LFW_FD fixed line */ here->B4SOIcbT = CbT; here->B4SOIceeb = Ce1e ; @@ -7041,17 +7793,18 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIcdgb = -(Cgg + Cbg + Csg); here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = 0; + here->B4SOIcdeb = -(Cge + Cse + Cbe) - Ce1e; /* LFW_FD fixed line */ here->B4SOIcdT = -(CgT + CbT + CsT) - dQe1_dT; - here->B4SOIcdsb = (Cgg + Cgd + Cgb - + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; + here->B4SOIcdsb = Cgg + Cgd + Cgb + Cge /* LFW_FD fixed expression */ + + Cbg + Cbd + Cbb + Cbe + Ce1e + + Csg + Csd + Csb + Cse + Ce1b; + } /* End of if capMod == 2 */ else if (model->B4SOIcapMod == 3) { - dVgsteff_dVb /= dVbseff_dVb; + /* dVgsteff_dVb /= dVbseff_dVb; LFW_FD comment out line */ if(model->B4SOImtrlMod == 0) Cox = 3.453133e-11 / model->B4SOItoxp; else @@ -7063,7 +7816,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v4.1 */ if (here->B4SOIagbcp2 > 0) { - dVgsteff2_dVb /= dVbseff_dVb; + /* dVgsteff2_dVb /= dVbseff_dVb; LFW_FD comment out line */ CoxWL2 *= model->B4SOItox / model->B4SOItoxp; CoxWLb2 *= model->B4SOItox/ @@ -7072,13 +7825,21 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* end v4.1 */ /* v3.1 */ - dDeltaPhi2_dT = 0.0; /* new line Wagner */ + /* LFW_FD flexilint inits next 7 lines */ + Vfbzb = pParam->B4SOIvfbzb + pParam->B4SOIdelvt; + dVfbzb_dT = 0.0; + Vfbzb2 = dVfbzb2_dT = 0.0; + Tcen2 = dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; + Coxeff2 = dCoxeff2_dVg = dCoxeff2_dVd = dCoxeff2_dVb = dCoxeff2_dVe = dCoxeff2_dT = 0.0; + CoxWLcenb2= dCoxWLcenb2_dT= 0.0; + dDeltaPhi2_dT = 0.0; if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { - Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0; - dQac02_dVg = dQac02_dVb = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; - dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; + /* LFW_FD enhance next 4 lines */ + Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dVd = dQac0_dVe = dQac0_dT = 0.0; + dQac02_dVg = dQac02_dVb = dQac02_dVd = dQac02_dVe = dQac02_dT = 0.0; + Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dVe = dQsub0_dT = 0.0; + dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dVe = dQsub02_dT = 0.0; Vfbzb = dVfbzb_dT = 0; /* v4.2 bug fix # 20 */ } else /* soiMod = 0 or 1 */ @@ -7099,7 +7860,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (Vfbzb <= 0.0) { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); T2 = -DELTA_3 / T0; - dTL0_dT = (V3 * dTL3_dT - 2.0 * DELTA_3 * dVfbzb_dT) / T0; /* new line Wagner */ + /* dTL0_dT = (V3 * dTL3_dT - 2.0 * DELTA_3 * dVfbzb_dT) / T0; LFW_FD delete line */ } else { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); @@ -7108,8 +7869,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = Vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; + /* LFW_FD fix/add next 4 lines */ + dVfbeff_dVg = T1 * (dVgs_eff_dVg - dVbseff_dVg); + dVfbeff_dVd = T1 * ( - dVbseff_dVd); + dVfbeff_dVb = T1 * ( - dVbseff_dVb); + dVfbeff_dVe = T1 * ( - dVbseff_dVe); /*fix expression below Wagner */ /*if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; - T1*dVbseff_dT; */ @@ -7133,8 +7897,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff2 = Vfbzb2 - 0.5 * (V3 + T0); - dVfbeff2_dVg = T1 * dVgs_eff2_dVg; - dVfbeff2_dVb = -T1; + /* LFW_FD fix/add next 4 lines */ + dVfbeff2_dVg = T1 * (dVgs_eff2_dVg - dVbseff_dVg); + dVfbeff2_dVd = T1 * ( - dVbseff_dVd); + dVfbeff2_dVb = T1 * ( - dVbseff_dVb); + dVfbeff2_dVe = T1 * ( - dVbseff_dVe); /*fix expression below Wagner */ /*if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT;*/ if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT @@ -7144,15 +7911,21 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* end v4.1 */ T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -1.0 / Tox; + /* LFW_FD fix/add next 4 lines */ + dT0_dVg = (dVgs_eff_dVg - dVbseff_dVg) /Tox; + dT0_dVd = - dVbseff_dVd /Tox; + dT0_dVb = - dVbseff_dVb /Tox; + dT0_dVe = - dVbseff_dVe /Tox; tmp = T0 * pParam->B4SOIacde; if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) { Tcen = pParam->B4SOIldeb * exp(tmp); - dTcen_dVg = pParam->B4SOIacde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = pParam->B4SOIacde * Tcen; + dTcen_dVg = TL1 * dT0_dVg; + dTcen_dVd = TL1 * dT0_dVd; + dTcen_dVb = TL1 * dT0_dVb; + dTcen_dVe = TL1 * dT0_dVe; if (selfheat) /* fix below expression Wagner */ /*dTcen_dT = -Tcen * pParam->B4SOIacde * dVfbzb_dT / Tox; */ @@ -7161,13 +7934,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else if (tmp <= -EXPL_THRESHOLD) { Tcen = pParam->B4SOIldeb * MIN_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - dTcen_dT = 0; /* new line Wagner */ + dTcen_dVg = dTcen_dVb = dTcen_dVd = dTcen_dVe = dTcen_dT = 0.0; /* LFW_FD enhance line */ } else { Tcen = pParam->B4SOIldeb * MAX_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - dTcen_dT = 0; /* new line Wagner */ + dTcen_dVg = dTcen_dVb = dTcen_dVd = dTcen_dVe = dTcen_dT = 0.0; /* LFW_FD enhance line */ } /*LINK = 1.0e-3 * (toxe - model->B4SOIdtoxcv); v2.2.3 */ @@ -7184,32 +7955,39 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dTcen_dVg *= T1; dTcen_dVb *= T1; + dTcen_dVd *= T1; /* LFW_FD new line */ + dTcen_dVe *= T1; /* LFW_FD new line */ if (selfheat) dTcen_dT *= T1; else dTcen_dT = 0; /* v4.1 */ if (here->B4SOIagbcp2 > 0) { T0 = (Vgs_eff2 - Vbseff - Vfbzb2) / Tox; - dT0_dVg = dVgs_eff2_dVg / Tox; - dT0_dVb = -1.0 / Tox; + /* LFW_FD fix/add next 4 lines */ + dT0_dVg = (dVgs_eff2_dVg - dVbseff_dVg) / Tox; + dT0_dVd = -dVbseff_dVd / Tox; + dT0_dVb = -dVbseff_dVb / Tox; + dT0_dVe = -dVbseff_dVe / Tox; tmp = T0 * pParam->B4SOIacde; if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) { Tcen2 = pParam->B4SOIldeb * exp(tmp); - dTcen2_dVg = pParam->B4SOIacde * Tcen2; - dTcen2_dVb = dTcen2_dVg * dT0_dVb; - dTcen2_dVg *= dT0_dVg; + /* LFW_FD fix/add next 4 lines */ + dTcen2_dVg = pParam->B4SOIacde * Tcen2 * dT0_dVg; + dTcen2_dVd = pParam->B4SOIacde * Tcen2 * dT0_dVd; + dTcen2_dVb = pParam->B4SOIacde * Tcen2 * dT0_dVb; + dTcen2_dVe = pParam->B4SOIacde * Tcen2 * dT0_dVe; if (selfheat) dTcen2_dT = -Tcen2 * pParam->B4SOIacde * dVfbzb2_dT / Tox; else dTcen2_dT = 0; } else if (tmp <= -EXPL_THRESHOLD) { Tcen2 = pParam->B4SOIldeb * MIN_EXPL; - dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; /* LFW_FD enhance line */ } else { Tcen2 = pParam->B4SOIldeb * MAX_EXPL; - dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + dTcen2_dVg = dTcen2_dVd = dTcen2_dVb = dTcen2_dVe = dTcen2_dT = 0.0; /* LFW_FD enhance line */ } V3 = pParam->B4SOIldeb - Tcen2 - LINK; @@ -7223,6 +8001,8 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } dTcen2_dVg *= T1; dTcen2_dVb *= T1; + dTcen2_dVd *= T1; /* LFW_FD new line */ + dTcen2_dVe *= T1; /* LFW_FD new line */ if (selfheat) dTcen2_dT *= T1; else dTcen2_dT = 0; @@ -7233,9 +8013,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = Cox / (Cox + Ccen); Coxeff = T2 * Ccen; T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = T2 * T2 * T3; + dCoxeff_dVg = TL1 * dTcen_dVg; + dCoxeff_dVd = TL1 * dTcen_dVd; + dCoxeff_dVb = TL1 * dTcen_dVb; + dCoxeff_dVe = TL1 * dTcen_dVe; if (selfheat) /*fix expression below Wagner */ /*dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen));*/ @@ -7249,9 +8032,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = Cox / (Cox + Ccen2); Coxeff2 = T2 * Ccen2; T3 = -Ccen2 / Tcen2; - dCoxeff2_dVg = T2 * T2 * T3; - dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; - dCoxeff2_dVg *= dTcen2_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = T2 * T2 * T3; + dCoxeff2_dVg = TL1 * dTcen2_dVg; + dCoxeff2_dVd = TL1 * dTcen2_dVd; + dCoxeff2_dVb = TL1 * dTcen2_dVb; + dCoxeff2_dVe = TL1 * dTcen2_dVe; if (selfheat) /*fix expression below Wagner */ /*dCoxeff2_dT = T3 * dTcen2_dT * (T2 - Coxeff2 / (Cox + Ccen2));*/ @@ -7273,10 +8059,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* end v4.1 */ Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcenb * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcenb * dVfbeff_dVb - + QovCox * dCoxeff_dVb; + /* LFW_FD fix/add next 4 lines */ + dQac0_dVg = CoxWLcenb * dVfbeff_dVg + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcenb * dVfbeff_dVb + QovCox * dCoxeff_dVb; + dQac0_dVd = CoxWLcenb * dVfbeff_dVd + QovCox * dCoxeff_dVd; + dQac0_dVe = CoxWLcenb * dVfbeff_dVe + QovCox * dCoxeff_dVe; if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) + dCoxWLcenb_dT * (Vfbeff - Vfbzb); else dQac0_dT = 0.0; @@ -7285,10 +8072,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { Qac02 = CoxWLcenb2 * (Vfbeff2 - Vfbzb2); QovCox2 = Qac02 / Coxeff2; - dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg - + QovCox2 * dCoxeff2_dVg; - dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb - + QovCox2 * dCoxeff2_dVb; + /* LFW_FD fix/add next 4 lines */ + dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg + QovCox2 * dCoxeff2_dVg; + dQac02_dVd = CoxWLcenb2 * dVfbeff2_dVd + QovCox2 * dCoxeff2_dVd; + dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb + QovCox2 * dCoxeff2_dVb; + dQac02_dVe = CoxWLcenb2 * dVfbeff2_dVe + QovCox2 * dCoxeff2_dVe; if (selfheat) dQac02_dT = CoxWLcenb2 * (dVfbeff2_dT - dVfbzb2_dT) + dCoxWLcenb2_dT * (Vfbeff2 - Vfbzb2); else dQac02_dT = 0.0; @@ -7315,11 +8103,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Qsub0 = CoxWLcenb * pParam->B4SOIk1ox * (T1 - T0); QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; + /* LFW_FD fix/add next 4 lines */ + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVbseff_dVg - dVgsteff_dVg) + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * (dVfbeff_dVd + dVbseff_dVd + dVgsteff_dVd) + QovCox * dCoxeff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseff_dVb + dVgsteff_dVb) + QovCox * dCoxeff_dVb; + dQsub0_dVe = -T2 * (dVfbeff_dVe + dVbseff_dVe + dVgsteff_dVe) + QovCox * dCoxeff_dVe; + if (selfheat) /*fix 1st line of expression below Wagner */ /*dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT)*/ @@ -7346,11 +8135,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Qsub02 = CoxWLcenb2 * pParam->B4SOIk1ox * (T1 - T0); QovCox2 = Qsub02 / Coxeff2; - dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVgsteff2_dVg) - + QovCox2 * dCoxeff2_dVg; - dQsub02_dVd = -T2 * dVgsteff2_dVd; - dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1 + dVgsteff2_dVb) - + QovCox2 * dCoxeff2_dVb; + /* LFW_FD fix/add next 4 lines */ + dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVbseff_dVg - dVgsteff2_dVg) + QovCox2 * dCoxeff2_dVg; + dQsub02_dVd = -T2 * (dVfbeff2_dVd + dVbseff_dVd + dVgsteff2_dVd) + QovCox2 * dCoxeff2_dVd; + dQsub02_dVb = -T2 * (dVfbeff2_dVb + dVbseff_dVb + dVgsteff2_dVb) + QovCox2 * dCoxeff2_dVb; + dQsub02_dVe = -T2 * (dVfbeff2_dVe + dVbseff_dVe + dVgsteff2_dVe) + QovCox2 * dCoxeff2_dVe; + if (selfheat) dQsub02_dT = -T2 * (dVfbeff2_dT + dVgsteff2_dT) + dCoxWLcenb2_dT * pParam->B4SOIk1ox * (T1 - T0); @@ -7378,10 +8168,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 2.0 * T0 + Vgsteff; DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - DeltaPhi2= dDeltaPhi2_dVg= 0.0; /* new line Wagner */ + /* LFW_FD fix/add next 5 lines */ + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVg; + dDeltaPhi_dVd = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVd; + dDeltaPhi_dVb = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVb; + dDeltaPhi_dVe = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff) * dVgsteff_dVe; + + DeltaPhi2 = dDeltaPhi2_dVg = dDeltaPhi2_dVd = dDeltaPhi2_dVb = dDeltaPhi2_dVe = 0.0; /* flexilint */ /* 7 new lines Wagner */ if (selfheat) { @@ -7396,9 +8189,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { if (here->B4SOIagbcp2 > 0) { T1 = 2.0 * T0 + Vgsteff2; DeltaPhi2 = Vtm * log(1.0 + T1 * Vgsteff2 / Denomi); - dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2); - dDeltaPhi2_dVd = dDeltaPhi2_dVg * dVgsteff2_dVd; - dDeltaPhi2_dVb = dDeltaPhi2_dVg * dVgsteff2_dVb; + /* LFW_FD fix/add next 4 lines */ + dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVg; + dDeltaPhi2_dVd = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVd; + dDeltaPhi2_dVb = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVb; + dDeltaPhi2_dVe = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2) * dVgsteff2_dVe; /* 7 new lines Wagner */ if (selfheat) { @@ -7425,10 +8220,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 1.0 + tmp; T2 = 0.7 * tmp / (T0 * Tox); Tcen = 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb); - dTcen_dVg *= dVgsteff_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = dTcen_dVg = -Tcen * T2 / T1; + dTcen_dVg = TL1 * (T5 * 4.0 * dVth_dVg + dVgsteff_dVg); + dTcen_dVd = TL1 * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd); + dTcen_dVb = TL1 * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb); + dTcen_dVe = TL1 * (T5 * 4.0 * dVth_dVe + dVgsteff_dVe); + if (selfheat) /*fix below expression Wagner */ /*dTcen_dT = -Tcen * T2 / T1 @@ -7442,12 +8240,16 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 = Cox / (Cox + Ccen); Coxeff = T0 * Ccen; T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVg = TL1 * dTcen_dVg; + dCoxeff_dVd = TL1 * dTcen_dVd; + dCoxeff_dVb = TL1 * dTcen_dVb; + dCoxeff_dVe = TL1 * dTcen_dVe; + if (selfheat) - dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); + /*dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen));*/ + dCoxeff_dT = TL1 * dTcen_dT; /* LFW_FD fix line */ else dCoxeff_dT = 0; CoxWLcen = CoxWL * Coxeff / Cox; CoxWLcenb = CoxWLb * Coxeff / Cox; @@ -7456,6 +8258,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; else dCoxWLcenb_dT = 0; /* v4.1 */ + CoxWLcen2 = 0.0; /* flexilint */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { /* T3 = 4.0 * (Vth + 1.12 - Vfbzb2 - phi); */ @@ -7469,10 +8272,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T1 = 1.0 + tmp; T2 = 0.7 * tmp / (T0 * Tox); Tcen2 = 1.9e-9 / T1; - dTcen2_dVg = -Tcen2 * T2 / T1; - dTcen2_dVd = dTcen2_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); - dTcen2_dVb = dTcen2_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); - dTcen2_dVg *= dVgsteff2_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = dTcen2_dVg = -Tcen2 * T2 / T1; + dTcen2_dVg = TL1 * (T5 * 4.0 * dVth_dVg + dVgsteff2_dVg); + dTcen2_dVd = TL1 * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); + dTcen2_dVb = TL1 * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); + dTcen2_dVe = TL1 * (T5 * 4.0 * dVth_dVe + dVgsteff2_dVe); + if (selfheat) /*fix below expression Wagner */ /*dTcen2_dT = -Tcen2 * T2 / T1 @@ -7485,10 +8291,13 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T0 = Cox / (Cox + Ccen2); Coxeff2 = T0 * Ccen2; T1 = -Ccen2 / Tcen2; - dCoxeff2_dVg = T0 * T0 * T1; - dCoxeff2_dVd = dCoxeff2_dVg * dTcen2_dVd; - dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; - dCoxeff2_dVg *= dTcen2_dVg; + /* LFW_FD fix/add next 5 lines */ + TL1 = dCoxeff2_dVg = T0 * T0 * T1; + dCoxeff2_dVg = TL1 * dTcen2_dVg; + dCoxeff2_dVd = TL1 * dTcen2_dVd; + dCoxeff2_dVb = TL1 * dTcen2_dVb; + dCoxeff2_dVe = TL1 * dTcen2_dVe; + if (selfheat) dCoxeff2_dT = T1 * dTcen2_dT * (T0 - Coxeff2 / (Cox + Ccen2)); else dCoxeff2_dT = 0; @@ -7502,13 +8311,23 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* end v4.1 */ AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; + /* LFW_FD fix/add next 4 lines */ + dAbulkCV_dVg = pParam->B4SOIabulkCVfactor * dAbulk0_dVg; dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; + dAbulkCV_dVd = pParam->B4SOIabulkCVfactor * dAbulk0_dVd; + dAbulkCV_dVe = pParam->B4SOIabulkCVfactor * dAbulk0_dVe; /* 3 new lines Wagner */ if (selfheat) dAbulkCV_dT = dAbulk0_dT * pParam->B4SOIabulkCVfactor; else dAbulkCV_dT = 0; VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; + /* LFW_FD add next 4 lines */ + dVdsatCV_dVg = (dVgsteff_dVg - dDeltaPhi_dVg - VdsatCV * dAbulkCV_dVg) / AbulkCV; + dVdsatCV_dVd = (dVgsteff_dVd - dDeltaPhi_dVd - VdsatCV * dAbulkCV_dVd) / AbulkCV; + dVdsatCV_dVb = (dVgsteff_dVb - dDeltaPhi_dVb - VdsatCV * dAbulkCV_dVb) / AbulkCV; + dVdsatCV_dVe = (dVgsteff_dVe - dDeltaPhi_dVe - VdsatCV * dAbulkCV_dVe) / AbulkCV; + V4 = VdsatCV - Vds - DELTA_4; T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + T0); @@ -7516,9 +8335,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T2 = DELTA_4 / T0; T3 = (1.0 - T1 - T2) / AbulkCV; T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + /* LFW_FD fix/add next 4 lines */ + dVdseffCV_dVg = (1.0 - T1 - T2) * dVdsatCV_dVg; + dVdseffCV_dVd = (1.0 - T1 - T2) * dVdsatCV_dVd + T1; + dVdseffCV_dVb = (1.0 - T1 - T2) * dVdsatCV_dVb; + dVdseffCV_dVe = (1.0 - T1 - T2) * dVdsatCV_dVe; /* 10 new lines Wagner */ if (selfheat) { dVdsatCV_dT = (dVgsteff_dT-dDeltaPhi_dT)/AbulkCV @@ -7539,15 +8360,34 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); T6 = T5 * VdseffCV / AbulkCV; + /* LFW_FD add next 16 lines */ + dT0_dVg = dAbulkCV_dVg * VdseffCV + AbulkCV * dVdseffCV_dVg; + dT0_dVd = dAbulkCV_dVd * VdseffCV + AbulkCV * dVdseffCV_dVd; + dT0_dVb = dAbulkCV_dVb * VdseffCV + AbulkCV * dVdseffCV_dVb; + dT0_dVe = dAbulkCV_dVe * VdseffCV + AbulkCV * dVdseffCV_dVe; + + dT1_dVg = dVgsteff_dVg - dDeltaPhi_dVg; + dT1_dVd = dVgsteff_dVd - dDeltaPhi_dVd; + dT1_dVb = dVgsteff_dVb - dDeltaPhi_dVb; + dT1_dVe = dVgsteff_dVe - dDeltaPhi_dVe; + + dT2_dVg = 12.0 * (dT1_dVg - 0.5 * dT0_dVg); + dT2_dVd = 12.0 * (dT1_dVd - 0.5 * dT0_dVd); + dT2_dVb = 12.0 * (dT1_dVb - 0.5 * dT0_dVb); + dT2_dVe = 12.0 * (dT1_dVe - 0.5 * dT0_dVe); + + dT3_dVg = (dT0_dVg - T3 * dT2_dVg) / T2; + dT3_dVd = (dT0_dVd - T3 * dT2_dVd) / T2; + dT3_dVb = (dT0_dVb - T3 * dT2_dVb) / T2; + dT3_dVe = (dT0_dVe - T3 * dT2_dVe) / T2; + qgate1 = qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); /* enhanced line Wagner */ QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* LFW_FD fix/add next 4 lines */ + Cgg1 = CoxWLcen * (dT1_dVg - dT0_dVg * (0.5 - T3) + T0 * dT3_dVg) + QovCox * dCoxeff_dVg; + Cgd1 = CoxWLcen * (dT1_dVd - dT0_dVd * (0.5 - T3) + T0 * dT3_dVd) + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (dT1_dVb - dT0_dVb * (0.5 - T3) + T0 * dT3_dVb) + QovCox * dCoxeff_dVb; + Cge1 = CoxWLcen * (dT1_dVe - dT0_dVe * (0.5 - T3) + T0 * dT3_dVe) + QovCox * dCoxeff_dVe; /* 10 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; @@ -7560,10 +8400,19 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } else dqgate_dT = 0; + /* LFW_FD 2 new lines per flexilint */ + T02 = T12 = T22 = T52 = 0.0; /* flexilint */ + Cgg12 = Cgd12 = Cgb12 = Cge12 = 0.0; /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { VdsatCV2 = (Vgsteff2 - DeltaPhi2) / AbulkCV; + /* LFW_FD add next 4 lines */ + dVdsatCV2_dVg = (dVgsteff2_dVg - dDeltaPhi2_dVg - VdsatCV2 * dAbulkCV_dVg) / AbulkCV; + dVdsatCV2_dVd = (dVgsteff2_dVd - dDeltaPhi2_dVd - VdsatCV2 * dAbulkCV_dVd) / AbulkCV; + dVdsatCV2_dVb = (dVgsteff2_dVb - dDeltaPhi2_dVb - VdsatCV2 * dAbulkCV_dVb) / AbulkCV; + dVdsatCV2_dVe = (dVgsteff2_dVe - dDeltaPhi2_dVe - VdsatCV2 * dAbulkCV_dVe) / AbulkCV; + V4 = VdsatCV2 - Vds - DELTA_4; T02 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T02); @@ -7571,9 +8420,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T22 = DELTA_4 / T02; T3 = (1.0 - T12 - T22) / AbulkCV; T4 = T3 * ( 1.0 - dDeltaPhi2_dVg); - dVdseffCV2_dVg = T4; - dVdseffCV2_dVd = T12; - dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + /* LFW_FD fix/add next 4 lines */ + dVdseffCV2_dVg = (1.0 - T12 - T22) * dVdsatCV2_dVg; + dVdseffCV2_dVd = (1.0 - T12 - T22) * dVdsatCV2_dVd + T12; + dVdseffCV2_dVb = (1.0 - T12 - T22) * dVdsatCV2_dVb; + dVdseffCV2_dVe = (1.0 - T12 - T22) * dVdsatCV2_dVe; + /* 10 new lines Wagner */ if (selfheat) { dVdsatCV2_dT = (dVgsteff2_dT-dDeltaPhi2_dT)/AbulkCV @@ -7593,17 +8445,37 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = 1.0 - 12.0 * T3 * T3; T52 = AbulkCV * (6.0 * T02 * (4.0 * T12 - T02) / (T22 * T22) - 0.5); T6 = T52 * VdseffCV2 / AbulkCV; + /* LFW_FD add next 16 lines */ + dT02_dVg = dAbulkCV_dVg * VdseffCV2 + AbulkCV * dVdseffCV2_dVg; + dT02_dVd = dAbulkCV_dVd * VdseffCV2 + AbulkCV * dVdseffCV2_dVd; + dT02_dVb = dAbulkCV_dVb * VdseffCV2 + AbulkCV * dVdseffCV2_dVb; + dT02_dVe = dAbulkCV_dVe * VdseffCV2 + AbulkCV * dVdseffCV2_dVe; + + dT12_dVg = dVgsteff2_dVg - dDeltaPhi2_dVg; + dT12_dVd = dVgsteff2_dVd - dDeltaPhi2_dVd; + dT12_dVb = dVgsteff2_dVb - dDeltaPhi2_dVb; + dT12_dVe = dVgsteff2_dVe - dDeltaPhi2_dVe; + + dT22_dVg = 12.0 * (dT12_dVg - 0.5 * dT02_dVg); + dT22_dVd = 12.0 * (dT12_dVd - 0.5 * dT02_dVd); + dT22_dVb = 12.0 * (dT12_dVb - 0.5 * dT02_dVb); + dT22_dVe = 12.0 * (dT12_dVe - 0.5 * dT02_dVe); + + dT3_dVg = (dT02_dVg - T3 * dT22_dVg) / T22; + dT3_dVd = (dT02_dVd - T3 * dT22_dVd) / T22; + dT3_dVb = (dT02_dVb - T3 * dT22_dVb) / T22; + dT3_dVe = (dT02_dVe - T3 * dT22_dVe) / T22; + T7 = CoxWLcen2 * (T12 - T02 * (0.5 - T3)); qinv += T7; qgate = qinoi = qinv; QovCox2 = T7 / Coxeff2; - Cgg12 = CoxWLcen2 * (T4 * (1.0 - dDeltaPhi2_dVg) - + T52 * dVdseffCV2_dVg); - Cgd12 = CoxWLcen2 * T52 * dVdseffCV2_dVd + Cgg12 - * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; - Cgb12 = CoxWLcen2 * (T52 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) - + Cgg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Cgg12 = Cgg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + /* LFW_FD fix/add next 4 lines */ + Cgg12 = CoxWLcen2 * (dT12_dVg - dT02_dVg * (0.5 - T3) + T02 * dT3_dVg) + QovCox2 * dCoxeff2_dVg; + Cgd12 = CoxWLcen2 * (dT12_dVd - dT02_dVd * (0.5 - T3) + T02 * dT3_dVd) + QovCox2 * dCoxeff2_dVd; + Cgb12 = CoxWLcen2 * (dT12_dVb - dT02_dVb * (0.5 - T3) + T02 * dT3_dVb) + QovCox2 * dCoxeff2_dVb; + Cge12 = CoxWLcen2 * (dT12_dVe - dT02_dVe * (0.5 - T3) + T02 * dT3_dVe) + QovCox2 * dCoxeff2_dVe; + /* 11 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -7622,10 +8494,12 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { /* v3.1 */ - dqbulk_dT = 0; /* new line Wagner */ + /* LFW_FD 2 new lines - flexilint */ + Csg2 = Cbg12 = Cbd12 = Cbb12 = Cbe12 = 0; + dqbulk_dT = 0; if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ { - qbulk = Cbd1 = Cbb1 = Cbg1 = Cbg12 = Cbb12 = Cbd12 = 0; + qbulk = Cbg1 = Cbd1 = Cbb1 = Cbe1 = dqbulk_dT = 0; /* LFW_FD enhance line */ } else /* soiMod = 0 or 1 */ { @@ -7638,12 +8512,24 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { qbulk1 = qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); /* enhanced line Wagner */ QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* LFW_FD fix/add next 4 derivatives */ + Cbg1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVg + - CoxWLcenb * T7 * VdseffCV * ((dT0_dVg -T0 * dT2_dVg / T2) /T2) + - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVg + + QovCox * dCoxeff_dVg; + Cbb1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVb + - CoxWLcenb * T7 * VdseffCV * ((dT0_dVb -T0 * dT2_dVb / T2) /T2) + - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVb + + QovCox * dCoxeff_dVb; + Cbd1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVd + - CoxWLcenb * T7 * VdseffCV * ((dT0_dVd -T0 * dT2_dVd / T2) /T2) + - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVd + + QovCox * dCoxeff_dVd; + Cbe1 = CoxWLcenb * T7 * (0.5 - T0 / T2) * dVdseffCV_dVe + - CoxWLcenb * T7 * VdseffCV * ((dT0_dVe -T0 * dT2_dVe / T2) /T2) + - CoxWLcenb * VdseffCV * (0.5 - T0 / T2) * dAbulkCV_dVe + + QovCox * dCoxeff_dVe; + /* 12 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; @@ -7668,12 +8554,24 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { qbulk2 = CoxWLcenb2 * T7 * (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); QovCox2 = qbulk2 / Coxeff2; - Cbg12 = CoxWLcenb2 * (T10 + T11 * dVdseffCV2_dVg); - Cbd12 = CoxWLcenb2 * T11 * dVdseffCV2_dVd + Cbg12 - * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; - Cbb12 = CoxWLcenb2 * (T11 * dVdseffCV2_dVb + T12 * dAbulkCV_dVb) - + Cbg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Cbg12 = Cbg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + /* LFW_FD fix/add next 4 derivatives */ + Cbg12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVg + - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVg -T02 * dT22_dVg / T22) /T22) + - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVg + + QovCox2 * dCoxeff2_dVg; + Cbb12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVb + - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVb -T02 * dT22_dVb / T22) /T22) + - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVb + + QovCox2 * dCoxeff2_dVb; + Cbd12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVd + - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVd -T02 * dT22_dVd / T22) /T22) + - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVd + + QovCox2 * dCoxeff2_dVd; + Cbe12 = CoxWLcenb2 * T7 * (0.5 - T02 / T22) * dVdseffCV2_dVe + - CoxWLcenb2 * T7 * VdseffCV2 * ((dT02_dVe -T02 * dT22_dVe / T22) /T22) + - CoxWLcenb2 * VdseffCV2 * (0.5 - T02 / T22) * dAbulkCV_dVe + + QovCox2 * dCoxeff2_dVe; + /* 12 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -7697,7 +8595,7 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { } /* v3.1 */ - Csg2 = Csd2 = Csb2 = 0.0; /* CJB LFW */ + Csg2 = Csd2 = Csb2 = Cse2 = 0.0; /* LFW_FD enhance line */ dqsrc2_dT = 0; /* new line Wagner */ if (model->B4SOIxpart > 0.5) { /* 0/100 partition */ @@ -7722,12 +8620,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T5 = T7 * AbulkCV; T6 = T7 * VdseffCV; - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* LFW_FD fix/add next 4 derivatives */ + Csg = QovCox * dCoxeff_dVg + - CoxWLcen * (dT1_dVg / 2.0 + dT0_dVg / 4.0 + - 2.0 * T0 * dT0_dVg / T2 + 2.0 * T0 * T0 * dT2_dVg / (T2 * T2)); + Csd = QovCox * dCoxeff_dVd + - CoxWLcen * (dT1_dVd / 2.0 + dT0_dVd / 4.0 + - 2.0 * T0 * dT0_dVd / T2 + 2.0 * T0 * T0 * dT2_dVd / (T2 * T2)); + Csb = QovCox * dCoxeff_dVb + - CoxWLcen * (dT1_dVb / 2.0 + dT0_dVb / 4.0 + - 2.0 * T0 * dT0_dVb / T2 + 2.0 * T0 * T0 * dT2_dVb / (T2 * T2)); + Cse = QovCox * dCoxeff_dVe + - CoxWLcen * (dT1_dVe / 2.0 + dT0_dVe / 4.0 + - 2.0 * T0 * dT0_dVe / T2 + 2.0 * T0 * T0 * dT2_dVe / (T2 * T2)); + /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { @@ -7752,12 +8658,20 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T4 = -(0.5 + 24.0 * T02 * T02 / T3) * (1.0 - dDeltaPhi2_dVg); T5 = T7 * AbulkCV; T6 = T7 * VdseffCV2; - Csg2 = CoxWLcen2 * (T4 + T5 * dVdseffCV2_dVg); - Csd2 = CoxWLcen2 * T5 * dVdseffCV2_dVd + Csg2 * dVgsteff2_dVd - + QovCox2 * dCoxeff2_dVd; - Csb2 = CoxWLcen2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) - + Csg2 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + /* LFW_FD fix/add next 4 derivatives */ + Csg2 = QovCox2 * dCoxeff2_dVg + - CoxWLcen2 * (dT12_dVg / 2.0 + dT02_dVg / 4.0 + - 2.0 * T02 * dT02_dVg / T22 + 2.0 * T02 * T02 * dT22_dVg / (T22 * T22)); + Csd2 = QovCox2 * dCoxeff2_dVd + - CoxWLcen2 * (dT12_dVd / 2.0 + dT02_dVd / 4.0 + - 2.0 * T02 * dT02_dVd / T22 + 2.0 * T02 * T02 * dT22_dVd / (T22 * T22)); + Csb2 = QovCox2 * dCoxeff2_dVb + - CoxWLcen2 * (dT12_dVb / 2.0 + dT02_dVb / 4.0 + - 2.0 * T02 * dT02_dVb / T22 + 2.0 * T02 * T02 * dT22_dVb / (T22 * T22)); + Cse2 = QovCox2 * dCoxeff2_dVe + - CoxWLcen2 * (dT12_dVe / 2.0 + dT02_dVe / 4.0 + - 2.0 * T02 * dT02_dVe / T22 + 2.0 * T02 * T02 * dT22_dVe / (T22 * T22)); + qsrc += qsrc2; dqsrc_dT += dqsrc2_dT; /* new line Wagner */ } @@ -7778,12 +8692,48 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = AbulkCV * (qsrc / T2 + T3 * T8); T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* LFW_FD add next 32 lines */ + dT2_dVg = dT2_dVg / 12.0; + dT2_dVd = dT2_dVd / 12.0; + dT2_dVb = dT2_dVb / 12.0; + dT2_dVe = dT2_dVe / 12.0; + + dT3_dVg = T3 * dCoxeff_dVg / Coxeff + - 2.0 * T3 * T2 * dT2_dVg / (T2 * T2); + dT3_dVd = T3 * dCoxeff_dVd / Coxeff + - 2.0 * T3 * T2 * dT2_dVd / (T2 * T2); + dT3_dVb = T3 * dCoxeff_dVb / Coxeff + - 2.0 * T3 * T2 * dT2_dVb / (T2 * T2); + dT3_dVe = T3 * dCoxeff_dVe / Coxeff + - 2.0 * T3 * T2 * dT2_dVe / (T2 * T2); + + dT4_dVg = dT1_dVg * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) + + T1 * (4.0 * T0 * dT0_dVg / 3.0 + + dT1_dVg * (T1 - 4.0 * T0 / 3.0) + + T1 * (dT1_dVg - 4.0 * dT0_dVg /3.0)) + - 2.0 * T0 * T0 * dT0_dVg / 5.0; + dT4_dVd = dT1_dVd * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) + + T1 * (4.0 * T0 * dT0_dVd / 3.0 + + dT1_dVd * (T1 - 4.0 * T0 / 3.0) + + T1 * (dT1_dVd - 4.0 * dT0_dVd /3.0)) + - 2.0 * T0 * T0 * dT0_dVd / 5.0; + dT4_dVb = dT1_dVb * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) + + T1 * (4.0 * T0 * dT0_dVb / 3.0 + + dT1_dVb * (T1 - 4.0 * T0 / 3.0) + + T1 * (dT1_dVb - 4.0 * dT0_dVb /3.0)) + - 2.0 * T0 * T0 * dT0_dVb / 5.0; + dT4_dVe = dT1_dVe * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) + + T1 * (4.0 * T0 * dT0_dVe / 3.0 + + dT1_dVe * (T1 - 4.0 * T0 / 3.0) + + T1 * (dT1_dVe - 4.0 * dT0_dVe /3.0)) + - 2.0 * T0 * T0 * dT0_dVe / 5.0; + + /* LFW_FD fix/add next 4 derivatives */ + Csg = -(dT3_dVg * T4 + T3 * dT4_dVg); + Csd = -(dT3_dVd * T4 + T3 * dT4_dVd); + Csb = -(dT3_dVb * T4 + T3 * dT4_dVb); + Cse = -(dT3_dVe * T4 + T3 * dT4_dVe); + /* 13 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV_dT + dAbulkCV_dT * VdseffCV; @@ -7815,12 +8765,47 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { T6 = AbulkCV * (qsrc2 / T22 + T3 * T8); T7 = T6 * VdseffCV2 / AbulkCV; - Csg2 = T5 * (1.0 - dDeltaPhi2_dVg) + T6 * dVdseffCV2_dVg; - Csd2 = Csg2 * dVgsteff2_dVd + T6 * dVdseffCV2_dVd - + QovCox2 * dCoxeff2_dVd; - Csb2 = Csg2 * dVgsteff2_dVb + T6 * dVdseffCV2_dVb - + T7 * dAbulkCV_dVb + QovCox2 * dCoxeff2_dVb; - Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + /* LFW_FD add next 32 lines */ + dT22_dVg = dT22_dVg / 12.0; + dT22_dVd = dT22_dVd / 12.0; + dT22_dVb = dT22_dVb / 12.0; + dT22_dVe = dT22_dVe / 12.0; + + dT3_dVg = T3 * dCoxeff2_dVg / Coxeff2 + - 2.0 * T3 * T22 * dT22_dVg / (T22 * T22); + dT3_dVd = T3 * dCoxeff2_dVd / Coxeff2 + - 2.0 * T3 * T22 * dT22_dVd / (T22 * T22); + dT3_dVb = T3 * dCoxeff2_dVb / Coxeff2 + - 2.0 * T3 * T22 * dT22_dVb / (T22 * T22); + dT3_dVe = T3 * dCoxeff2_dVe / Coxeff2 + - 2.0 * T3 * T22 * dT22_dVe / (T22 * T22); + + dT4_dVg = dT12_dVg * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) + + T12 * (4.0 * T02 * dT02_dVg / 3.0 + + dT12_dVg * (T12 - 4.0 * T02 / 3.0) + + T12 * (dT12_dVg - 4.0 * dT02_dVg /3.0)) + - 2.0 * T02 * T02 * dT02_dVg / 5.0; + dT4_dVd = dT12_dVd * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) + + T12 * (4.0 * T02 * dT02_dVd / 3.0 + + dT12_dVd * (T12 - 4.0 * T02 / 3.0) + + T12 * (dT12_dVd - 4.0 * dT02_dVd /3.0)) + - 2.0 * T02 * T02 * dT02_dVd / 5.0; + dT4_dVb = dT12_dVb * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) + + T12 * (4.0 * T02 * dT02_dVb / 3.0 + + dT12_dVb * (T12 - 4.0 * T02 / 3.0) + + T12 * (dT12_dVb - 4.0 * dT02_dVb /3.0)) + - 2.0 * T02 * T02 * dT02_dVb / 5.0; + dT4_dVe = dT12_dVe * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 * T02 / 3.0)) + + T12 * (4.0 * T02 * dT02_dVe / 3.0 + + dT12_dVe * (T12 - 4.0 * T02 / 3.0) + + T12 * (dT12_dVe - 4.0 * dT02_dVe /3.0)) + - 2.0 * T02 * T02 * dT02_dVe / 5.0; + /* LFW_FD fix/add next 4 derivatives */ + Csg2 = -(dT3_dVg * T4 + T3 * dT4_dVg); + Csd2 = -(dT3_dVd * T4 + T3 * dT4_dVd); + Csb2 = -(dT3_dVb * T4 + T3 * dT4_dVb); + Cse2 = -(dT3_dVe * T4 + T3 * dT4_dVe); + /* 14 new lines Wagner */ if (selfheat) { dTL1_dT = AbulkCV * dVdseffCV2_dT + dAbulkCV_dT * VdseffCV2; @@ -7847,14 +8832,15 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { Csg = -0.5 * Cgg1; Csd = -0.5 * Cgd1; Csb = -0.5 * Cgb1; + Cse = -0.5 * Cge1; /* LFW_FD new line */ /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + /* LFW_FD fix/add next 4 lines */ Csg2 = -0.5 * Cgg12; - Csd -= 0.5 * Cgd12; - Csb -= 0.5 * Cgb12; - Csd2 = 0.0; /* CJB LFW */ - Csb2 = 0.0; /* CJB LFW */ + Csd2 = -0.5 * Cgd12; + Csb2 = -0.5 * Cgb12; + Cse2 = -0.5 * Cge12; } dqsrc_dT = -0.5 * dqgate_dT; /* new line Wagner */ /* end v4.1 */ @@ -7898,70 +8884,59 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { CdT = dqdrn_dT; Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; - /* comment out next 4 lines Wagner */ - /*if (selfheat) - CbT = Cbg1 * dVgsteff_dT - dQac0_dT - - dQsub0_dT - dQe1_dT; - else CbT = 0.0;*/ + /* LFW_FD fix/add next 3 lines */ + Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b; + Cbe = Cbe1 - dQac0_dVe - dQsub0_dVe - Ce1e; Cgg = Cgg1 - Cbg; Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; + /* LFW_FD fix/add next 2 lines */ + Cgb = Cgb1 - Cbb - Ce1b; + Cge = Cge1 - Cbe - Ce1e; /* comment out next 4 lines Wagner */ /*if (selfheat) CgT = Cgg1 * dVgsteff_dT + dQac0_dT + dQsub0_dT; else CgT = 0.0;*/ - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + /*Cgb *= dVbseff_dVb; */ + /*Cbb *= dVbseff_dVb; */ + /*Csb *= dVbseff_dVb; */ /* comment out next 2 lines Wagner */ /*if (selfheat) CsT = Csg * dVgsteff_dT; else CsT = 0.0;*/ /* v4.1 */ if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + /* LFW_FD fix next 12 lines */ Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; - Cbd += Cbd12 - dQsub02_dVd; - Cbb += (Cbb12 - dQac02_dVb - dQsub02_dVb)*dVbseff_dVb; - /* comment out next 4 lines Wagner */ - /*if (selfheat) - CbT += Cbg12 * dVgsteff2_dT - dQac02_dT - - dQsub02_dT; - else CbT = 0.0;*/ + Cbd += Cbd12 - dQac02_dVd - dQsub02_dVd; + Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; + Cbe += Cbe12 - dQac02_dVe - dQsub02_dVe; + Cgg = Cgg1 + Cgg12 - Cbg; Cgd = Cgd1 + Cgd12 - Cbd; - Cgb = Cgb1 + Cgb12 - Cbb - Ce1b / dVbseff_dVb; - /* comment out next 4 lines Wagner */ - /*if (selfheat) - CgT += Cgg12 * dVgsteff2_dT + dQac02_dT - + dQsub02_dT; - else CgT = 0.0; */ + Cgb = Cgb1 + Cgb12 - Cbb - Ce1b; + Cge = Cge1 + Cge12 - Cbe - Ce1e; - Cgb *= dVbseff_dVb; - /* Cbb *= dVbseff_dVb; */ - /* comment out next 2 lines Wagner */ - /*if (selfheat) CsT += Csg2 * dVgsteff2_dT; - else CsT = 0.0;*/ Csg += Csg2; - Csd += Csd2; /* CJB LFW */ - Csb += Csb2; /* CJB LFW */ + Csd += Csd2; + Csb += Csb2; + Cse += Cse2; } /* end v4.1 */ here->B4SOIcggb = Cgg; - here->B4SOIcgsb = -(Cgg + Cgd + Cgb); + here->B4SOIcgsb = -(Cgg + Cgd + Cgb + Cge); /* LFW_FD fix line */ here->B4SOIcgdb = Cgd; + here->B4SOIcgeb = Cge; /* LFW_FD fix line */ here->B4SOIcgT = CgT; here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; + here->B4SOIcbsb = -(Cbg + Cbd + Cbb + Cbe); /* LFW_FD fix line */ here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = -Ce1e; + here->B4SOIcbeb = Cbe; /* LFW_FD fix line */ here->B4SOIcbT = CbT; here->B4SOIceT = Ce1T; @@ -7969,10 +8944,11 @@ int B4SOILoadOMP(B4SOIinstance *here, CKTcircuit *ckt) { here->B4SOIcdgb = -(Cgg + Cbg + Csg); here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = 0; + here->B4SOIcdeb = -(Cge + Cse + Cbe) - Ce1e; /* LFW_FD fix line */ here->B4SOIcdT = -(CgT+CbT+CsT) - Ce1T; - here->B4SOIcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; + here->B4SOIcdsb = Cgg + Cgd + Cgb + Cge /* LFW_FD fix expression */ + + Cbg + Cbd + Cbb + Cbe + Ce1e + + Csg + Csd + Csb + Cse + Ce1b; here->B4SOIqinv = -qinoi; } /* End of if capMod ==3 */ @@ -7999,6 +8975,11 @@ finished: /* returning Values to Calling Routine */ /* * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE */ + + /* flexilint inits */ + gcjdbs = gcjdT = 0.0; + gcjsbs = gcjsT = 0.0; + if (ChargeComputationNeeded) { /* Intrinsic S/D junction charge */ @@ -8039,22 +9020,28 @@ finished: /* returning Values to Calling Routine */ arg = 1.0 - (vbs > DioMax ? DioMax : vbs) / PhiBSWG; /* Bug fix #6 */ if (selfheat) darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + else + darg_dT = 1.0; /* flexilint */ if (MJSWG == 0.5) { dT3_dVb = 1.0 / sqrt(arg); if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + else ddT3_dVb_dT = 1.0; /* flexilint */ } else { dT3_dVb = exp(-MJSWG * log(arg)); if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + else ddT3_dVb_dT = 1.0; /* flexilint */ } T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); if (selfheat) dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + else + dT3_dT = 1.0; /* flexilint */ /* if (vbs > DioMax) T3 += dT3_dVb * (vbs - DioMax); */ /* Bug fix #6 Vbs evaluated taking consideration of Rbody Mode*/ @@ -8107,22 +9094,28 @@ finished: /* returning Values to Calling Routine */ if (selfheat) darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + else + darg_dT = 1.0; /* flexilint */ if (MJSWG == 0.5) { dT3_dVb = 1.0 / sqrt(arg); if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + else ddT3_dVb_dT = 1.0; /* flexilint */ } else { dT3_dVb = exp(-MJSWG * log(arg)); if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + else ddT3_dVb_dT = 1.0; /* flexilint */ } T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); if (selfheat) dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + else + dT3_dT = 1.0; /* flexilint */ /* if (vbd > DioMax) T3 += dT3_dVb * (vbd - DioMax); */ /* Bug fix #6 Vbd evaluated taking consideration of Rbody Mode*/ @@ -8404,9 +9397,8 @@ finished: /* returning Values to Calling Routine */ if (!ChargeComputationNeeded) goto line850; -#ifndef NOBYPASS + line755: -#endif ag0 = ckt->CKTag[0]; T0 = vgd + DELTA_1; @@ -8478,7 +9470,7 @@ line755: gcggb = here->B4SOIcggb * ag0; gcgdb = here->B4SOIcgdb * ag0; gcgsb = here->B4SOIcgsb * ag0; - gcgeb = 0 ;/*v3.1 changed*/ + gcgeb = here->B4SOIcgeb * ag0; /* fix line */ gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); gcdgb = here->B4SOIcdgb * ag0; @@ -8506,7 +9498,7 @@ line755: + pParam->B4SOIcgeo) * ag0; gcgdb = (here->B4SOIcgdb - cgdo) * ag0; gcgsb = (here->B4SOIcgsb - cgso) * ag0; - gcgeb = (-pParam->B4SOIcgeo) *ag0; + gcgeb = (here->B4SOIcgeb - pParam->B4SOIcgeo) *ag0; /* LFW_FD fix line */ gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); gcegb = (- pParam->B4SOIcgeo) * ag0; @@ -8542,7 +9534,7 @@ line755: gcssb = (cgso + here->B4SOIgcse - (here->B4SOIcgsb + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; gcseb = -(here->B4SOIgcse + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIceeb) * ag0; + + here->B4SOIcdeb + here->B4SOIcgeb + here->B4SOIceeb) * ag0; /* LFW_FD fix line */ /*fix below expression Wagner */ /*gcsT = - model->B4SOItype * (here->B4SOIcgT */ gcsT = - (here->B4SOIcgT @@ -8634,7 +9626,7 @@ line755: gcggb = here->B4SOIcggb * ag0; gcgsb = here->B4SOIcgdb * ag0; gcgdb = here->B4SOIcgsb * ag0; - gcgeb = 0; /* v3.1 */ + gcgeb = here->B4SOIcgeb * ag0; /* LFW_FD fix line */ gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 added gcgeb */ gcsgb = here->B4SOIcdgb * ag0; @@ -8661,10 +9653,10 @@ line755: gcggb = (here->B4SOIcggb + cgdo + cgso + pParam->B4SOIcgeo) * ag0; gcgdb = (here->B4SOIcgsb - cgdo) * ag0; gcgsb = (here->B4SOIcgdb - cgso) * ag0; - gcgeb = (- pParam->B4SOIcgeo) * ag0; + gcgeb = (here->B4SOIcgeb - pParam->B4SOIcgeo) * ag0; /* LFW_FD fix line */ gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*added gcgbb*/ - gcegb = gcgeb; /* v3.1 added */ + gcegb = (- pParam->B4SOIcgeo) * ag0; /* LFW_FD fix line */ gcsgb = (here->B4SOIcdgb - cgso) * ag0; gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb + here->B4SOIcdgb + cgdo) * ag0; gcbgb = here->B4SOIcbgb * ag0; @@ -8696,7 +9688,7 @@ line755: gcddb = (cgdo + here->B4SOIgcde - (here->B4SOIcgsb + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; gcdeb = -(here->B4SOIgcde + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIceeb) * ag0; + + here->B4SOIcdeb + here->B4SOIcgeb + here->B4SOIceeb) * ag0; /* LFW_FD fix line */ /*fix below expression Wagner */ /*gcdT = - model->B4SOItype * (here->B4SOIcgT */ gcdT = - (here->B4SOIcgT @@ -8767,7 +9759,7 @@ line755: /* Lump the overlap capacitance */ /* qgd = qgdo; - gs = qgso; + qgs = qgso; qge = pParam->B4SOIcgeo * vge; qgate += qgd + qgs + qge; qsrc = qdrn - qgs + here->B4SOIqse; @@ -9309,71 +10301,9 @@ line900: m = here->B4SOIm; -#ifdef USE_OMP4SOI - /* v3.1 */ - - /* v3.1 added ceqgcrg for RF */ - - /* OpenMP parallelization: - Temporary storage of right hand side values into instance storage space. - Update to matrix will be done by function B4SOILoadRhsMat() only when all - instances have their values stored. */ - - here->B4SOINode_1 = m * ((ceqgate + ceqqg) - + Igtoteq - ceqgcrg); - /* v3.1 added ceqgcrg for RF end */ - - here->B4SOINode_2 = m * ((ceqbd - cdreq - - ceqqd) + Idtoteq - /* v4.0 */ + ceqgdtot); - if (!here->B4SOIrbodyMod) { - here->B4SOINode_3 = m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid - ceqgstot); /* v4.0 */ - } - else { /* v4.0 */ - here->B4SOINode_4 = m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid + ceqqjd + ceqqjs - ceqgstot); - } - - here->B4SOINode_5 = m * ceqqe; - - if (here->B4SOIrgateMod == 2) - here->B4SOINode_6 = m * ceqgcrg; - else if (here->B4SOIrgateMod == 3) - here->B4SOINode_7 = m * (ceqqgmid - + ceqgcrg); - - if (here->B4SOIbodyMod == 1) { - here->B4SOINode_8 = m * ceqbodcon; - } - - if ( here->B4SOIsoiMod != 2 ) - {if (!here->B4SOIrbodyMod) - here->B4SOINode_9 = m * (ceqbody + ceqqb); - else /* v4.0 */ { - here->B4SOINode_10 = m * (cdbdp + ceqqjd); - here->B4SOINode_11 = m * (ceqbody + ceqqb); - here->B4SOINode_12 = m * (csbsp + ceqqjs); - } - } - here->B4SOINode_sh = selfheat; - - if (selfheat) { - here->B4SOINode_13 = m * (ceqth + ceqqth); - } - - if (model->B4SOIrdsMod) - { here->B4SOINode_14 = m * ceqgdtot; - here->B4SOINode_15 = m * ceqgstot; - } -#else - - - /* v3.1 */ +#ifndef USE_OMP4SOI /* v3.1 added ceqgcrg for RF */ (*(ckt->CKTrhs + here->B4SOIgNode) -= m * ((ceqgate + ceqqg) + Igtoteq - ceqgcrg)); @@ -9424,6 +10354,64 @@ line900: (*(ckt->CKTrhs + here->B4SOIsNode) += m * ceqgstot); } +#else + /* OpenMP parallelization: + Temporary storage of right hand side values into instance storage space. + Update to matrix will be done by function B4SOILoadRhsMat() only when all + instances have their values stored. */ + + /* v3.1 added ceqgcrg for RF */ + here->B4SOINode_1 = m * ((ceqgate + ceqqg) + + Igtoteq - ceqgcrg); + /* v3.1 added ceqgcrg for RF end */ + + here->B4SOINode_2 = m * ((ceqbd - cdreq + - ceqqd) + Idtoteq + /* v4.0 */ + ceqgdtot); + if (!here->B4SOIrbodyMod) { + here->B4SOINode_3 = m * ((cdreq + ceqbs + + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq + + ceqqgmid - ceqgstot); /* v4.0 */ + } + else { /* v4.0 */ + here->B4SOINode_4 = m * ((cdreq + ceqbs + + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq + + ceqqgmid + ceqqjd + ceqqjs - ceqgstot); + } + + here->B4SOINode_5 = m * ceqqe; + + if (here->B4SOIrgateMod == 2) + here->B4SOINode_6 = m * ceqgcrg; + else if (here->B4SOIrgateMod == 3) + here->B4SOINode_7 = m * (ceqqgmid + + ceqgcrg); + + if (here->B4SOIbodyMod == 1) { + here->B4SOINode_8 = m * ceqbodcon; + } + + if ( here->B4SOIsoiMod != 2 ) + {if (!here->B4SOIrbodyMod) + here->B4SOINode_9 = m * (ceqbody + ceqqb); + else /* v4.0 */ { + here->B4SOINode_10 = m * (cdbdp + ceqqjd); + here->B4SOINode_11 = m * (ceqbody + ceqqb); + here->B4SOINode_12 = m * (csbsp + ceqqjs); + } + } + here->B4SOINode_sh = selfheat; + + if (selfheat) { + here->B4SOINode_13 = m * (ceqth + ceqqth); + } + + if (model->B4SOIrdsMod) + { here->B4SOINode_14 = m * ceqgdtot; + here->B4SOINode_15 = m * ceqgstot; + } + +#endif if (here->B4SOIdebugMod != 0) { *(ckt->CKTrhs + here->B4SOIvbsNode) = here->B4SOIvbseff; @@ -9448,8 +10436,6 @@ line900: } -#endif - if (!model->B4SOIrdsMod) { gdpr = here->B4SOIdrainConductance; gspr = here->B4SOIsourceConductance; @@ -9465,7 +10451,238 @@ line900: /* v3.1 added for RF */ geltd = here->B4SOIgrgeltd; -#ifdef USE_OMP4SOI +#ifndef USE_OMP4SOI + if (here->B4SOIrgateMod == 1) + { + *(here->B4SOIGEgePtr) += m * geltd; + *(here->B4SOIGgePtr) -= m * geltd; + *(here->B4SOIGEgPtr) -= m * geltd; + } + else if (here->B4SOIrgateMod == 2) + { + *(here->B4SOIGEgePtr) += m * gcrg; + *(here->B4SOIGEgPtr) += m * gcrgg; + *(here->B4SOIGEdpPtr) += m * gcrgd; + *(here->B4SOIGEspPtr) += m * gcrgs; + *(here->B4SOIGgePtr) -= m * gcrg; + if (here->B4SOIsoiMod !=2) /* v3.2 */ + *(here->B4SOIGEbPtr) += m * gcrgb; + } + else if (here->B4SOIrgateMod == 3) + { + *(here->B4SOIGEgePtr) += m * geltd; + *(here->B4SOIGEgmPtr) -= m * geltd; + *(here->B4SOIGMgePtr) -= m * geltd; + *(here->B4SOIGMgmPtr) += m * (geltd + gcrg + gcgmgmb); + + *(here->B4SOIGMdpPtr) += m * (gcrgd + gcgmdb); + *(here->B4SOIGMgPtr) += m * gcrgg; + *(here->B4SOIGMspPtr) += m * (gcrgs + gcgmsb); + *(here->B4SOIGMePtr) += m * gcgmeb; + if (here->B4SOIsoiMod !=2) /* v3.2 */ + *(here->B4SOIGMbPtr) += m * gcrgb; + + *(here->B4SOIDPgmPtr) += m * gcdgmb; + *(here->B4SOIGgmPtr) -= m * gcrg; + *(here->B4SOISPgmPtr) += m * gcsgmb; + *(here->B4SOIEgmPtr) += m * gcegmb; + } + /* v3.1 added for RF end*/ + + + /* v3.0 */ + if (here->B4SOIsoiMod != 0) /* v3.2 */ + { + (*(here->B4SOIDPePtr) += m * (Gme + gddpe)); + (*(here->B4SOISPePtr) += m * (gsspe - Gme)); + + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + *(here->B4SOIGePtr) += m * gige; + *(here->B4SOIBePtr) -= m * gige; + } + } + + *(here->B4SOIEdpPtr) += m * gcedb; + *(here->B4SOIEspPtr) += m * gcesb; + *(here->B4SOIDPePtr) += m * gcdeb; + *(here->B4SOISPePtr) += m * gcseb; + *(here->B4SOIEgPtr) += m * gcegb; + *(here->B4SOIGePtr) += m * gcgeb; + + /* v3.1 */ + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + (*(here->B4SOIEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb + gcegmb)); /* 3.2 bug fix */ + + /* v3.1 changed GbPtr for RF */ + if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) + (*(here->B4SOIGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb + + gcgeb - gIgtotb)); + else /* v3.1 for rgateMod = 2 or 3 */ + *(here->B4SOIGbPtr) += m * (gigb + gcgbb +gIgtotb - gcrgb); + + + (*(here->B4SOIDPbPtr) -= m * (-gddpb - Gmbs - gcdbb + gdtotb + + gIdtotb )); /* v4.0 */ + + /* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb + + gcdeb + gcdsb) + gcdgmb + + gIdtotb ); + */ + + (*(here->B4SOISPbPtr) -= m * (-gsspb + Gmbs - gcsbb + gstotb + + Gmin + gIstotb)); /* v4.0 */ + + /* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb + + gcseb + gcssb) + gcsgmb + + Gmin + gIstotb); + */ + (*(here->B4SOIBePtr) += m * (gbbe + gcbeb)); /* v3.0 */ + (*(here->B4SOIBgPtr) += m * (-gigg + gcbgb + gbbg)); + (*(here->B4SOIBdpPtr) += m * (-gigd + gcbdb + gbbdp )); + + (*(here->B4SOIBspPtr) += m * (gcbsb + gbbsp - Gmin + - gigs)); + /* if (!here->B4SOIrbodyMod) + */ + (*(here->B4SOIBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb + - gcbsb - gcbeb + Gmin)) ; + /* else + (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb + - gcbdb - gcbsb - gcbeb + Gmin) ; + */ + /* v4.0 */ + if (here->B4SOIrbodyMod) { + (*(here->B4SOIDPdbPtr) += m * (-gcjdbdp - GGjdb)); + (*(here->B4SOISPsbPtr) += m * (-gcjsbsp - GGjsb)); + (*(here->B4SOIDBdpPtr) += m * (-gcjdbdp - GGjdb)); + (*(here->B4SOIDBdbPtr) += m * (gcjdbdp + GGjdb + + here->B4SOIgrbdb)); + (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); + (*(here->B4SOISBspPtr) += m * (-gcjsbsp - GGjsb)); + (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); + (*(here->B4SOISBsbPtr) += m * (gcjsbsp + GGjsb + + here->B4SOIgrbsb)); + (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); + (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); + (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb + + here->B4SOIgrbdb)); + } + if (model->B4SOIrdsMod) + { + (*(here->B4SOIDbPtr) += m * gdtotb); + (*(here->B4SOISbPtr) += m * gstotb); + } + + } + /* v3.1 */ + if (model->B4SOIrdsMod) + { (*(here->B4SOIDgPtr) += m * gdtotg); + (*(here->B4SOIDspPtr) += m * gdtots); + (*(here->B4SOISdpPtr) += m * gstotd); + (*(here->B4SOISgPtr) += m * gstotg); + } + + (*(here->B4SOIEePtr) += m * gceeb); + + if (here->B4SOIrgateMod == 0) + { + (*(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg)); + (*(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd)); + (*(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots)); + } + else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ + { + *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg + geltd); + *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd); + *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots); + } + else /* v3.1 for RF rgateMod == 2 or 3 */ + { + *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg - gcrgg); + *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd - gcrgd); + *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots - gcrgs); + } + + + (*(here->B4SOIDPgPtr) += m * ((Gm + gcdgb) + gddpg - Gmin + - gIdtotg - gdtotg)); /* v4.0 */ + (*(here->B4SOIDPdpPtr) += m * ((gdpr + here->B4SOIgds + gddpdp + + RevSum + gcddb) + Gmin + - gIdtotd - gdtotd)); /* v4.0 */ + (*(here->B4SOIDPspPtr) -= m * ((-gddpsp + here->B4SOIgds + FwdSum + - gcdsb) + gIdtots + gdtots)); + + (*(here->B4SOIDPdPtr) -= m * (gdpr + gdtot)); + + (*(here->B4SOISPgPtr) += m * (gcsgb - Gm + gsspg - gIstotg + - gstotg)); /* v4.0 */ + (*(here->B4SOISPdpPtr) -= m * ((here->B4SOIgds - gsspdp + RevSum + - gcsdb + gIstotd) + gstotd)); /* v4.0 */ + + (*(here->B4SOISPspPtr) += m * ((gspr - gstots + + here->B4SOIgds + gsspsp + + FwdSum + gcssb) + + Gmin - gIstots)); /* v4.0 */ + + (*(here->B4SOISPsPtr) -= m * (gspr + gstot)); + + + (*(here->B4SOIDdPtr) += m * (gdpr + gdtot)); + (*(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd)); + + + (*(here->B4SOISsPtr) += m * (gspr + gstot)); + (*(here->B4SOISspPtr) -= m * (gspr - gstots)); + + + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIBpPtr) -= m * gppp); + (*(here->B4SOIPbPtr) += m * gppb); + (*(here->B4SOIPpPtr) += m * gppp); + } + + /* v4.1 Ig_agbcp2 stamping */ + (*(here->B4SOIGgPtr) += m * gigpg); + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIPpPtr) -= m * gigpp); + (*(here->B4SOIPgPtr) -= m * gigpg); + (*(here->B4SOIGpPtr) += m * gigpp); + } + else if(here->B4SOIbodyMod == 2) + { + (*(here->B4SOIBbPtr) -= m * gigpp); + (*(here->B4SOIBgPtr) -= m * gigpg); + (*(here->B4SOIGbPtr) += m * gigpp); + } + + + if (selfheat) + { + (*(here->B4SOIDPtempPtr) += m * (GmT + gddpT + gcdT)); + (*(here->B4SOISPtempPtr) += m * (-GmT + gsspT + gcsT)); + (*(here->B4SOIBtempPtr) += m * (gbbT + gcbT - gigT)); + (*(here->B4SOIEtempPtr) += m * gceT); + (*(here->B4SOIGtempPtr) += m * (gcgT + gigT)); + (*(here->B4SOITemptempPtr) += m * (gTtt + 1/pParam->B4SOIrth + gcTt)); + (*(here->B4SOITempgPtr) += m * gTtg); + (*(here->B4SOITempbPtr) += m * gTtb); + (*(here->B4SOITempdpPtr) += m * gTtdp); + (*(here->B4SOITempspPtr) += m * gTtsp); + + /* v3.0 */ + if (here->B4SOIsoiMod != 0) /* v3.2 */ + (*(here->B4SOITempePtr) += m * gTte); + + } +#else /* OpenMP parallelization: Temporary storage of matrix values into instance storage space. Update to matrix will be done by function B4SOILoadRhsMat() only when all @@ -9701,239 +10918,7 @@ line900: (here->B4SOI_102 = m * gTte); } -#else - - if (here->B4SOIrgateMod == 1) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGgePtr) -= m * geltd; - *(here->B4SOIGEgPtr) -= m * geltd; - } - else if (here->B4SOIrgateMod == 2) - { - *(here->B4SOIGEgePtr) += m * gcrg; - *(here->B4SOIGEgPtr) += m * gcrgg; - *(here->B4SOIGEdpPtr) += m * gcrgd; - *(here->B4SOIGEspPtr) += m * gcrgs; - *(here->B4SOIGgePtr) -= m * gcrg; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGEbPtr) += m * gcrgb; - } - else if (here->B4SOIrgateMod == 3) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGEgmPtr) -= m * geltd; - *(here->B4SOIGMgePtr) -= m * geltd; - *(here->B4SOIGMgmPtr) += m * (geltd + gcrg + gcgmgmb); - - *(here->B4SOIGMdpPtr) += m * (gcrgd + gcgmdb); - *(here->B4SOIGMgPtr) += m * gcrgg; - *(here->B4SOIGMspPtr) += m * (gcrgs + gcgmsb); - *(here->B4SOIGMePtr) += m * gcgmeb; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGMbPtr) += m * gcrgb; - - *(here->B4SOIDPgmPtr) += m * gcdgmb; - *(here->B4SOIGgmPtr) -= m * gcrg; - *(here->B4SOISPgmPtr) += m * gcsgmb; - *(here->B4SOIEgmPtr) += m * gcegmb; - } - /* v3.1 added for RF end*/ - - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - (*(here->B4SOIDPePtr) += m * (Gme + gddpe)); - (*(here->B4SOISPePtr) += m * (gsspe - Gme)); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIGePtr) += m * gige; - *(here->B4SOIBePtr) -= m * gige; - } - } - - *(here->B4SOIEdpPtr) += m * gcedb; - *(here->B4SOIEspPtr) += m * gcesb; - *(here->B4SOIDPePtr) += m * gcdeb; - *(here->B4SOISPePtr) += m * gcseb; - *(here->B4SOIEgPtr) += m * gcegb; - *(here->B4SOIGePtr) += m * gcgeb; - - /* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - (*(here->B4SOIEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb + gcegmb)); /* 3.2 bug fix */ - - /* v3.1 changed GbPtr for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) - (*(here->B4SOIGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb - + gcgeb - gIgtotb)); - else /* v3.1 for rgateMod = 2 or 3 */ - *(here->B4SOIGbPtr) += m * (gigb + gcgbb +gIgtotb - gcrgb); - - - (*(here->B4SOIDPbPtr) -= m * (-gddpb - Gmbs - gcdbb + gdtotb - + gIdtotb )); /* v4.0 */ - - /* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb - + gcdeb + gcdsb) + gcdgmb - + gIdtotb ); - */ - - (*(here->B4SOISPbPtr) -= m * (-gsspb + Gmbs - gcsbb + gstotb - + Gmin + gIstotb)); /* v4.0 */ - - /* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb - + gcseb + gcssb) + gcsgmb - + Gmin + gIstotb); - */ - (*(here->B4SOIBePtr) += m * (gbbe + gcbeb)); /* v3.0 */ - (*(here->B4SOIBgPtr) += m * (-gigg + gcbgb + gbbg)); - (*(here->B4SOIBdpPtr) += m * (-gigd + gcbdb + gbbdp)); - - (*(here->B4SOIBspPtr) += m * (gcbsb + gbbsp - Gmin - - gigs)); - /* if (!here->B4SOIrbodyMod) - */ - (*(here->B4SOIBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb - - gcbsb - gcbeb + Gmin)); - /* else - (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb - - gcbdb - gcbsb - gcbeb + Gmin) ; - */ - /* v4.0 */ - if (here->B4SOIrbodyMod) { - (*(here->B4SOIDPdbPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOISPsbPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOIDBdpPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOIDBdbPtr) += m * (gcjdbdp + GGjdb - + here->B4SOIgrbdb)); - (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOISBspPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOISBsbPtr) += m * (gcjsbsp + GGjsb - + here->B4SOIgrbsb)); - (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb - + here->B4SOIgrbdb)); - } - if (model->B4SOIrdsMod) - { - (*(here->B4SOIDbPtr) += m * gdtotb); - (*(here->B4SOISbPtr) += m * gstotb); - } - - } - /* v3.1 */ - if (model->B4SOIrdsMod) - { (*(here->B4SOIDgPtr) += m * gdtotg); - (*(here->B4SOIDspPtr) += m * gdtots); - (*(here->B4SOISdpPtr) += m * gstotd); - (*(here->B4SOISgPtr) += m * gstotg); - } - - (*(here->B4SOIEePtr) += m * gceeb); - - if (here->B4SOIrgateMod == 0) - { - (*(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg)); - (*(here->B4SOIGdpPtr) +=m * ( gigd + gcgdb - Gmin - + gIgtotd)); - (*(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots)); - } - else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg + geltd); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots); - } - else /* v3.1 for RF rgateMod == 2 or 3 */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg - gcrgg); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd - gcrgd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots - gcrgs); - } - - - (*(here->B4SOIDPgPtr) += m * ((Gm + gcdgb) + gddpg - Gmin - - gIdtotg - gdtotg)); /* v4.0 */ - (*(here->B4SOIDPdpPtr) += m * ((gdpr + here->B4SOIgds + gddpdp - + RevSum + gcddb) + Gmin - - gIdtotd - gdtotd)); /* v4.0 */ - (*(here->B4SOIDPspPtr) -= m * ((-gddpsp + here->B4SOIgds + FwdSum - - gcdsb) + gIdtots + gdtots)); - - (*(here->B4SOIDPdPtr) -= m * (gdpr + gdtot)); - - (*(here->B4SOISPgPtr) += m * (gcsgb - Gm + gsspg - gIstotg - - gstotg)); /* v4.0 */ - (*(here->B4SOISPdpPtr) -= m * ((here->B4SOIgds - gsspdp + RevSum - - gcsdb + gIstotd) + gstotd)); /* v4.0 */ - - (*(here->B4SOISPspPtr) += m * ((gspr - gstots - + here->B4SOIgds + gsspsp - + FwdSum + gcssb) - + Gmin - gIstots)); /* v4.0 */ - - (*(here->B4SOISPsPtr) -= m * (gspr + gstot)); - - - (*(here->B4SOIDdPtr) += m * (gdpr + gdtot)); - (*(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd)); - - - (*(here->B4SOISsPtr) += m * (gspr + gstot)); - (*(here->B4SOISspPtr) -= m * (gspr - gstots)); - - - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIBpPtr) -= m * gppp); - (*(here->B4SOIPbPtr) += m * gppb); - (*(here->B4SOIPpPtr) += m * gppp); - } - - /* v4.1 Ig_agbcp2 stamping */ - (*(here->B4SOIGgPtr) += m * gigpg); /* FIXME m or not m ?? h_vogt */ - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIPpPtr) -= m * gigpp); - (*(here->B4SOIPgPtr) -= m * gigpg); - (*(here->B4SOIGpPtr) += m * gigpp); - } - else if(here->B4SOIbodyMod == 2) - { - (*(here->B4SOIBbPtr) -= m * gigpp); - (*(here->B4SOIBgPtr) -= m * gigpg); - (*(here->B4SOIGbPtr) += m * gigpp); - } - - - if (selfheat) - { - (*(here->B4SOIDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B4SOISPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B4SOIBtempPtr) += m * (gbbT + gcbT - gigT)); - (*(here->B4SOIEtempPtr) += m * gceT); - (*(here->B4SOIGtempPtr) += m * (gcgT + gigT)); - (*(here->B4SOITemptempPtr) += m * (gTtt + 1/pParam->B4SOIrth + gcTt)); - (*(here->B4SOITempgPtr) += m * gTtg); - (*(here->B4SOITempbPtr) += m * gTtb); - (*(here->B4SOITempdpPtr) += m * gTtdp); - (*(here->B4SOITempspPtr) += m * gTtsp); - - /* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - (*(here->B4SOITempePtr) += m * gTte); - - } - +#endif if (here->B4SOIdebugMod != 0) { *(here->B4SOIVbsPtr) += 1; @@ -9956,23 +10941,23 @@ line900: *(here->B4SOIQjsPtr) += 1; *(here->B4SOIQjdPtr) += 1; } -#endif line1000: ; #ifndef USE_OMP4SOI - } /* End of Mosfet Instance */ + } /* End of Mosfet Instance */ } /* End of Model Instance */ #endif return(OK); } + #ifdef USE_OMP4SOI /* OpenMP parallelization: Update of right hand side and matrix values from instance temporary storage. -Update to matrix will be done only when all instances of this model +Update to matrix will be done only when all instances of this model have their values calculated and stored. Thus there is no further synchronisation required.*/ @@ -9990,8 +10975,6 @@ void B4SOILoadRhsMat(GENmodel *inModel, CKTcircuit *ckt) here = InstArray[idx]; /* Update b for Ax = b */ - - /* v3.1 */ /* v3.1 added ceqgcrg for RF */ diff --git a/src/spicelib/devices/bsim3soi/b4soimask.c b/src/spicelib/devices/bsim3soi/b4soimask.c index ac2de84b6..cab3fe126 100644 --- a/src/spicelib/devices/bsim3soi/b4soimask.c +++ b/src/spicelib/devices/bsim3soi/b4soimask.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soimdel.c b/src/spicelib/devices/bsim3soi/b4soimdel.c index 7074e6bb1..fc29e1c9c 100644 --- a/src/spicelib/devices/bsim3soi/b4soimdel.c +++ b/src/spicelib/devices/bsim3soi/b4soimdel.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soimpar.c b/src/spicelib/devices/bsim3soi/b4soimpar.c index 536128ffa..0208d3273 100644 --- a/src/spicelib/devices/bsim3soi/b4soimpar.c +++ b/src/spicelib/devices/bsim3soi/b4soimpar.c @@ -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; diff --git a/src/spicelib/devices/bsim3soi/b4soinoi.c b/src/spicelib/devices/bsim3soi/b4soinoi.c index 8df7c962e..09074c941 100644 --- a/src/spicelib/devices/bsim3soi/b4soinoi.c +++ b/src/spicelib/devices/bsim3soi/b4soinoi.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soipar.c b/src/spicelib/devices/bsim3soi/b4soipar.c index 0237586e1..49fc3b800 100644 --- a/src/spicelib/devices/bsim3soi/b4soipar.c +++ b/src/spicelib/devices/bsim3soi/b4soipar.c @@ -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; diff --git a/src/spicelib/devices/bsim3soi/b4soipzld.c b/src/spicelib/devices/bsim3soi/b4soipzld.c index fccc6d08d..27b1cebf7 100644 --- a/src/spicelib/devices/bsim3soi/b4soipzld.c +++ b/src/spicelib/devices/bsim3soi/b4soipzld.c @@ -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); diff --git a/src/spicelib/devices/bsim3soi/b4soiset.c b/src/spicelib/devices/bsim3soi/b4soiset.c index 7f450f5c1..b26f3173a 100644 --- a/src/spicelib/devices/bsim3soi/b4soiset.c +++ b/src/spicelib/devices/bsim3soi/b4soiset.c @@ -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,12 +7,14 @@ * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiset.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. + * Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu. * File: b4soiset.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Tanvir Morshed 09/22/2009 * Modified by Tanvir Morshed 12/31/2009 * Modified by Tanvir Morshed 04/27/2010 + * Modified by Tanvir Morshed 12/16/2010 **********/ #include "ngspice/ngspice.h" @@ -35,7 +38,8 @@ int nthreads; #define Meter2Micron 1.0e6 #define EPS0 8.85418e-12 -double epsrox, toxe, epssub; +double epsrox, toxe, epssub; +double NchMax; /* v4.4 */ int B4SOIsetup( @@ -48,6 +52,7 @@ register B4SOImodel *model = (B4SOImodel*)inModel; register B4SOIinstance *here; int error; CKTnode *tmp; + double Cboxt; /* v3.2 */ @@ -65,90 +70,90 @@ int nthreads; /* Default value Processing for B4SOI MOSFET Models */ if (!model->B4SOItypeGiven) - model->B4SOItype = NMOS; - if (!model->B4SOImobModGiven) + model->B4SOItype = NMOS; + if (!model->B4SOImobModGiven) model->B4SOImobMod = 1; - if (!model->B4SOIbinUnitGiven) + if (!model->B4SOIbinUnitGiven) model->B4SOIbinUnit = 1; - if (!model->B4SOIparamChkGiven) + if (!model->B4SOIparamChkGiven) model->B4SOIparamChk = 0; - if (!model->B4SOIcapModGiven) + if (!model->B4SOIcapModGiven) model->B4SOIcapMod = 2; - if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */ - model->B4SOIiiiMod = 0; - - if (!model->B4SOImtrlModGiven) + if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */ + model->B4SOIiiiMod = 0; + + if (!model->B4SOImtrlModGiven) model->B4SOImtrlMod = 0; /*4.1*/ - if (!model->B4SOIvgstcvModGiven) - /*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */ - model->B4SOIvgstcvMod = 1; - if (!model->B4SOIgidlModGiven) - model->B4SOIgidlMod = 0; - if (!model->B4SOIeotGiven) + if (!model->B4SOIvgstcvModGiven) + /*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */ + model->B4SOIvgstcvMod = 1; + if (!model->B4SOIgidlModGiven) + model->B4SOIgidlMod = 0; + if (!model->B4SOIeotGiven) model->B4SOIeot = 100.0e-10; - if (!model->B4SOIepsroxGiven) + if (!model->B4SOIepsroxGiven) model->B4SOIepsrox = 3.9; - if (!model->B4SOIepsrsubGiven) - model->B4SOIepsrsub = 11.7; + if (!model->B4SOIepsrsubGiven) + model->B4SOIepsrsub = 11.7; if (!model->B4SOIni0subGiven) model->B4SOIni0sub = 1.45e10; /* unit 1/cm3 */ if (!model->B4SOIbg0subGiven) model->B4SOIbg0sub = 1.16; /* unit eV */ if (!model->B4SOItbgasubGiven) - model->B4SOItbgasub = 7.02e-4; + model->B4SOItbgasub = 7.02e-4; if (!model->B4SOItbgbsubGiven) - model->B4SOItbgbsub = 1108.0; + model->B4SOItbgbsub = 1108.0; if (!model->B4SOIleffeotGiven) model->B4SOIleffeot = 1.0; - if (!model->B4SOIweffeotGiven) + if (!model->B4SOIweffeotGiven) model->B4SOIweffeot = 10.0; - if (!model->B4SOIvddeotGiven) + if (!model->B4SOIvddeotGiven) model->B4SOIvddeot = (model->B4SOItype == NMOS) ? 1.5 : -1.5; - if (!model->B4SOItempeotGiven) - model->B4SOItempeot = 300.15; + if (!model->B4SOItempeotGiven) + model->B4SOItempeot = 300.15; if (!model->B4SOIadosGiven) model->B4SOIados = 1.0; if (!model->B4SOIbdosGiven) model->B4SOIbdos = 1.0; if (!model->B4SOIepsrgateGiven) - model->B4SOIepsrgate = 11.7; + model->B4SOIepsrgate = 11.7; if (!model->B4SOIphigGiven) - model->B4SOIphig = 4.05; + model->B4SOIphig = 4.05; if (!model->B4SOIeasubGiven) - model->B4SOIeasub = 4.05; - -/* if (!model->B4SOInoiModGiven) - model->B4SOInoiMod = 1; v3.2 */ - if (!model->B4SOIshModGiven) + model->B4SOIeasub = 4.05; + +/* if (!model->B4SOInoiModGiven) + model->B4SOInoiMod = 1; v3.2 */ + if (!model->B4SOIshModGiven) model->B4SOIshMod = 0; - if (!model->B4SOIversionGiven) - model->B4SOIversion = 4.31; + if (!model->B4SOIversionGiven) + model->B4SOIversion = 4.4; if (!model->B4SOItoxGiven) model->B4SOItox = 100.0e-10; /*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/ - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - //model->B4SOIcox = 3.453133e-11 / model->B4SOItox; - model->B4SOIcox = epsrox * EPS0 / toxe; - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - //model->B4SOIcox = epsrox * EPS0 / toxe; - model->B4SOIcox = 3.453133e-11 / model->B4SOItox; - } - - - if (!model->B4SOItoxpGiven) - model->B4SOItoxp = model->B4SOItox; - + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + /*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/ + model->B4SOIcox = epsrox * EPS0 / toxe; + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ + model->B4SOIcox = 3.453133e-11 / model->B4SOItox; + } + + + if (!model->B4SOItoxpGiven) + model->B4SOItoxp = model->B4SOItox; + + - if (!model->B4SOItoxmGiven) model->B4SOItoxm = model->B4SOItox; /* v3.2 */ @@ -172,21 +177,21 @@ int nthreads; /* v3.1 added for RF end */ /* v3.2 for noise */ - if (!model->B4SOIfnoiModGiven) - model->B4SOIfnoiMod = 1; - else if ((model->B4SOIfnoiMod != 0) && (model->B4SOIfnoiMod != 1)) - { model->B4SOIfnoiMod = 1; - printf("Waring: fnoiMod has been set to default value:1.\n"); - } - - if (!model->B4SOItnoiModGiven) - model->B4SOItnoiMod = 0; - else if ((model->B4SOItnoiMod != 0) && (model->B4SOItnoiMod != 1)&& (model->B4SOItnoiMod != 2)) - { model->B4SOItnoiMod = 0; - printf("Waring: tnoiMod has been set to default value:0.\n"); - } - - if (!model->B4SOItnoiaGiven) + if (!model->B4SOIfnoiModGiven) + model->B4SOIfnoiMod = 1; + else if ((model->B4SOIfnoiMod != 0) && (model->B4SOIfnoiMod != 1)) + { model->B4SOIfnoiMod = 1; + printf("Waring: fnoiMod has been set to default value:1.\n"); + } + + if (!model->B4SOItnoiModGiven) + model->B4SOItnoiMod = 0; + else if ((model->B4SOItnoiMod != 0) && (model->B4SOItnoiMod != 1)&& (model->B4SOItnoiMod != 2)) + { model->B4SOItnoiMod = 0; + printf("Waring: tnoiMod has been set to default value:0.\n"); + } + + if (!model->B4SOItnoiaGiven) model->B4SOItnoia = 1.5; if (!model->B4SOItnoibGiven) model->B4SOItnoib = 3.5; @@ -198,15 +203,15 @@ int nthreads; model->B4SOIntnoi = 1.0; /* v3.2 for noise end */ - /* v4.0 */ + /* v4.0 */ if (!model->B4SOIrdsModGiven) model->B4SOIrdsMod = 0; else if ((model->B4SOIrdsMod != 0) && (model->B4SOIrdsMod != 1)) { model->B4SOIrdsMod = 0; printf("Warning: rdsMod has been set to its default value: 0.\n"); } - - if (!model->B4SOIrbodyModGiven) + + if (!model->B4SOIrbodyModGiven) model->B4SOIrbodyMod = 0; else if ((model->B4SOIrbodyMod != 0) && (model->B4SOIrbodyMod != 1)) { model->B4SOIrbodyMod = 0; @@ -227,21 +232,21 @@ int nthreads; model->B4SOIdtoxcv = 0.0; if (!model->B4SOIcdscGiven) - model->B4SOIcdsc = 2.4e-4; /* unit Q/V/m^2 */ + model->B4SOIcdsc = 2.4e-4; /* unit Q/V/m^2 */ if (!model->B4SOIcdscbGiven) - model->B4SOIcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B4SOIcdscdGiven) - model->B4SOIcdscd = 0.0; /* unit Q/V/m^2 */ + model->B4SOIcdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->B4SOIcdscdGiven) + model->B4SOIcdscd = 0.0; /* unit Q/V/m^2 */ if (!model->B4SOIcitGiven) - model->B4SOIcit = 0.0; /* unit Q/V/m^2 */ + model->B4SOIcit = 0.0; /* unit Q/V/m^2 */ if (!model->B4SOInfactorGiven) - model->B4SOInfactor = 1; + model->B4SOInfactor = 1; if (!model->B4SOIvsatGiven) - model->B4SOIvsat = 8.0e4; /* unit m/s */ + model->B4SOIvsat = 8.0e4; /* unit m/s */ if (!model->B4SOIatGiven) - model->B4SOIat = 3.3e4; /* unit m/s */ + model->B4SOIat = 3.3e4; /* unit m/s */ if (!model->B4SOIa0Given) - model->B4SOIa0 = 1.0; + model->B4SOIa0 = 1.0; if (!model->B4SOIagsGiven) model->B4SOIags = 0.0; if (!model->B4SOIa1Given) @@ -256,12 +261,12 @@ int nthreads; model->B4SOInpeak = 1.7e17; /* unit 1/cm3 */ if (!model->B4SOIngateGiven) model->B4SOIngate = 0; /* unit 1/cm3 */ - if (!model->B4SOInsdGiven) - model->B4SOInsd = 1.0e20; + if (!model->B4SOInsdGiven) + model->B4SOInsd = 1.0e20; if (!model->B4SOIvbmGiven) - model->B4SOIvbm = -3.0; + model->B4SOIvbm = -3.0; if (!model->B4SOIxtGiven) - model->B4SOIxt = 1.55e-7; + model->B4SOIxt = 1.55e-7; if (!model->B4SOIkt1Given) model->B4SOIkt1 = -0.11; /* unit V */ if (!model->B4SOIkt1lGiven) @@ -269,35 +274,35 @@ int nthreads; if (!model->B4SOIkt2Given) model->B4SOIkt2 = 0.022; /* No unit */ if (!model->B4SOIk3Given) - model->B4SOIk3 = 0.0; + model->B4SOIk3 = 0.0; if (!model->B4SOIk3bGiven) - model->B4SOIk3b = 0.0; + model->B4SOIk3b = 0.0; if (!model->B4SOIw0Given) - model->B4SOIw0 = 2.5e-6; + model->B4SOIw0 = 2.5e-6; if (!model->B4SOIlpebGiven) model->B4SOIlpeb = 0.0; if (!model->B4SOIdvt0Given) - model->B4SOIdvt0 = 2.2; + model->B4SOIdvt0 = 2.2; if (!model->B4SOIdvt1Given) - model->B4SOIdvt1 = 0.53; + model->B4SOIdvt1 = 0.53; if (!model->B4SOIdvt2Given) - model->B4SOIdvt2 = -0.032; /* unit 1 / V */ + model->B4SOIdvt2 = -0.032; /* unit 1 / V */ if (!model->B4SOIdvt0wGiven) - model->B4SOIdvt0w = 0.0; + model->B4SOIdvt0w = 0.0; if (!model->B4SOIdvt1wGiven) - model->B4SOIdvt1w = 5.3e6; + model->B4SOIdvt1w = 5.3e6; if (!model->B4SOIdvt2wGiven) - model->B4SOIdvt2w = -0.032; + model->B4SOIdvt2w = -0.032; if (!model->B4SOIdroutGiven) - model->B4SOIdrout = 0.56; + model->B4SOIdrout = 0.56; if (!model->B4SOIdsubGiven) - model->B4SOIdsub = model->B4SOIdrout; + model->B4SOIdsub = model->B4SOIdrout; if (!model->B4SOIvth0Given) model->B4SOIvth0 = (model->B4SOItype == NMOS) ? 0.7 : -0.7; - if (!model->B4SOIvfbGiven) - model->B4SOIvfb = -1.0; /* v4.1 */ + if (!model->B4SOIvfbGiven) + model->B4SOIvfb = -1.0; /* v4.1 */ if (!model->B4SOIuaGiven) model->B4SOIua = 2.25e-9; /* unit m/V */ if (!model->B4SOIua1Given) @@ -307,165 +312,167 @@ int nthreads; if (!model->B4SOIub1Given) model->B4SOIub1 = -7.61e-18; /* unit (m/V)**2 */ if (!model->B4SOIucGiven) - model->B4SOIuc = (model->B4SOImobMod == 3) ? -0.0465 : -0.0465e-9; + model->B4SOIuc = (model->B4SOImobMod == 3) ? -0.0465 : -0.0465e-9; if (!model->B4SOIuc1Given) - model->B4SOIuc1 = (model->B4SOImobMod == 3) ? -0.056 : -0.056e-9; + model->B4SOIuc1 = (model->B4SOImobMod == 3) ? -0.056 : -0.056e-9; if (!model->B4SOIu0Given) model->B4SOIu0 = (model->B4SOItype == NMOS) ? 0.067 : 0.025; if (!model->B4SOIuteGiven) - model->B4SOIute = -1.5; - - /*4.1 mobmod =4 */ + model->B4SOIute = -1.5; + + /*4.1 mobmod =4 */ if (!model->B4SOIudGiven) - model->B4SOIud = 0.0; - if (!model->B4SOIludGiven) - model->B4SOIlud = 0.0; - if (!model->B4SOIwudGiven) - model->B4SOIwud = 0.0; + model->B4SOIud = 0.0; + if (!model->B4SOIludGiven) + model->B4SOIlud = 0.0; + if (!model->B4SOIwudGiven) + model->B4SOIwud = 0.0; if (!model->B4SOIpudGiven) - /* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */ - model->B4SOIpud = 0.0; + /* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */ + model->B4SOIpud = 0.0; if (!model->B4SOIud1Given) - model->B4SOIud1 = 0.0; - if (!model->B4SOIlud1Given) - model->B4SOIlud1 = 0.0; - if (!model->B4SOIwud1Given) - model->B4SOIwud1 = 0.0; + model->B4SOIud1 = 0.0; + if (!model->B4SOIlud1Given) + model->B4SOIlud1 = 0.0; + if (!model->B4SOIwud1Given) + model->B4SOIwud1 = 0.0; if (!model->B4SOIpud1Given) - model->B4SOIpud1 = 0.0; + model->B4SOIpud1 = 0.0; if (!model->B4SOIeuGiven) - model->B4SOIeu = (model->B4SOItype == NMOS) ? 1.67 : 1.0; + model->B4SOIeu = (model->B4SOItype == NMOS) ? 1.67 : 1.0; if (!model->B4SOIleuGiven) - model->B4SOIleu = 0.0; + model->B4SOIleu = 0.0; if (!model->B4SOIweuGiven) - model->B4SOIweu = 0.0; + model->B4SOIweu = 0.0; if (!model->B4SOIpeuGiven) - model->B4SOIpeu = 0.0; - if (!model->B4SOIucsGiven) + model->B4SOIpeu = 0.0; + if (!model->B4SOIucsGiven) model->B4SOIucs = (model->B4SOItype == NMOS) ? 1.67 : 1.0; - if (!model->B4SOIlucsGiven) + if (!model->B4SOIlucsGiven) model->B4SOIlucs =0.0; - if (!model->B4SOIwucsGiven) + if (!model->B4SOIwucsGiven) model->B4SOIwucs =0.0; - if (!model->B4SOIpucsGiven) + if (!model->B4SOIpucsGiven) model->B4SOIpucs =0.0; - if (!model->B4SOIucsteGiven) - model->B4SOIucste = -4.775e-3; - if (!model->B4SOIlucsteGiven) - model->B4SOIlucste = 0.0; + if (!model->B4SOIucsteGiven) + model->B4SOIucste = -4.775e-3; + if (!model->B4SOIlucsteGiven) + model->B4SOIlucste = 0.0; if (!model->B4SOIwucsteGiven) - model->B4SOIwucste = 0.0; + model->B4SOIwucste = 0.0; if (!model->B4SOIpucsteGiven) - model->B4SOIpucste = 0.0; - + model->B4SOIpucste = 0.0; + if (!model->B4SOIvoffGiven) - model->B4SOIvoff = -0.08; - if (!model->B4SOIdeltaGiven) + model->B4SOIvoff = -0.08; + if (!model->B4SOIdeltaGiven) model->B4SOIdelta = 0.01; if (!model->B4SOIrdswGiven) model->B4SOIrdsw = 100; - if (!model->B4SOIrswGiven) /* v4.0 */ + if (!model->B4SOIrswGiven) /* v4.0 */ model->B4SOIrsw = 50; - if (!model->B4SOIrdwGiven) /* v4.0 */ + if (!model->B4SOIrdwGiven) /* v4.0 */ model->B4SOIrdw = 50; - if (!model->B4SOIrswminGiven) /* v4.0 */ + if (!model->B4SOIrswminGiven) /* v4.0 */ model->B4SOIrswmin = 0.0; - if (!model->B4SOIrdwminGiven) /* v4.0 */ + if (!model->B4SOIrdwminGiven) /* v4.0 */ model->B4SOIrdwmin = 0.0; if (!model->B4SOIprwgGiven) model->B4SOIprwg = 0.0; /* unit 1/V */ if (!model->B4SOIprwbGiven) - model->B4SOIprwb = 0.0; + model->B4SOIprwb = 0.0; if (!model->B4SOIprtGiven) - model->B4SOIprt = 0.0; + model->B4SOIprt = 0.0; if (!model->B4SOIeta0Given) - model->B4SOIeta0 = 0.08; /* no unit */ + model->B4SOIeta0 = 0.08; /* no unit */ if (!model->B4SOIetabGiven) - model->B4SOIetab = -0.07; /* unit 1/V */ + model->B4SOIetab = -0.07; /* unit 1/V */ if (!model->B4SOIpclmGiven) - model->B4SOIpclm = 1.3; /* no unit */ + model->B4SOIpclm = 1.3; /* no unit */ if (!model->B4SOIpdibl1Given) model->B4SOIpdibl1 = .39; /* no unit */ if (!model->B4SOIpdibl2Given) - model->B4SOIpdibl2 = 0.0086; /* no unit */ + model->B4SOIpdibl2 = 0.0086; /* no unit */ if (!model->B4SOIpdiblbGiven) - model->B4SOIpdiblb = 0.0; /* 1/V */ + model->B4SOIpdiblb = 0.0; /* 1/V */ if (!model->B4SOIpvagGiven) - model->B4SOIpvag = 0.0; - if (!model->B4SOIwrGiven) + model->B4SOIpvag = 0.0; + if (!model->B4SOIwrGiven) model->B4SOIwr = 1.0; - if (!model->B4SOIdwgGiven) + if (!model->B4SOIdwgGiven) model->B4SOIdwg = 0.0; - if (!model->B4SOIdwbGiven) + if (!model->B4SOIdwbGiven) model->B4SOIdwb = 0.0; if (!model->B4SOIb0Given) model->B4SOIb0 = 0.0; - if (!model->B4SOIb1Given) + if (!model->B4SOIb1Given) model->B4SOIb1 = 0.0; - if (!model->B4SOIalpha0Given) + if (!model->B4SOIalpha0Given) model->B4SOIalpha0 = 0.0; - if (!model->B4SOIcgslGiven) + if (!model->B4SOIcgslGiven) model->B4SOIcgsl = 0.0; - if (!model->B4SOIcgdlGiven) + if (!model->B4SOIcgdlGiven) model->B4SOIcgdl = 0.0; - if (!model->B4SOIckappaGiven) + if (!model->B4SOIckappaGiven) model->B4SOIckappa = 0.6; - if (!model->B4SOIclcGiven) + if (!model->B4SOIclcGiven) model->B4SOIclc = 0.1e-7; - if (!model->B4SOIcleGiven) + if (!model->B4SOIcleGiven) model->B4SOIcle = 0.0; - if (!model->B4SOItboxGiven) + if (!model->B4SOItboxGiven) model->B4SOItbox = 3e-7; - if (!model->B4SOItsiGiven) + if (!model->B4SOItsiGiven) model->B4SOItsi = 1e-7; - if (!model->B4SOIetsiGiven) + if (!model->B4SOIetsiGiven) model->B4SOIetsi = 1e-7; - if (!model->B4SOIxjGiven) + if (!model->B4SOIxjGiven) model->B4SOIxj = model->B4SOItsi; - if (!model->B4SOIrbodyGiven) + if (!model->B4SOIrbodyGiven) model->B4SOIrbody = 0.0; - if (!model->B4SOIrbshGiven) + if (!model->B4SOIrbshGiven) model->B4SOIrbsh = 0.0; - if (!model->B4SOIrth0Given) + if (!model->B4SOIrth0Given) model->B4SOIrth0 = 0; /* v3.0 bug fix */ if (!model->B4SOIcth0Given) model->B4SOIcth0 = 1e-5; + if (!model->B4SOIcfrcoeffGiven) /* v4.4 */ + model->B4SOIcfrcoeff = 1.0; - if (!model->B4SOIagidlGiven) + if (!model->B4SOIagidlGiven) model->B4SOIagidl = 0.0; - if (!model->B4SOIbgidlGiven) - model->B4SOIbgidl = 2.3e9; /* v4.0 */ - if (!model->B4SOIcgidlGiven) /* v4.0 */ - model->B4SOIcgidl = 0.5; /* v4.2 default value changed from 0 to 0.5 */ - if (!model->B4SOIrgidlGiven) /* v4.1 */ + if (!model->B4SOIbgidlGiven) + model->B4SOIbgidl = 2.3e9; /* v4.0 */ + if (!model->B4SOIcgidlGiven) /* v4.0 */ + model->B4SOIcgidl = 0.5; /* v4.2 default value changed from 0 to 0.5 */ + if (!model->B4SOIrgidlGiven) /* v4.1 */ model->B4SOIrgidl = 1.0; - if (!model->B4SOIkgidlGiven) /* v4.1 */ + if (!model->B4SOIkgidlGiven) /* v4.1 */ model->B4SOIkgidl = 0.0; - if (!model->B4SOIfgidlGiven) /* v4.1 */ + if (!model->B4SOIfgidlGiven) /* v4.1 */ model->B4SOIfgidl = 0.0; - if (!model->B4SOIagislGiven) + if (!model->B4SOIagislGiven) model->B4SOIagisl = model->B4SOIagidl; - if (!model->B4SOIbgislGiven) - model->B4SOIbgisl = model->B4SOIbgidl; /* v4.0 */ - if (!model->B4SOIcgislGiven) /* v4.0 */ + if (!model->B4SOIbgislGiven) + model->B4SOIbgisl = model->B4SOIbgidl; /* v4.0 */ + if (!model->B4SOIcgislGiven) /* v4.0 */ model->B4SOIcgisl = model->B4SOIcgidl; - if (!model->B4SOIrgislGiven) /* v4.1 */ + if (!model->B4SOIrgislGiven) /* v4.1 */ model->B4SOIrgisl = model->B4SOIrgidl; - if (!model->B4SOIkgislGiven) /* v4.1 */ + if (!model->B4SOIkgislGiven) /* v4.1 */ model->B4SOIkgisl = model->B4SOIkgidl; - if (!model->B4SOIfgislGiven) /* v4.1 */ - model->B4SOIfgisl = model->B4SOIfgidl; - - if (!model->B4SOIndiodeGiven) /* v4.0 */ + if (!model->B4SOIfgislGiven) /* v4.1 */ + model->B4SOIfgisl = model->B4SOIfgidl; + + if (!model->B4SOIndiodeGiven) /* v4.0 */ model->B4SOIndiode = 1.0; - if (!model->B4SOIndiodedGiven) /* v4.0 */ + if (!model->B4SOIndiodedGiven) /* v4.0 */ model->B4SOIndioded = model->B4SOIndiode; - if (!model->B4SOIntunGiven) /* v4.0 */ + if (!model->B4SOIntunGiven) /* v4.0 */ model->B4SOIntun = 10.0; - if (!model->B4SOIntundGiven) /* v4.0 */ + if (!model->B4SOIntundGiven) /* v4.0 */ model->B4SOIntund = model->B4SOIntun; if (!model->B4SOInrecf0Given) @@ -476,43 +483,43 @@ int nthreads; model->B4SOInrecr0 = 10.0; if (!model->B4SOInrecr0dGiven) model->B4SOInrecr0d = model->B4SOInrecr0; - - if (!model->B4SOIisbjtGiven) + + if (!model->B4SOIisbjtGiven) model->B4SOIisbjt = 1e-6; - if (!model->B4SOIidbjtGiven) + if (!model->B4SOIidbjtGiven) model->B4SOIidbjt = model->B4SOIisbjt; - if (!model->B4SOIisdifGiven) + if (!model->B4SOIisdifGiven) model->B4SOIisdif = 0.0; - if (!model->B4SOIiddifGiven) - model->B4SOIiddif = model->B4SOIisdif; /* v4.0 */ - if (!model->B4SOIisrecGiven) + if (!model->B4SOIiddifGiven) + model->B4SOIiddif = model->B4SOIisdif; /* v4.0 */ + if (!model->B4SOIisrecGiven) model->B4SOIisrec = 1e-5; - if (!model->B4SOIidrecGiven) + if (!model->B4SOIidrecGiven) model->B4SOIidrec = model->B4SOIisrec; - if (!model->B4SOIistunGiven) + if (!model->B4SOIistunGiven) model->B4SOIistun = 0.0; - if (!model->B4SOIidtunGiven) + if (!model->B4SOIidtunGiven) model->B4SOIidtun = model->B4SOIistun; - if (!model->B4SOIxbjtGiven) + if (!model->B4SOIxbjtGiven) model->B4SOIxbjt = 1.0; if (!model->B4SOIxdifGiven) model->B4SOIxdif = model->B4SOIxbjt; if (!model->B4SOIxdifdGiven) model->B4SOIxdifd = model->B4SOIxdif; - if (!model->B4SOIxrecGiven) + if (!model->B4SOIxrecGiven) model->B4SOIxrec = 1.0; if (!model->B4SOIxrecdGiven) model->B4SOIxrecd = model->B4SOIxrec; - if (!model->B4SOIxtunGiven) + if (!model->B4SOIxtunGiven) model->B4SOIxtun = 0.0; if (!model->B4SOIxtundGiven) model->B4SOIxtund = model->B4SOIxtun; - if (!model->B4SOIttGiven) + if (!model->B4SOIttGiven) model->B4SOItt = 1e-12; - if (!model->B4SOIasdGiven) + if (!model->B4SOIasdGiven) model->B4SOIasd = 0.3; - /* 4.0 backward compatibility */ + /* 4.0 backward compatibility */ if (!model->B4SOIlpe0Given) { if(!model->B4SOInlxGiven) model->B4SOIlpe0 = 1.74e-7; @@ -552,7 +559,7 @@ int nthreads; else model->B4SOIegidl = model->B4SOIngidl; } - + if(model->B4SOIegidlGiven && model->B4SOIngidlGiven) printf("Warning: both egidl and ngidl are given. Egidl value is taken \n"); if (!model->B4SOIlegidlGiven) { @@ -560,7 +567,7 @@ int nthreads; model->B4SOIlegidl = 0.0; else model->B4SOIlegidl = model->B4SOIlngidl; - } + } if(model->B4SOIlegidlGiven && model->B4SOIlngidlGiven) printf("Warning: both legidl and lngidl are given. Legidl value is taken \n"); if (!model->B4SOIwegidlGiven) { @@ -580,68 +587,68 @@ int nthreads; if(model->B4SOIpegidlGiven && model->B4SOIpngidlGiven) printf("Warning: both pegidl and pngidl are given. Pegidl value is taken \n"); - if (!model->B4SOIegislGiven) { + if (!model->B4SOIegislGiven) { model->B4SOIegisl = model->B4SOIegidl; } - if (!model->B4SOIlegislGiven) { + if (!model->B4SOIlegislGiven) { model->B4SOIlegisl = model->B4SOIlegidl; - } - if (!model->B4SOIwegislGiven) { + } + if (!model->B4SOIwegislGiven) { model->B4SOIwegisl = model->B4SOIwegidl; - } - if (!model->B4SOIpegislGiven) { + } + if (!model->B4SOIpegislGiven) { model->B4SOIpegisl = model->B4SOIpegidl; - } + } /* unit degree celcius */ - if (!model->B4SOItnomGiven) - model->B4SOItnom = ckt->CKTnomTemp; - if (!model->B4SOILintGiven) + if (!model->B4SOItnomGiven) + model->B4SOItnom = ckt->CKTnomTemp; + if (!model->B4SOILintGiven) model->B4SOILint = 0.0; - if (!model->B4SOILlGiven) + if (!model->B4SOILlGiven) model->B4SOILl = 0.0; - if (!model->B4SOILlcGiven) + if (!model->B4SOILlcGiven) model->B4SOILlc = 0.0; /* v2.2.3 */ - if (!model->B4SOILlnGiven) + if (!model->B4SOILlnGiven) model->B4SOILln = 1.0; - if (!model->B4SOILwGiven) + if (!model->B4SOILwGiven) model->B4SOILw = 0.0; - if (!model->B4SOILwcGiven) + if (!model->B4SOILwcGiven) model->B4SOILwc = 0.0; /* v2.2.3 */ - if (!model->B4SOILwnGiven) + if (!model->B4SOILwnGiven) model->B4SOILwn = 1.0; - if (!model->B4SOILwlGiven) + if (!model->B4SOILwlGiven) model->B4SOILwl = 0.0; - if (!model->B4SOILwlcGiven) + if (!model->B4SOILwlcGiven) model->B4SOILwlc = 0.0; /* v2.2.3 */ - if (!model->B4SOILminGiven) + if (!model->B4SOILminGiven) model->B4SOILmin = 0.0; - if (!model->B4SOILmaxGiven) + if (!model->B4SOILmaxGiven) model->B4SOILmax = 1.0; - if (!model->B4SOIWintGiven) + if (!model->B4SOIWintGiven) model->B4SOIWint = 0.0; - if (!model->B4SOIWlGiven) + if (!model->B4SOIWlGiven) model->B4SOIWl = 0.0; - if (!model->B4SOIWlcGiven) + if (!model->B4SOIWlcGiven) model->B4SOIWlc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWlnGiven) + if (!model->B4SOIWlnGiven) model->B4SOIWln = 1.0; - if (!model->B4SOIWwGiven) + if (!model->B4SOIWwGiven) model->B4SOIWw = 0.0; - if (!model->B4SOIWwcGiven) + if (!model->B4SOIWwcGiven) model->B4SOIWwc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWwnGiven) + if (!model->B4SOIWwnGiven) model->B4SOIWwn = 1.0; - if (!model->B4SOIWwlGiven) + if (!model->B4SOIWwlGiven) model->B4SOIWwl = 0.0; if (!model->B4SOIWwlcGiven) model->B4SOIWwlc = 0.0; /* v2.2.3 */ - if (!model->B4SOIWminGiven) + if (!model->B4SOIWminGiven) model->B4SOIWmin = 0.0; - if (!model->B4SOIWmaxGiven) + if (!model->B4SOIWmaxGiven) model->B4SOIWmax = 1.0; - if (!model->B4SOIdwcGiven) + if (!model->B4SOIdwcGiven) model->B4SOIdwc = model->B4SOIWint; - if (!model->B4SOIdlcGiven) + if (!model->B4SOIdlcGiven) model->B4SOIdlc = model->B4SOILint; if (!model->B4SOIdlcigGiven) model->B4SOIdlcig = model->B4SOILint; /* v3.0 */ @@ -753,7 +760,7 @@ int nthreads; /* v2.0 release */ - if (!model->B4SOIk1w1Given) + if (!model->B4SOIk1w1Given) model->B4SOIk1w1 = 0.0; if (!model->B4SOIk1w2Given) model->B4SOIk1w2 = 0.0; @@ -783,31 +790,31 @@ int nthreads; model->B4SOIsiid = 0.0; if (!model->B4SOIfbjtiiGiven) model->B4SOIfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIebjtiiGiven) + /*4.1 Iii model*/ + if (!model->B4SOIebjtiiGiven) model->B4SOIebjtii = 0.0; if (!model->B4SOIcbjtiiGiven) model->B4SOIcbjtii = 0.0; if (!model->B4SOIvbciGiven) model->B4SOIvbci = 0.0; - if (!model->B4SOItvbciGiven) + if (!model->B4SOItvbciGiven) model->B4SOItvbci = 0.0; if (!model->B4SOIabjtiiGiven) model->B4SOIabjtii = 0.0; if (!model->B4SOImbjtiiGiven) model->B4SOImbjtii = 0.4; - + if (!model->B4SOIesatiiGiven) model->B4SOIesatii = 1e7; if (!model->B4SOIlnGiven) model->B4SOIln = 2e-6; - if (!model->B4SOIvrec0Given) /* v4.0 */ + if (!model->B4SOIvrec0Given) /* v4.0 */ model->B4SOIvrec0 = 0; - if (!model->B4SOIvrec0dGiven) /* v4.0 */ + if (!model->B4SOIvrec0dGiven) /* v4.0 */ model->B4SOIvrec0d = model->B4SOIvrec0; - if (!model->B4SOIvtun0Given) /* v4.0 */ + if (!model->B4SOIvtun0Given) /* v4.0 */ model->B4SOIvtun0 = 0; - if (!model->B4SOIvtun0dGiven) /* v4.0 */ + if (!model->B4SOIvtun0dGiven) /* v4.0 */ model->B4SOIvtun0d = model->B4SOIvtun0; if (!model->B4SOInbjtGiven) model->B4SOInbjt = 1.0; @@ -819,9 +826,9 @@ int nthreads; model->B4SOIvabjt = 10.0; if (!model->B4SOIaelyGiven) model->B4SOIaely = 0; - if (!model->B4SOIahliGiven) /* v4.0 */ + if (!model->B4SOIahliGiven) /* v4.0 */ model->B4SOIahli = 0; - if (!model->B4SOIahlidGiven) /* v4.0 */ + if (!model->B4SOIahlidGiven) /* v4.0 */ model->B4SOIahlid = model->B4SOIahli; if (!model->B4SOIrbodyGiven) model->B4SOIrbody = 0.0; @@ -949,10 +956,10 @@ int nthreads; if (!model->B4SOIlngateGiven) model->B4SOIlngate = 0.0; if (!model->B4SOIlnsdGiven) - model->B4SOIlnsd = 0.0; + model->B4SOIlnsd = 0.0; if (!model->B4SOIlvth0Given) model->B4SOIlvth0 = 0.0; - if (!model->B4SOIlvfbGiven) + if (!model->B4SOIlvfbGiven) model->B4SOIlvfb = 0.0; /* v4.1 */ if (!model->B4SOIlk1Given) model->B4SOIlk1 = 0.0; @@ -1012,9 +1019,9 @@ int nthreads; model->B4SOIla2 = 0.0; if (!model->B4SOIlrdswGiven) model->B4SOIlrdsw = 0.0; - if (!model->B4SOIlrswGiven) /* v4.0 */ + if (!model->B4SOIlrswGiven) /* v4.0 */ model->B4SOIlrsw = 0.0; - if (!model->B4SOIlrdwGiven) /* v4.0 */ + if (!model->B4SOIlrdwGiven) /* v4.0 */ model->B4SOIlrdw = 0.0; if (!model->B4SOIlprwbGiven) model->B4SOIlprwb = 0.0; @@ -1062,8 +1069,8 @@ int nthreads; model->B4SOIlalpha0 = 0.0; if (!model->B4SOIlfbjtiiGiven) model->B4SOIlfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIlebjtiiGiven) + /*4.1 Iii model*/ + if (!model->B4SOIlebjtiiGiven) model->B4SOIlebjtii = 0.0; if (!model->B4SOIlcbjtiiGiven) model->B4SOIlcbjtii = 0.0; @@ -1073,7 +1080,7 @@ int nthreads; model->B4SOIlabjtii = 0.0; if (!model->B4SOIlmbjtiiGiven) model->B4SOIlmbjtii = 0.0; - + if (!model->B4SOIlbeta0Given) model->B4SOIlbeta0 = 0.0; if (!model->B4SOIlbeta1Given) @@ -1106,8 +1113,8 @@ int nthreads; model->B4SOIlkgidl = 0.0; if (!model->B4SOIlfgidlGiven) model->B4SOIlfgidl = 0.0; - - if (!model->B4SOIlagislGiven) + + if (!model->B4SOIlagislGiven) model->B4SOIlagisl = 0.0; if (!model->B4SOIlbgislGiven) model->B4SOIlbgisl = 0.0; @@ -1118,22 +1125,22 @@ int nthreads; if (!model->B4SOIlkgislGiven) model->B4SOIlkgisl = 0.0; if (!model->B4SOIlfgislGiven) - model->B4SOIlfgisl = 0.0; - if (!model->B4SOIlntunGiven) /* v4.0 */ + model->B4SOIlfgisl = 0.0; + if (!model->B4SOIlntunGiven) /* v4.0 */ model->B4SOIlntun = 0.0; - if (!model->B4SOIlntundGiven) /* v4.0 */ + if (!model->B4SOIlntundGiven) /* v4.0 */ model->B4SOIlntund = model->B4SOIlntun; - if (!model->B4SOIlndiodeGiven) /* v4.0 */ + if (!model->B4SOIlndiodeGiven) /* v4.0 */ model->B4SOIlndiode = 0.0; - if (!model->B4SOIlndiodedGiven) /* v4.0 */ + if (!model->B4SOIlndiodedGiven) /* v4.0 */ model->B4SOIlndioded = model->B4SOIlndiode; - if (!model->B4SOIlnrecf0Given) /* v4.0 */ + if (!model->B4SOIlnrecf0Given) /* v4.0 */ model->B4SOIlnrecf0 = 0.0; - if (!model->B4SOIlnrecf0dGiven) /* v4.0 */ + if (!model->B4SOIlnrecf0dGiven) /* v4.0 */ model->B4SOIlnrecf0d = model->B4SOIlnrecf0; - if (!model->B4SOIlnrecr0Given) /* v4.0 */ + if (!model->B4SOIlnrecr0Given) /* v4.0 */ model->B4SOIlnrecr0 = 0.0; - if (!model->B4SOIlnrecr0dGiven) /* v4.0 */ + if (!model->B4SOIlnrecr0dGiven) /* v4.0 */ model->B4SOIlnrecr0d = model->B4SOIlnrecr0; if (!model->B4SOIlisbjtGiven) model->B4SOIlisbjt = 0.0; @@ -1142,7 +1149,7 @@ int nthreads; if (!model->B4SOIlisdifGiven) model->B4SOIlisdif = 0.0; if (!model->B4SOIliddifGiven) - model->B4SOIliddif = model->B4SOIlisdif; /* v4.0 */ + model->B4SOIliddif = model->B4SOIlisdif; /* v4.0 */ if (!model->B4SOIlisrecGiven) model->B4SOIlisrec = 0.0; if (!model->B4SOIlidrecGiven) @@ -1167,11 +1174,11 @@ int nthreads; model->B4SOIlvabjt = 0.0; if (!model->B4SOIlaelyGiven) model->B4SOIlaely = 0.0; - if (!model->B4SOIlahliGiven) /* v4.0 */ + if (!model->B4SOIlahliGiven) /* v4.0 */ model->B4SOIlahli = 0.0; - if (!model->B4SOIlahlidGiven) /* v4.0 */ + if (!model->B4SOIlahlidGiven) /* v4.0 */ model->B4SOIlahlid = model->B4SOIlahli; - /* CV Model */ + /* CV Model */ if (!model->B4SOIlvsdfbGiven) model->B4SOIlvsdfb = 0.0; if (!model->B4SOIlvsdthGiven) @@ -1346,9 +1353,9 @@ int nthreads; model->B4SOIwa2 = 0.0; if (!model->B4SOIwrdswGiven) model->B4SOIwrdsw = 0.0; - if (!model->B4SOIwrswGiven) /* v4.0 */ + if (!model->B4SOIwrswGiven) /* v4.0 */ model->B4SOIwrsw = 0.0; - if (!model->B4SOIwrdwGiven) /* v4.0 */ + if (!model->B4SOIwrdwGiven) /* v4.0 */ model->B4SOIwrdw = 0.0; if (!model->B4SOIwprwbGiven) model->B4SOIwprwb = 0.0; @@ -1396,8 +1403,8 @@ int nthreads; model->B4SOIwalpha0 = 0.0; if (!model->B4SOIwfbjtiiGiven) model->B4SOIwfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIwebjtiiGiven) + /*4.1 Iii model*/ + if (!model->B4SOIwebjtiiGiven) model->B4SOIwebjtii = 0.0; if (!model->B4SOIwcbjtiiGiven) model->B4SOIwcbjtii = 0.0; @@ -1439,8 +1446,8 @@ int nthreads; model->B4SOIwkgidl = 0.0; if (!model->B4SOIwfgidlGiven) model->B4SOIwfgidl = 0.0; - - if (!model->B4SOIwagislGiven) + + if (!model->B4SOIwagislGiven) model->B4SOIwagisl = 0.0; if (!model->B4SOIwbgislGiven) model->B4SOIwbgisl = 0.0; @@ -1451,22 +1458,22 @@ int nthreads; if (!model->B4SOIwkgislGiven) model->B4SOIwkgisl = 0.0; if (!model->B4SOIwfgislGiven) - model->B4SOIwfgisl = 0.0; - if (!model->B4SOIwntunGiven) /* v4.0 */ + model->B4SOIwfgisl = 0.0; + if (!model->B4SOIwntunGiven) /* v4.0 */ model->B4SOIwntun = 0.0; - if (!model->B4SOIwntundGiven) /* v4.0 */ + if (!model->B4SOIwntundGiven) /* v4.0 */ model->B4SOIwntund = model->B4SOIwntun; - if (!model->B4SOIwndiodeGiven) /* v4.0 */ + if (!model->B4SOIwndiodeGiven) /* v4.0 */ model->B4SOIwndiode = 0.0; - if (!model->B4SOIwndiodedGiven) /* v4.0 */ + if (!model->B4SOIwndiodedGiven) /* v4.0 */ model->B4SOIwndioded = model->B4SOIwndiode; if (!model->B4SOIwnrecf0Given) /* v4.0 */ model->B4SOIwnrecf0 = 0.0; - if (!model->B4SOIwnrecf0dGiven) /* v4.0 */ + if (!model->B4SOIwnrecf0dGiven) /* v4.0 */ model->B4SOIwnrecf0d = model->B4SOIwnrecf0; - if (!model->B4SOIwnrecr0Given) /* v4.0 */ + if (!model->B4SOIwnrecr0Given) /* v4.0 */ model->B4SOIwnrecr0 = 0.0; - if (!model->B4SOIwnrecr0dGiven) /* v4.0 */ + if (!model->B4SOIwnrecr0dGiven) /* v4.0 */ model->B4SOIwnrecr0d = model->B4SOIwnrecr0; if (!model->B4SOIwisbjtGiven) model->B4SOIwisbjt = 0.0; @@ -1475,7 +1482,7 @@ int nthreads; if (!model->B4SOIwisdifGiven) model->B4SOIwisdif = 0.0; if (!model->B4SOIwiddifGiven) - model->B4SOIwiddif = model->B4SOIwisdif; /* v4.0 */ + model->B4SOIwiddif = model->B4SOIwisdif; /* v4.0 */ if (!model->B4SOIwisrecGiven) model->B4SOIwisrec = 0.0; if (!model->B4SOIwidrecGiven) @@ -1500,9 +1507,9 @@ int nthreads; model->B4SOIwvabjt = 0.0; if (!model->B4SOIwaelyGiven) model->B4SOIwaely = 0.0; - if (!model->B4SOIwahliGiven) /* v4.0 */ + if (!model->B4SOIwahliGiven) /* v4.0 */ model->B4SOIwahli = 0.0; - if (!model->B4SOIwahlidGiven) /* v4.0 */ + if (!model->B4SOIwahlidGiven) /* v4.0 */ model->B4SOIwahlid = model->B4SOIwahli; /* v3.1 added for RF */ @@ -1512,7 +1519,7 @@ int nthreads; model->B4SOIwxrcrg2 =0.0; /* v3.1 added for RF end */ - /* CV Model */ + /* CV Model */ if (!model->B4SOIwvsdfbGiven) model->B4SOIwvsdfb = 0.0; if (!model->B4SOIwvsdthGiven) @@ -1680,9 +1687,9 @@ int nthreads; model->B4SOIpa2 = 0.0; if (!model->B4SOIprdswGiven) model->B4SOIprdsw = 0.0; - if (!model->B4SOIprswGiven) /* v4.0 */ + if (!model->B4SOIprswGiven) /* v4.0 */ model->B4SOIprsw = 0.0; - if (!model->B4SOIprdwGiven) /* v4.0 */ + if (!model->B4SOIprdwGiven) /* v4.0 */ model->B4SOIprdw = 0.0; if (!model->B4SOIpprwbGiven) model->B4SOIpprwb = 0.0; @@ -1730,8 +1737,8 @@ int nthreads; model->B4SOIpalpha0 = 0.0; if (!model->B4SOIpfbjtiiGiven) model->B4SOIpfbjtii = 0.0; - /*4.1 Iii model*/ - if (!model->B4SOIpebjtiiGiven) + /*4.1 Iii model*/ + if (!model->B4SOIpebjtiiGiven) model->B4SOIpebjtii = 0.0; if (!model->B4SOIpcbjtiiGiven) model->B4SOIpcbjtii = 0.0; @@ -1773,8 +1780,8 @@ int nthreads; model->B4SOIpkgidl = 0.0; if (!model->B4SOIpfgidlGiven) model->B4SOIpfgidl = 0.0; - - if (!model->B4SOIpagislGiven) + + if (!model->B4SOIpagislGiven) model->B4SOIpagisl = 0.0; if (!model->B4SOIpbgislGiven) model->B4SOIpbgisl = 0.0; @@ -1785,22 +1792,22 @@ int nthreads; if (!model->B4SOIpkgislGiven) model->B4SOIpkgisl = 0.0; if (!model->B4SOIpfgislGiven) - model->B4SOIpfgisl = 0.0; - if (!model->B4SOIpntunGiven) /* v4.0 */ + model->B4SOIpfgisl = 0.0; + if (!model->B4SOIpntunGiven) /* v4.0 */ model->B4SOIpntun = 0.0; - if (!model->B4SOIpntundGiven) /* v4.0 */ + if (!model->B4SOIpntundGiven) /* v4.0 */ model->B4SOIpntund = model->B4SOIpntun; - if (!model->B4SOIpndiodeGiven) /* v4.0 */ + if (!model->B4SOIpndiodeGiven) /* v4.0 */ model->B4SOIpndiode = 0.0; - if (!model->B4SOIpndiodedGiven) /* v4.0 */ + if (!model->B4SOIpndiodedGiven) /* v4.0 */ model->B4SOIpndioded = model->B4SOIpndiode; - if (!model->B4SOIpnrecf0Given) /* v4.0 */ + if (!model->B4SOIpnrecf0Given) /* v4.0 */ model->B4SOIpnrecf0 = 0.0; - if (!model->B4SOIpnrecf0dGiven) /* v4.0 */ + if (!model->B4SOIpnrecf0dGiven) /* v4.0 */ model->B4SOIpnrecf0d = model->B4SOIpnrecf0; - if (!model->B4SOIpnrecr0Given) /* v4.0 */ + if (!model->B4SOIpnrecr0Given) /* v4.0 */ model->B4SOIpnrecr0 = 0.0; - if (!model->B4SOIpnrecr0dGiven) /* v4.0 */ + if (!model->B4SOIpnrecr0dGiven) /* v4.0 */ model->B4SOIpnrecr0d = model->B4SOIpnrecr0; if (!model->B4SOIpisbjtGiven) model->B4SOIpisbjt = 0.0; @@ -1818,13 +1825,13 @@ int nthreads; model->B4SOIpistun = 0.0; if (!model->B4SOIpidtunGiven) model->B4SOIpidtun = model->B4SOIpistun; - if (!model->B4SOIpvrec0Given) /* v4.0 */ + if (!model->B4SOIpvrec0Given) /* v4.0 */ model->B4SOIpvrec0 = 0.0; - if (!model->B4SOIpvrec0dGiven) /* v4.0 */ + if (!model->B4SOIpvrec0dGiven) /* v4.0 */ model->B4SOIpvrec0d = model->B4SOIpvrec0; - if (!model->B4SOIpvtun0Given) /* v4.0 */ + if (!model->B4SOIpvtun0Given) /* v4.0 */ model->B4SOIpvtun0 = 0.0; - if (!model->B4SOIpvtun0dGiven) /* v4.0 */ + if (!model->B4SOIpvtun0dGiven) /* v4.0 */ model->B4SOIpvtun0d = model->B4SOIpvtun0; if (!model->B4SOIpnbjtGiven) model->B4SOIpnbjt = 0.0; @@ -1834,9 +1841,9 @@ int nthreads; model->B4SOIpvabjt = 0.0; if (!model->B4SOIpaelyGiven) model->B4SOIpaely = 0.0; - if (!model->B4SOIpahliGiven) /* v4.0 */ + if (!model->B4SOIpahliGiven) /* v4.0 */ model->B4SOIpahli = 0.0; - if (!model->B4SOIpahlidGiven) /* v4.0 */ + if (!model->B4SOIpahlidGiven) /* v4.0 */ model->B4SOIpahlid = model->B4SOIpahli; /* v3.1 for RF */ @@ -1846,7 +1853,7 @@ int nthreads; model->B4SOIpxrcrg2 =0.0; /* v3.1 for RF end */ - /* CV Model */ + /* CV Model */ if (!model->B4SOIpvsdfbGiven) model->B4SOIpvsdfb = 0.0; if (!model->B4SOIpvsdthGiven) @@ -1861,62 +1868,62 @@ int nthreads; model->B4SOIpnoff = 0.0; /* v3.2 */ /* Added for binning - END */ - if (!model->B4SOIcfGiven) + if (!model->B4SOIcfGiven) model->B4SOIcf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->B4SOItox); + * log(1.0 + 0.4e-6 / model->B4SOItox); if (!model->B4SOIcgdoGiven) - { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) - { model->B4SOIcgdo = model->B4SOIdlc * model->B4SOIcox - - model->B4SOIcgdl ; - } - else - model->B4SOIcgdo = 0.6 * model->B4SOIxj * model->B4SOIcox; - } + { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) + { model->B4SOIcgdo = model->B4SOIdlc * model->B4SOIcox + - model->B4SOIcgdl ; + } + else + model->B4SOIcgdo = 0.6 * model->B4SOIxj * model->B4SOIcox; + } if (!model->B4SOIcgsoGiven) - { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) - { model->B4SOIcgso = model->B4SOIdlc * model->B4SOIcox - - model->B4SOIcgsl ; - } - else - model->B4SOIcgso = 0.6 * model->B4SOIxj * model->B4SOIcox; - } + { if (model->B4SOIdlcGiven && (model->B4SOIdlc > 0.0)) + { model->B4SOIcgso = model->B4SOIdlc * model->B4SOIcox + - model->B4SOIcgsl ; + } + else + model->B4SOIcgso = 0.6 * model->B4SOIxj * model->B4SOIcox; + } if (!model->B4SOIcgeoGiven) - { model->B4SOIcgeo = 0.0; - } + { model->B4SOIcgeo = 0.0; + } if (!model->B4SOIxpartGiven) model->B4SOIxpart = 0.0; if (!model->B4SOIsheetResistanceGiven) model->B4SOIsheetResistance = 0.0; if (!model->B4SOIcsdeswGiven) model->B4SOIcsdesw = 0.0; - if (!model->B4SOIunitLengthGateSidewallJctCapSGiven) /* v4.0 */ + if (!model->B4SOIunitLengthGateSidewallJctCapSGiven) /* v4.0 */ model->B4SOIunitLengthGateSidewallJctCapS = 1e-10; - if (!model->B4SOIunitLengthGateSidewallJctCapDGiven) /* v4.0 */ + if (!model->B4SOIunitLengthGateSidewallJctCapDGiven) /* v4.0 */ model->B4SOIunitLengthGateSidewallJctCapD = model->B4SOIunitLengthGateSidewallJctCapS; - if (!model->B4SOIGatesidewallJctSPotentialGiven) /* v4.0 */ + if (!model->B4SOIGatesidewallJctSPotentialGiven) /* v4.0 */ model->B4SOIGatesidewallJctSPotential = 0.7; - if (!model->B4SOIGatesidewallJctDPotentialGiven) /* v4.0 */ + if (!model->B4SOIGatesidewallJctDPotentialGiven) /* v4.0 */ model->B4SOIGatesidewallJctDPotential = model->B4SOIGatesidewallJctSPotential; - if (!model->B4SOIbodyJctGateSideSGradingCoeffGiven) /* v4.0 */ + if (!model->B4SOIbodyJctGateSideSGradingCoeffGiven) /* v4.0 */ model->B4SOIbodyJctGateSideSGradingCoeff = 0.5; - if (!model->B4SOIbodyJctGateSideDGradingCoeffGiven) /* v4.0 */ + if (!model->B4SOIbodyJctGateSideDGradingCoeffGiven) /* v4.0 */ model->B4SOIbodyJctGateSideDGradingCoeff = model->B4SOIbodyJctGateSideSGradingCoeff; if (!model->B4SOIoxideTrapDensityAGiven) - { if (model->B4SOItype == NMOS) + { if (model->B4SOItype == NMOS) model->B4SOIoxideTrapDensityA = 6.25e41; else model->B4SOIoxideTrapDensityA=6.188e40; - } + } if (!model->B4SOIoxideTrapDensityBGiven) - { if (model->B4SOItype == NMOS) + { if (model->B4SOItype == NMOS) model->B4SOIoxideTrapDensityB = 3.125e26; else model->B4SOIoxideTrapDensityB = 1.5e25; - } + } if (!model->B4SOIoxideTrapDensityCGiven) model->B4SOIoxideTrapDensityC = 8.75e9; - + if (!model->B4SOIemGiven) model->B4SOIem = 4.1e7; /* V/m */ if (!model->B4SOIefGiven) @@ -1927,61 +1934,61 @@ int nthreads; model->B4SOIkf = 0.0; if (!model->B4SOInoifGiven) model->B4SOInoif = 1.0; - if (!model->B4SOIbfGiven) /* v4.0 */ + if (!model->B4SOIbfGiven) /* v4.0 */ model->B4SOIbf = 2.0; - if (!model->B4SOIw0flkGiven) /* v4.0 */ + if (!model->B4SOIw0flkGiven) /* v4.0 */ model->B4SOIw0flk = 10.0e-6; - if (!model->B4SOIfrbodyGiven) /* v4.0 */ + if (!model->B4SOIfrbodyGiven) /* v4.0 */ model->B4SOIfrbody = 1; - if (!model->B4SOIdvtp0Given) /* v4.0 for Vth */ + if (!model->B4SOIdvtp0Given) /* v4.0 for Vth */ model->B4SOIdvtp0 = 0.0; - if (!model->B4SOIdvtp1Given) /* v4.0 for Vth */ + if (!model->B4SOIdvtp1Given) /* v4.0 for Vth */ model->B4SOIdvtp1 = 0.0; - if (!model->B4SOIdvtp2Given) /* v4.1 for Vth */ + if (!model->B4SOIdvtp2Given) /* v4.1 for Vth */ model->B4SOIdvtp2 = 0.0; - if (!model->B4SOIdvtp3Given) /* v4.1 for Vth */ + if (!model->B4SOIdvtp3Given) /* v4.1 for Vth */ model->B4SOIdvtp3 = 0.0; - if (!model->B4SOIdvtp4Given) /* v4.1 for Vth */ + if (!model->B4SOIdvtp4Given) /* v4.1 for Vth */ model->B4SOIdvtp4 = 0.0; - if (!model->B4SOIldvtp0Given) /* v4.0 for Vth */ + if (!model->B4SOIldvtp0Given) /* v4.0 for Vth */ model->B4SOIldvtp0 = 0.0; - if (!model->B4SOIldvtp1Given) /* v4.0 for Vth */ + if (!model->B4SOIldvtp1Given) /* v4.0 for Vth */ model->B4SOIldvtp1 = 0.0; - if (!model->B4SOIldvtp2Given) /* v4.1 for Vth */ + if (!model->B4SOIldvtp2Given) /* v4.1 for Vth */ model->B4SOIldvtp2 = 0.0; - if (!model->B4SOIldvtp3Given) /* v4.1 for Vth */ + if (!model->B4SOIldvtp3Given) /* v4.1 for Vth */ model->B4SOIldvtp3 = 0.0; - if (!model->B4SOIldvtp4Given) /* v4.1 for Vth */ + if (!model->B4SOIldvtp4Given) /* v4.1 for Vth */ model->B4SOIldvtp4 = 0.0; - if (!model->B4SOIwdvtp0Given) /* v4.0 for Vth */ + if (!model->B4SOIwdvtp0Given) /* v4.0 for Vth */ model->B4SOIwdvtp0 = 0.0; - if (!model->B4SOIwdvtp1Given) /* v4.0 for Vth */ + if (!model->B4SOIwdvtp1Given) /* v4.0 for Vth */ model->B4SOIwdvtp1 = 0.0; - if (!model->B4SOIwdvtp2Given) /* v4.1 for Vth */ + if (!model->B4SOIwdvtp2Given) /* v4.1 for Vth */ model->B4SOIwdvtp2 = 0.0; - if (!model->B4SOIwdvtp3Given) /* v4.1 for Vth */ + if (!model->B4SOIwdvtp3Given) /* v4.1 for Vth */ model->B4SOIwdvtp3 = 0.0; - if (!model->B4SOIwdvtp4Given) /* v4.1 for Vth */ + if (!model->B4SOIwdvtp4Given) /* v4.1 for Vth */ model->B4SOIwdvtp4 = 0.0; - if (!model->B4SOIpdvtp0Given) /* v4.0 for Vth */ + if (!model->B4SOIpdvtp0Given) /* v4.0 for Vth */ model->B4SOIpdvtp0 = 0.0; - if (!model->B4SOIpdvtp1Given) /* v4.0 for Vth */ + if (!model->B4SOIpdvtp1Given) /* v4.0 for Vth */ model->B4SOIpdvtp1 = 0.0; - if (!model->B4SOIpdvtp2Given) /* v4.1 for Vth */ + if (!model->B4SOIpdvtp2Given) /* v4.1 for Vth */ model->B4SOIpdvtp2 = 0.0; - if (!model->B4SOIpdvtp3Given) /* v4.1 for Vth */ + if (!model->B4SOIpdvtp3Given) /* v4.1 for Vth */ model->B4SOIpdvtp3 = 0.0; - if (!model->B4SOIpdvtp4Given) /* v4.1 for Vth */ + if (!model->B4SOIpdvtp4Given) /* v4.1 for Vth */ model->B4SOIpdvtp4 = 0.0; - if (!model->B4SOIminvGiven) /* v4.0 for Vgsteff */ + if (!model->B4SOIminvGiven) /* v4.0 for Vgsteff */ model->B4SOIminv = 0.0; - if (!model->B4SOIlminvGiven) /* v4.0 for Vgsteff */ + if (!model->B4SOIlminvGiven) /* v4.0 for Vgsteff */ model->B4SOIlminv = 0.0; - if (!model->B4SOIwminvGiven) /* v4.0 for Vgsteff */ + if (!model->B4SOIwminvGiven) /* v4.0 for Vgsteff */ model->B4SOIwminv = 0.0; - if (!model->B4SOIpminvGiven) /* v4.0 for Vgsteff */ + if (!model->B4SOIpminvGiven) /* v4.0 for Vgsteff */ model->B4SOIpminv = 0.0; - if (!model->B4SOIfproutGiven) /* v4.0 for DITS in Id */ + if (!model->B4SOIfproutGiven) /* v4.0 for DITS in Id */ model->B4SOIfprout = 0.0; if (!model->B4SOIpditsGiven) model->B4SOIpdits = 1e-20; @@ -2053,12 +2060,12 @@ int nthreads; model->B4SOIlodeta0 = 1.0; /* stress effect end */ if (!model->B4SOIfdModGiven) - model->B4SOIfdMod = 0; + model->B4SOIfdMod = 0; if (!model->B4SOIvsceGiven) - model->B4SOIvsce = 0.0; + model->B4SOIvsce = 0.0; if (!model->B4SOIcdsbsGiven) model->B4SOIcdsbs = 0.0; - if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ + if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIminvcv = 0.0; if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIlminvcv = 0.0; @@ -2067,18 +2074,18 @@ int nthreads; if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIpminvcv = 0.0; if (!model->B4SOIvoffcvGiven) - /*model->B4SOIvoffcv = -0.08; v4.2 */ - model->B4SOIvoffcv = 0.0; + /*model->B4SOIvoffcv = -0.08; v4.2 */ + model->B4SOIvoffcv = 0.0; if (!model->B4SOIlvoffcvGiven) model->B4SOIlvoffcv = 0.0; if (!model->B4SOIwvoffcvGiven) model->B4SOIwvoffcv = 0.0; if (!model->B4SOIpvoffcvGiven) - model->B4SOIpvoffcv = 0.0; + model->B4SOIpvoffcv = 0.0; /* loop through all the instances of the model */ for (here = model->B4SOIinstances; here != NULL ; - here=here->B4SOInextInstance) - { /* allocate a chunk of the state vector */ + here=here->B4SOInextInstance) + { /* allocate a chunk of the state vector */ here->B4SOIstates = *states; *states += B4SOInumStates; /* perform the parameter defaulting */ @@ -2098,14 +2105,14 @@ int nthreads; here->B4SOIicVES = 0; if (!here->B4SOIicVPSGiven) here->B4SOIicVPS = 0; - if (!here->B4SOIbjtoffGiven) - here->B4SOIbjtoff = 0; - if (!here->B4SOIdebugModGiven) - here->B4SOIdebugMod = 0; - if (!here->B4SOIrth0Given) - here->B4SOIrth0 = model->B4SOIrth0; - if (!here->B4SOIcth0Given) - here->B4SOIcth0 = model->B4SOIcth0; + if (!here->B4SOIbjtoffGiven) + here->B4SOIbjtoff = 0; + if (!here->B4SOIdebugModGiven) + here->B4SOIdebugMod = 0; + if (!here->B4SOIrth0Given) + here->B4SOIrth0 = model->B4SOIrth0; + if (!here->B4SOIcth0Given) + here->B4SOIcth0 = model->B4SOIcth0; if (!here->B4SOIbodySquaresGiven) here->B4SOIbodySquares = 1.0; if (!here->B4SOIfrbodyGiven) @@ -2133,7 +2140,7 @@ int nthreads; here->B4SOIpsbcp = 0; if (!here->B4SOIagbcpGiven) here->B4SOIagbcp = 0; - if (!here->B4SOIagbcp2Given) + if (!here->B4SOIagbcp2Given) here->B4SOIagbcp2 = 0; /* v4.1 */ if (!here->B4SOIagbcpdGiven) here->B4SOIagbcpd = here->B4SOIagbcp; @@ -2145,53 +2152,74 @@ int nthreads; /* process drain series resistance */ - if ( ((model->B4SOIsheetResistance > 0.0) && + if ( ((model->B4SOIsheetResistance > 0.0) && (here->B4SOIdrainSquares > 0.0 ) && - (here->B4SOIdNodePrime == 0)) ) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"drain"); + (here->B4SOIdNodePrime == 0)) ) + { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"drain"); if(error) return(error); here->B4SOIdNodePrime = tmp->number; } - else - { here->B4SOIdNodePrime = here->B4SOIdNode; + else + { here->B4SOIdNodePrime = here->B4SOIdNode; } /* process source series resistance */ - if ( ((model->B4SOIsheetResistance > 0.0) && + if ( ((model->B4SOIsheetResistance > 0.0) && (here->B4SOIsourceSquares > 0.0 ) && - (here->B4SOIsNodePrime == 0)) ) - { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"source"); + (here->B4SOIsNodePrime == 0)) ) + { error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"source"); if(error) return(error); here->B4SOIsNodePrime = tmp->number; } - else - { here->B4SOIsNodePrime = here->B4SOIsNode; + else + { here->B4SOIsNodePrime = here->B4SOIsNode; } +/* v4.4 -- Check of TsiMax for SOIMOD = 2 */ + if (model->B4SOIsoiMod == 2){ + if (model->B4SOImtrlMod){ + NchMax = (model->B4SOIbg0sub - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOIetsi * model->B4SOIetsi); + if (model->B4SOInpeak > NchMax ){ + printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Etsi=%g m. \n ", model->B4SOInpeak, model->B4SOIetsi); + printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n"); + printf("Nch is set to %g cm^-3. \n",NchMax); + model->B4SOInpeak = NchMax; + } + } else { + NchMax = (1.12 - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOItsi * model->B4SOItsi); + if (model->B4SOInpeak > NchMax ) { + printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Tsi=%g m. \n", model->B4SOInpeak, model->B4SOItsi); + printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n"); + printf("Nch is set to %g cm^-3. \n",NchMax); + model->B4SOInpeak = NchMax; + } + } + } + /* process effective silicon film thickness */ model->B4SOIcbox = 3.453133e-11 / model->B4SOItbox; - if(model->B4SOImtrlMod) - { + if(model->B4SOImtrlMod) + { model->B4SOIcsi = 1.03594e-10 / model->B4SOIetsi; - } - else - { - model->B4SOIcsi = 1.03594e-10 / model->B4SOItsi; - } + } + else + { + model->B4SOIcsi = 1.03594e-10 / model->B4SOItsi; + } Cboxt = model->B4SOIcbox * model->B4SOIcsi / (model->B4SOIcbox + model->B4SOIcsi); /* v3.2 */ if(model->B4SOImtrlMod) - { + { Qsi = Charge_q * model->B4SOInpeak * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOIetsi; - } - else - { - Qsi = Charge_q * model->B4SOInpeak + } + else + { + Qsi = Charge_q * model->B4SOInpeak * (1.0 + model->B4SOIlpe0 / here->B4SOIl) * 1e6 * model->B4SOItsi; - } + } Vbs0t = 0.8 - 0.5 * Qsi / model->B4SOIcsi + model->B4SOIvbsa; if (!here->B4SOIsoiModGiven) @@ -2202,7 +2230,7 @@ int nthreads; printf("Warning: soiMod has been set to its global value %d.\n", model->B4SOIsoiMod); } - if (here->B4SOIsoiMod == 3) {/* auto selection */ + if (here->B4SOIsoiMod == 3) { /* auto selection */ if (Vbs0t > model->B4SOIvbs0fd) here->B4SOIsoiMod = 2; /* ideal FD mode */ else { @@ -2225,7 +2253,7 @@ int nthreads; error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"Body"); if (error) return(error); here->B4SOIbNode = tmp->number; - here->B4SOIpNode = 0; + here->B4SOIpNode = 0; here->B4SOIfloat = 1; here->B4SOIbodyMod = 0; @@ -2249,7 +2277,7 @@ int nthreads; } else { /* 6-node body tie, bNode has been assigned */ if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { + { printf("\n Warning: model parameter rbody=0!\n"); model->B4SOIrbody = 1e0; here->B4SOIbodyMod = 1; @@ -2266,7 +2294,7 @@ int nthreads; if (error) return(error); here->B4SOIbNode = tmp->number; here->B4SOItempNode = here->B4SOIpNode; - here->B4SOIpNode = 0; + here->B4SOIpNode = 0; here->B4SOIfloat = 1; here->B4SOIbodyMod = 0; } @@ -2288,7 +2316,7 @@ int nthreads; } else { /* 6 nodes & t-node */ if ((model->B4SOIrbody == 0.0) && (model->B4SOIrbsh == 0.0)) - { + { printf("\n Warning: model parameter rbody=0!\n"); model->B4SOIrbody = 1e0; here->B4SOIbodyMod = 1; @@ -2306,7 +2334,7 @@ int nthreads; if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0)) { if (here->B4SOItempNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"Temp"); + error = CKTmkVolt(ckt,&tmp,here->B4SOIname,"Temp"); if (error) return(error); here->B4SOItempNode = tmp->number; } @@ -2365,8 +2393,8 @@ int nthreads; printf("Warning: rbodyMod has been set to its global value %d. \n", model->B4SOIrbodyMod); } - if (here->B4SOIrbodyMod ==1 && here->B4SOIsoiMod == 2) /* v4.0 */ - here->B4SOIrbodyMod = 0; + if (here->B4SOIrbodyMod ==1 && here->B4SOIsoiMod == 2) /* v4.0 */ + here->B4SOIrbodyMod = 0; if (here->B4SOIrbodyMod == 1) { if (here->B4SOIdbNode == 0) @@ -2386,7 +2414,7 @@ int nthreads; /* v4.0 end */ - /* v4.0 added */ + /* v4.0 added */ if (!here->B4SOIsaGiven) /* stress */ here->B4SOIsa = 0.0; if (!here->B4SOIsbGiven) @@ -2402,7 +2430,7 @@ int nthreads; if (!here->B4SOIdelvtoGiven) here->B4SOIdelvto = 0.0; - /* v4.0 added end */ + /* v4.0 added end */ /* here for debugging purpose only */ @@ -2411,7 +2439,7 @@ int nthreads; /* The real Vbs value */ error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Vbs"); if(error) return(error); - here->B4SOIvbsNode = tmp->number; + here->B4SOIvbsNode = tmp->number; error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ids"); if(error) return(error); @@ -2428,11 +2456,11 @@ int nthreads; error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ibd"); if(error) return(error); here->B4SOIibdNode = tmp->number; - + error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Iii"); if(error) return(error); here->B4SOIiiiNode = tmp->number; - + error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ig"); if(error) return(error); here->B4SOIigNode = tmp->number; @@ -2440,11 +2468,11 @@ int nthreads; error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigg"); if(error) return(error); here->B4SOIgiggNode = tmp->number; - + error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigd"); if(error) return(error); here->B4SOIgigdNode = tmp->number; - + error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Gigb"); if(error) return(error); here->B4SOIgigbNode = tmp->number; @@ -2460,7 +2488,7 @@ int nthreads; error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Ibp"); if(error) return(error); here->B4SOIibpNode = tmp->number; - + error = CKTmkVolt(ckt, &tmp, here->B4SOIname, "Cbb"); if(error) return(error); here->B4SOIcbbNode = tmp->number; @@ -2493,7 +2521,7 @@ int nthreads; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } @@ -2518,19 +2546,19 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ /* v3.0 */ if (here->B4SOIsoiMod != 0) { /* v3.2 */ - TSTALLOC(B4SOITempePtr, B4SOItempNode, B4SOIeNode) + TSTALLOC(B4SOITempePtr, B4SOItempNode, B4SOIeNode) } } if (here->B4SOIbodyMod == 2) { /* Don't create any Jacobian entry for pNode */ } - else if (here->B4SOIbodyMod == 1) { + else if (here->B4SOIbodyMod == 1) { TSTALLOC(B4SOIBpPtr, B4SOIbNode, B4SOIpNode) TSTALLOC(B4SOIPbPtr, B4SOIpNode, B4SOIbNode) TSTALLOC(B4SOIPpPtr, B4SOIpNode, B4SOIpNode) - /* 4.1 for Igb2_agbcp2 */ + /* 4.1 for Igb2_agbcp2 */ TSTALLOC(B4SOIPgPtr , B4SOIpNode, B4SOIgNode) TSTALLOC(B4SOIGpPtr , B4SOIgNode, B4SOIpNode) } @@ -2543,7 +2571,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B4SOIGgePtr, B4SOIgNode, B4SOIgNodeExt) TSTALLOC(B4SOIGEdpPtr, B4SOIgNodeExt, B4SOIdNodePrime) TSTALLOC(B4SOIGEspPtr, B4SOIgNodeExt, B4SOIsNodePrime) - if (here->B4SOIsoiMod !=2) /* v3.2 */ + if (here->B4SOIsoiMod !=2) /* v3.2 */ TSTALLOC(B4SOIGEbPtr, B4SOIgNodeExt, B4SOIbNode) TSTALLOC(B4SOIGMdpPtr, B4SOIgNodeMid, B4SOIdNodePrime) @@ -2551,7 +2579,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B4SOIGMgmPtr, B4SOIgNodeMid, B4SOIgNodeMid) TSTALLOC(B4SOIGMgePtr, B4SOIgNodeMid, B4SOIgNodeExt) TSTALLOC(B4SOIGMspPtr, B4SOIgNodeMid, B4SOIsNodePrime) - if (here->B4SOIsoiMod !=2) /* v3.2 */ + if (here->B4SOIsoiMod !=2) /* v3.2 */ TSTALLOC(B4SOIGMbPtr, B4SOIgNodeMid, B4SOIbNode) TSTALLOC(B4SOIGMePtr, B4SOIgNodeMid, B4SOIeNode) @@ -2560,7 +2588,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B4SOIGEgmPtr, B4SOIgNodeExt, B4SOIgNodeMid) TSTALLOC(B4SOISPgmPtr, B4SOIsNodePrime, B4SOIgNodeMid) TSTALLOC(B4SOIEgmPtr, B4SOIeNode, B4SOIgNodeMid) - } + } /* v3.1 added for RF end */ @@ -2632,10 +2660,10 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B4SOIDspPtr, B4SOIdNode, B4SOIsNodePrime) TSTALLOC(B4SOISdpPtr, B4SOIsNode, B4SOIdNodePrime) TSTALLOC(B4SOISgPtr, B4SOIsNode, B4SOIgNode) - if (model->B4SOIsoiMod != 2) { - TSTALLOC(B4SOIDbPtr, B4SOIdNode, B4SOIbNode) - TSTALLOC(B4SOISbPtr, B4SOIsNode, B4SOIbNode) - } + if (model->B4SOIsoiMod != 2) { + TSTALLOC(B4SOIDbPtr, B4SOIdNode, B4SOIbNode) + TSTALLOC(B4SOISbPtr, B4SOIsNode, B4SOIbNode) + } } @@ -2644,7 +2672,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ /* here for debugging purpose only */ if (here->B4SOIdebugMod != 0) { - TSTALLOC(B4SOIVbsPtr, B4SOIvbsNode, B4SOIvbsNode) + TSTALLOC(B4SOIVbsPtr, B4SOIvbsNode, B4SOIvbsNode) TSTALLOC(B4SOIIdsPtr, B4SOIidsNode, B4SOIidsNode) TSTALLOC(B4SOIIcPtr, B4SOIicNode, B4SOIicNode) TSTALLOC(B4SOIIbsPtr, B4SOIibsNode, B4SOIibsNode) @@ -2712,7 +2740,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ #endif return(OK); -} +} int B4SOIunsetup( @@ -2722,7 +2750,7 @@ B4SOIunsetup( #ifndef HAS_BATCHSIM B4SOImodel *model; B4SOIinstance *here; - + for (model = (B4SOImodel *)inModel; model != NULL; model = model->B4SOInextModel) { diff --git a/src/spicelib/devices/bsim3soi/b4soitemp.c b/src/spicelib/devices/bsim3soi/b4soitemp.c index a4de69294..4528dd75a 100644 --- a/src/spicelib/devices/bsim3soi/b4soitemp.c +++ b/src/spicelib/devices/bsim3soi/b4soitemp.c @@ -1,4 +1,5 @@ -/*** B4SOI 05/14/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,7 +12,8 @@ * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Tanvir Morshed 09/22/2009 * Modified by Tanvir Morshed 12/31/2009 - * Modified by Tanvir Morshed 05/14/2010 + * Modified by Tanvir Morshed 05/14/2010 + * Modified by Tanvir Morshed 12/16/2010 **********/ /* Lmin, Lmax, Wmin, Wmax */ @@ -39,15 +41,14 @@ #define DELTA 1.0E-9 #define DEXP(A,B) { \ if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ + B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ + B = MIN_EXPL; \ } else { \ - B = exp(A); \ + B = exp(A); \ } \ } - -int + int B4SOItemp( GENmodel *inModel, CKTcircuit *ckt) @@ -73,1280 +74,1281 @@ B4SOItemp( double niter,toxpf,toxpi, Tcen; double n0; double eggdep, agbc2n, agbc2p, bgbc2n, bgbc2p, sqrt2qeps; /* v4.3.1 bugfix for mtrlMod=1 -Tanvir */ - + /* v2.0 release */ double tmp3, T7; /*4.1*/ double epsrox, toxe, epssub; - + /* loop through all the B4SOI device models */ for (; model != NULL; model = model->B4SOInextModel) { Temp = ckt->CKTtemp; - if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctSPotential = 0.1; - if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctDPotential = 0.1; - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ + model->B4SOIGatesidewallJctSPotential = 0.1; + if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ + model->B4SOIGatesidewallJctDPotential = 0.1; + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; - Tnom = model->B4SOItnom; - TempRatio = Temp / Tnom; + Tnom = model->B4SOItnom; + TempRatio = Temp / Tnom; - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - sqrt2qeps = sqrt(2.0 * 1.0e6 * Charge_q * epssub); /* bugfix 4.3.1 */ + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + sqrt2qeps = sqrt(2.0 * 1.0e6 * Charge_q * epssub); /* bugfix 4.3.1 */ /* bugfix v4.3.1 following constants should be replaced with model params -Tanvir */ - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - eggdep = 1.12; - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; + agbc2n = 3.42537e-7; + agbc2p = 4.97232e-7; + bgbc2n = 1.16645e12; + bgbc2p = 7.45669e11; + eggdep = 1.12; + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; sqrt2qeps = 5.753e-12; /* constant from v4.3.0 and earlier */ /* bugfix v4.3.1 following constants are valid for mtrlMod=0 -Tanvir */ - agbc2n = 3.42537e-7; - agbc2p = 4.97232e-7; - bgbc2n = 1.16645e12; - bgbc2p = 7.45669e11; - eggdep = 1.12; - } + agbc2n = 3.42537e-7; + agbc2p = 4.97232e-7; + bgbc2n = 1.16645e12; + bgbc2p = 7.45669e11; + eggdep = 1.12; + } + + /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ + + model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + if(model->B4SOImtrlMod == 0) + model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); + else + model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ + + if (model->B4SOImtrlMod==0) + { + Vtm0 = KboQ * Tnom; + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + model->B4SOIeg0 = Eg0; + model->B4SOIvtm = KboQ * Temp; + + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ + /* ni is in cm^-3 */ + ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) + * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); + } + else + { Vtm0 = KboQ * Tnom; + Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom + / (Tnom + model->B4SOItbgbsub); + model->B4SOIeg0 = Eg0; + model->B4SOIvtm = KboQ * Temp; + Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp + / (Temp + model->B4SOItbgbsub); + model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ + ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) + * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); - /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ + } - model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - if(model->B4SOImtrlMod == 0) - model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); - else - model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->B4SOIinstances; here != NULL; + here = here->B4SOInextInstance) + { + if (here->B4SOIowner != ARCHme) continue; + here->B4SOIrbodyext = here->B4SOIbodySquares * + model->B4SOIrbsh; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { + if ((here->B4SOIl == pSizeDependParamKnot->Length) + && (here->B4SOIw == pSizeDependParamKnot->Width) + && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) + && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) + && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ + { Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /* v2.2.3 bug fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } + } - if (model->B4SOImtrlMod==0) - { - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; + if (Size_Not_Found) + { pParam = (struct b4soiSizeDependParam *)malloc( + sizeof(struct b4soiSizeDependParam)); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); - } - else - { Vtm0 = KboQ * Tnom; - Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom - / (Tnom + model->B4SOItbgbsub); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; - Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp - / (Temp + model->B4SOItbgbsub); - model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ - ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) - * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); + Ldrn = here->B4SOIl; + Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ + pParam->Length = here->B4SOIl; + pParam->Width = here->B4SOIw; + pParam->NFinger = here->B4SOInf; /* v4.0 */ + pParam->Rth0 = here->B4SOIrth0; + pParam->Cth0 = here->B4SOIcth0; + + T0 = pow(Ldrn, model->B4SOILln); + T1 = pow(Wdrn, model->B4SOILwn); + tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 + + model->B4SOILwl / (T0 * T1); + pParam->B4SOIdl = model->B4SOILint + tmp1; + + /* v2.2.3 */ + tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 + + model->B4SOILwlc / (T0 * T1); + pParam->B4SOIdlc = model->B4SOIdlc + tmp1; + + /* v3.0 */ + pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; - } + T2 = pow(Ldrn, model->B4SOIWln); + T3 = pow(Wdrn, model->B4SOIWwn); + tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 + + model->B4SOIWwl / (T2 * T3); + pParam->B4SOIdw = model->B4SOIWint + tmp2; - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->B4SOIinstances; here != NULL; - here = here->B4SOInextInstance) - { - here->B4SOIrbodyext = here->B4SOIbodySquares * - model->B4SOIrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { - if ((here->B4SOIl == pSizeDependParamKnot->Length) - && (here->B4SOIw == pSizeDependParamKnot->Width) - && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) - && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) - && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /* v2.2.3 bug fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = TMALLOC(struct b4soiSizeDependParam, 1); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B4SOIl; - Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ - pParam->Length = here->B4SOIl; - pParam->Width = here->B4SOIw; - pParam->NFinger = here->B4SOInf; /* v4.0 */ - pParam->Rth0 = here->B4SOIrth0; - pParam->Cth0 = here->B4SOIcth0; - - T0 = pow(Ldrn, model->B4SOILln); - T1 = pow(Wdrn, model->B4SOILwn); - tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 - + model->B4SOILwl / (T0 * T1); - pParam->B4SOIdl = model->B4SOILint + tmp1; - - /* v2.2.3 */ - tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 - + model->B4SOILwlc / (T0 * T1); - pParam->B4SOIdlc = model->B4SOIdlc + tmp1; - - /* v3.0 */ - pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; + /* v2.2.3 */ + tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 + + model->B4SOIWwlc / (T2 * T3); + pParam->B4SOIdwc = model->B4SOIdwc + tmp2; - T2 = pow(Ldrn, model->B4SOIWln); - T3 = pow(Wdrn, model->B4SOIWwn); - tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 - + model->B4SOIWwl / (T2 * T3); - pParam->B4SOIdw = model->B4SOIWint + tmp2; + pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; + if (pParam->B4SOIleff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return(E_BADPARM); + } - /* v2.2.3 */ - tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 - + model->B4SOIWwlc / (T2 * T3); - pParam->B4SOIdwc = model->B4SOIdwc + tmp2; + pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ + - here->B4SOInbc * model->B4SOIdwbc + - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; + if (pParam->B4SOIweff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg + + here->B4SOIpdbcp; + pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg + + here->B4SOIpsbcp; + + pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; + if (pParam->B4SOIleffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ + - here->B4SOInbc * model->B4SOIdwbc + - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; + if (pParam->B4SOIweffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg + + here->B4SOIpdbcp; + pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg + + here->B4SOIpsbcp; + + pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc + - model->B4SOIdlcb; + if (pParam->B4SOIleffCVb <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; + if (pParam->B4SOIleffCVbg <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", + namarray); + return(E_BADPARM); + } - pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; - if (pParam->B4SOIleff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length <= 0", - namarray); - return(E_BADPARM); - } + /* Not binned - START */ + pParam->B4SOIgamma1 = model->B4SOIgamma1; + pParam->B4SOIgamma2 = model->B4SOIgamma2; + pParam->B4SOIvbx = model->B4SOIvbx; + pParam->B4SOIvbm = model->B4SOIvbm; + pParam->B4SOIxt = model->B4SOIxt; + /* Not binned - END */ - pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; - if (pParam->B4SOIweff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width <= 0", - namarray); - return(E_BADPARM); - } + /* CV model */ + pParam->B4SOIcf = model->B4SOIcf; + pParam->B4SOIclc = model->B4SOIclc; + pParam->B4SOIcle = model->B4SOIcle; - pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpsbcp; + pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc + / pParam->B4SOIleff), + pParam->B4SOIcle); - pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; - if (pParam->B4SOIleffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; - if (pParam->B4SOIweffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpsbcp; - - pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc - - model->B4SOIdlcb; - if (pParam->B4SOIleffCVb <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; - if (pParam->B4SOIleffCVbg <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", - namarray); - return(E_BADPARM); - } - - - /* Not binned - START */ - pParam->B4SOIgamma1 = model->B4SOIgamma1; - pParam->B4SOIgamma2 = model->B4SOIgamma2; - pParam->B4SOIvbx = model->B4SOIvbx; - pParam->B4SOIvbm = model->B4SOIvbm; - pParam->B4SOIxt = model->B4SOIxt; - /* Not binned - END */ - - /* CV model */ - pParam->B4SOIcf = model->B4SOIcf; - pParam->B4SOIclc = model->B4SOIclc; - pParam->B4SOIcle = model->B4SOIcle; - - pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc - / pParam->B4SOIleff), - pParam->B4SOIcle); - - /* Added for binning - START */ - if (model->B4SOIbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B4SOIleff; - Inv_W = 1.0e-6 / pParam->B4SOIweff; - Inv_LW = 1.0e-12 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - else - { Inv_L = 1.0 / pParam->B4SOIleff; - Inv_W = 1.0 / pParam->B4SOIweff; - Inv_LW = 1.0 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - pParam->B4SOInpeak = model->B4SOInpeak - + model->B4SOIlnpeak * Inv_L - + model->B4SOIwnpeak * Inv_W - + model->B4SOIpnpeak * Inv_LW; - pParam->B4SOInsub = model->B4SOInsub - + model->B4SOIlnsub * Inv_L - + model->B4SOIwnsub * Inv_W - + model->B4SOIpnsub * Inv_LW; - pParam->B4SOIngate = model->B4SOIngate - + model->B4SOIlngate * Inv_L - + model->B4SOIwngate * Inv_W - + model->B4SOIpngate * Inv_LW; - /*4.1*/ - pParam->B4SOInsd = model->B4SOInsd - + model->B4SOIlnsd * Inv_L - + model->B4SOIwnsd * Inv_W - + model->B4SOIpnsd * Inv_LW; + /* Added for binning - START */ + if (model->B4SOIbinUnit == 1) + { Inv_L = 1.0e-6 / pParam->B4SOIleff; + Inv_W = 1.0e-6 / pParam->B4SOIweff; + Inv_LW = 1.0e-12 / (pParam->B4SOIleff + * pParam->B4SOIweff); + } + else + { Inv_L = 1.0 / pParam->B4SOIleff; + Inv_W = 1.0 / pParam->B4SOIweff; + Inv_LW = 1.0 / (pParam->B4SOIleff + * pParam->B4SOIweff); + } + pParam->B4SOInpeak = model->B4SOInpeak + + model->B4SOIlnpeak * Inv_L + + model->B4SOIwnpeak * Inv_W + + model->B4SOIpnpeak * Inv_LW; + pParam->B4SOInsub = model->B4SOInsub + + model->B4SOIlnsub * Inv_L + + model->B4SOIwnsub * Inv_W + + model->B4SOIpnsub * Inv_LW; + pParam->B4SOIngate = model->B4SOIngate + + model->B4SOIlngate * Inv_L + + model->B4SOIwngate * Inv_W + + model->B4SOIpngate * Inv_LW; + /*4.1*/ + pParam->B4SOInsd = model->B4SOInsd + + model->B4SOIlnsd * Inv_L + + model->B4SOIwnsd * Inv_W + + model->B4SOIpnsd * Inv_LW; - pParam->B4SOIvth0 = model->B4SOIvth0 - + model->B4SOIlvth0 * Inv_L - + model->B4SOIwvth0 * Inv_W - + model->B4SOIpvth0 * Inv_LW; - pParam->B4SOIvfb = model->B4SOIvfb - + model->B4SOIlvfb * Inv_L - + model->B4SOIwvfb * Inv_W - + model->B4SOIpvfb * Inv_LW; /* v4.1 */ - pParam->B4SOIk1 = model->B4SOIk1 - + model->B4SOIlk1 * Inv_L - + model->B4SOIwk1 * Inv_W - + model->B4SOIpk1 * Inv_LW; - pParam->B4SOIk2 = model->B4SOIk2 - + model->B4SOIlk2 * Inv_L - + model->B4SOIwk2 * Inv_W - + model->B4SOIpk2 * Inv_LW; - pParam->B4SOIk1w1 = model->B4SOIk1w1 - + model->B4SOIlk1w1 * Inv_L - + model->B4SOIwk1w1 * Inv_W - + model->B4SOIpk1w1 * Inv_LW; - pParam->B4SOIk1w2 = model->B4SOIk1w2 - + model->B4SOIlk1w2 * Inv_L - + model->B4SOIwk1w2 * Inv_W - + model->B4SOIpk1w2 * Inv_LW; - pParam->B4SOIk3 = model->B4SOIk3 - + model->B4SOIlk3 * Inv_L - + model->B4SOIwk3 * Inv_W - + model->B4SOIpk3 * Inv_LW; - pParam->B4SOIk3b = model->B4SOIk3b - + model->B4SOIlk3b * Inv_L - + model->B4SOIwk3b * Inv_W - + model->B4SOIpk3b * Inv_LW; - pParam->B4SOIkb1 = model->B4SOIkb1 - + model->B4SOIlkb1 * Inv_L - + model->B4SOIwkb1 * Inv_W - + model->B4SOIpkb1 * Inv_LW; - pParam->B4SOIw0 = model->B4SOIw0 - + model->B4SOIlw0 * Inv_L - + model->B4SOIww0 * Inv_W - + model->B4SOIpw0 * Inv_LW; - pParam->B4SOIlpe0 = model->B4SOIlpe0 - + model->B4SOIllpe0 * Inv_L - + model->B4SOIwlpe0 * Inv_W - + model->B4SOIplpe0 * Inv_LW; - pParam->B4SOIlpeb = model->B4SOIlpeb - + model->B4SOIllpeb * Inv_L - + model->B4SOIwlpeb * Inv_W - + model->B4SOIplpeb * Inv_LW; /* v4.0 */ - pParam->B4SOIdvt0 = model->B4SOIdvt0 - + model->B4SOIldvt0 * Inv_L - + model->B4SOIwdvt0 * Inv_W - + model->B4SOIpdvt0 * Inv_LW; - pParam->B4SOIdvt1 = model->B4SOIdvt1 - + model->B4SOIldvt1 * Inv_L - + model->B4SOIwdvt1 * Inv_W - + model->B4SOIpdvt1 * Inv_LW; - pParam->B4SOIdvt2 = model->B4SOIdvt2 - + model->B4SOIldvt2 * Inv_L - + model->B4SOIwdvt2 * Inv_W - + model->B4SOIpdvt2 * Inv_LW; - pParam->B4SOIdvt0w = model->B4SOIdvt0w - + model->B4SOIldvt0w * Inv_L - + model->B4SOIwdvt0w * Inv_W - + model->B4SOIpdvt0w * Inv_LW; - pParam->B4SOIdvt1w = model->B4SOIdvt1w - + model->B4SOIldvt1w * Inv_L - + model->B4SOIwdvt1w * Inv_W - + model->B4SOIpdvt1w * Inv_LW; - pParam->B4SOIdvt2w = model->B4SOIdvt2w - + model->B4SOIldvt2w * Inv_L - + model->B4SOIwdvt2w * Inv_W - + model->B4SOIpdvt2w * Inv_LW; - pParam->B4SOIu0 = model->B4SOIu0 - + model->B4SOIlu0 * Inv_L - + model->B4SOIwu0 * Inv_W - + model->B4SOIpu0 * Inv_LW; - pParam->B4SOIua = model->B4SOIua - + model->B4SOIlua * Inv_L - + model->B4SOIwua * Inv_W - + model->B4SOIpua * Inv_LW; - pParam->B4SOIub = model->B4SOIub - + model->B4SOIlub * Inv_L - + model->B4SOIwub * Inv_W - + model->B4SOIpub * Inv_LW; - pParam->B4SOIuc = model->B4SOIuc - + model->B4SOIluc * Inv_L - + model->B4SOIwuc * Inv_W - + model->B4SOIpuc * Inv_LW; - pParam->B4SOIvsat = model->B4SOIvsat - + model->B4SOIlvsat * Inv_L - + model->B4SOIwvsat * Inv_W - + model->B4SOIpvsat * Inv_LW; - pParam->B4SOIa0 = model->B4SOIa0 - + model->B4SOIla0 * Inv_L - + model->B4SOIwa0 * Inv_W - + model->B4SOIpa0 * Inv_LW; - pParam->B4SOIags = model->B4SOIags - + model->B4SOIlags * Inv_L - + model->B4SOIwags * Inv_W - + model->B4SOIpags * Inv_LW; - pParam->B4SOIb0 = model->B4SOIb0 - + model->B4SOIlb0 * Inv_L - + model->B4SOIwb0 * Inv_W - + model->B4SOIpb0 * Inv_LW; - pParam->B4SOIb1 = model->B4SOIb1 - + model->B4SOIlb1 * Inv_L - + model->B4SOIwb1 * Inv_W - + model->B4SOIpb1 * Inv_LW; - pParam->B4SOIketa = model->B4SOIketa - + model->B4SOIlketa * Inv_L - + model->B4SOIwketa * Inv_W - + model->B4SOIpketa * Inv_LW; - pParam->B4SOIketas = model->B4SOIketas - + model->B4SOIlketas * Inv_L - + model->B4SOIwketas * Inv_W - + model->B4SOIpketas * Inv_LW; - pParam->B4SOIa1 = model->B4SOIa1 - + model->B4SOIla1 * Inv_L - + model->B4SOIwa1 * Inv_W - + model->B4SOIpa1 * Inv_LW; - pParam->B4SOIa2 = model->B4SOIa2 - + model->B4SOIla2 * Inv_L - + model->B4SOIwa2 * Inv_W - + model->B4SOIpa2 * Inv_LW; - pParam->B4SOIrdsw = model->B4SOIrdsw - + model->B4SOIlrdsw * Inv_L - + model->B4SOIwrdsw * Inv_W - + model->B4SOIprdsw * Inv_LW; - pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ - + model->B4SOIlrsw * Inv_L - + model->B4SOIwrsw * Inv_W - + model->B4SOIprsw * Inv_LW; - pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ - + model->B4SOIlrdw * Inv_L - + model->B4SOIwrdw * Inv_W - + model->B4SOIprdw * Inv_LW; - pParam->B4SOIprwb = model->B4SOIprwb - + model->B4SOIlprwb * Inv_L - + model->B4SOIwprwb * Inv_W - + model->B4SOIpprwb * Inv_LW; - pParam->B4SOIprwg = model->B4SOIprwg - + model->B4SOIlprwg * Inv_L - + model->B4SOIwprwg * Inv_W - + model->B4SOIpprwg * Inv_LW; - pParam->B4SOIwr = model->B4SOIwr - + model->B4SOIlwr * Inv_L - + model->B4SOIwwr * Inv_W - + model->B4SOIpwr * Inv_LW; - pParam->B4SOInfactor = model->B4SOInfactor - + model->B4SOIlnfactor * Inv_L - + model->B4SOIwnfactor * Inv_W - + model->B4SOIpnfactor * Inv_LW; - pParam->B4SOIdwg = model->B4SOIdwg - + model->B4SOIldwg * Inv_L - + model->B4SOIwdwg * Inv_W - + model->B4SOIpdwg * Inv_LW; - pParam->B4SOIdwb = model->B4SOIdwb - + model->B4SOIldwb * Inv_L - + model->B4SOIwdwb * Inv_W - + model->B4SOIpdwb * Inv_LW; - pParam->B4SOIvoff = model->B4SOIvoff - + model->B4SOIlvoff * Inv_L - + model->B4SOIwvoff * Inv_W - + model->B4SOIpvoff * Inv_LW; - pParam->B4SOIeta0 = model->B4SOIeta0 - + model->B4SOIleta0 * Inv_L - + model->B4SOIweta0 * Inv_W - + model->B4SOIpeta0 * Inv_LW; - pParam->B4SOIetab = model->B4SOIetab - + model->B4SOIletab * Inv_L - + model->B4SOIwetab * Inv_W - + model->B4SOIpetab * Inv_LW; - pParam->B4SOIdsub = model->B4SOIdsub - + model->B4SOIldsub * Inv_L - + model->B4SOIwdsub * Inv_W - + model->B4SOIpdsub * Inv_LW; - pParam->B4SOIcit = model->B4SOIcit - + model->B4SOIlcit * Inv_L - + model->B4SOIwcit * Inv_W - + model->B4SOIpcit * Inv_LW; - pParam->B4SOIcdsc = model->B4SOIcdsc - + model->B4SOIlcdsc * Inv_L - + model->B4SOIwcdsc * Inv_W - + model->B4SOIpcdsc * Inv_LW; - pParam->B4SOIcdscb = model->B4SOIcdscb - + model->B4SOIlcdscb * Inv_L - + model->B4SOIwcdscb * Inv_W - + model->B4SOIpcdscb * Inv_LW; - pParam->B4SOIcdscd = model->B4SOIcdscd - + model->B4SOIlcdscd * Inv_L - + model->B4SOIwcdscd * Inv_W - + model->B4SOIpcdscd * Inv_LW; - pParam->B4SOIpclm = model->B4SOIpclm - + model->B4SOIlpclm * Inv_L - + model->B4SOIwpclm * Inv_W - + model->B4SOIppclm * Inv_LW; - pParam->B4SOIpdibl1 = model->B4SOIpdibl1 - + model->B4SOIlpdibl1 * Inv_L - + model->B4SOIwpdibl1 * Inv_W - + model->B4SOIppdibl1 * Inv_LW; - pParam->B4SOIpdibl2 = model->B4SOIpdibl2 - + model->B4SOIlpdibl2 * Inv_L - + model->B4SOIwpdibl2 * Inv_W - + model->B4SOIppdibl2 * Inv_LW; - pParam->B4SOIpdiblb = model->B4SOIpdiblb - + model->B4SOIlpdiblb * Inv_L - + model->B4SOIwpdiblb * Inv_W - + model->B4SOIppdiblb * Inv_LW; - pParam->B4SOIdrout = model->B4SOIdrout - + model->B4SOIldrout * Inv_L - + model->B4SOIwdrout * Inv_W - + model->B4SOIpdrout * Inv_LW; - pParam->B4SOIpvag = model->B4SOIpvag - + model->B4SOIlpvag * Inv_L - + model->B4SOIwpvag * Inv_W - + model->B4SOIppvag * Inv_LW; - pParam->B4SOIdelta = model->B4SOIdelta - + model->B4SOIldelta * Inv_L - + model->B4SOIwdelta * Inv_W - + model->B4SOIpdelta * Inv_LW; - pParam->B4SOIalpha0 = model->B4SOIalpha0 - + model->B4SOIlalpha0 * Inv_L - + model->B4SOIwalpha0 * Inv_W - + model->B4SOIpalpha0 * Inv_LW; - pParam->B4SOIfbjtii = model->B4SOIfbjtii - + model->B4SOIlfbjtii * Inv_L - + model->B4SOIwfbjtii * Inv_W - + model->B4SOIpfbjtii * Inv_LW; - /*4.1 Iii model*/ - pParam->B4SOIebjtii = model->B4SOIebjtii - + model->B4SOIlebjtii * Inv_L - + model->B4SOIwebjtii * Inv_W - + model->B4SOIpebjtii * Inv_LW; - pParam->B4SOIcbjtii = model->B4SOIcbjtii - + model->B4SOIlcbjtii * Inv_L - + model->B4SOIwcbjtii * Inv_W - + model->B4SOIpcbjtii * Inv_LW; - pParam->B4SOIvbci = model->B4SOIvbci - + model->B4SOIlvbci * Inv_L - + model->B4SOIwvbci * Inv_W - + model->B4SOIpvbci * Inv_LW; + pParam->B4SOIvth0 = model->B4SOIvth0 + + model->B4SOIlvth0 * Inv_L + + model->B4SOIwvth0 * Inv_W + + model->B4SOIpvth0 * Inv_LW; + pParam->B4SOIvfb = model->B4SOIvfb + + model->B4SOIlvfb * Inv_L + + model->B4SOIwvfb * Inv_W + + model->B4SOIpvfb * Inv_LW; /* v4.1 */ + pParam->B4SOIk1 = model->B4SOIk1 + + model->B4SOIlk1 * Inv_L + + model->B4SOIwk1 * Inv_W + + model->B4SOIpk1 * Inv_LW; + pParam->B4SOIk2 = model->B4SOIk2 + + model->B4SOIlk2 * Inv_L + + model->B4SOIwk2 * Inv_W + + model->B4SOIpk2 * Inv_LW; + pParam->B4SOIk1w1 = model->B4SOIk1w1 + + model->B4SOIlk1w1 * Inv_L + + model->B4SOIwk1w1 * Inv_W + + model->B4SOIpk1w1 * Inv_LW; + pParam->B4SOIk1w2 = model->B4SOIk1w2 + + model->B4SOIlk1w2 * Inv_L + + model->B4SOIwk1w2 * Inv_W + + model->B4SOIpk1w2 * Inv_LW; + pParam->B4SOIk3 = model->B4SOIk3 + + model->B4SOIlk3 * Inv_L + + model->B4SOIwk3 * Inv_W + + model->B4SOIpk3 * Inv_LW; + pParam->B4SOIk3b = model->B4SOIk3b + + model->B4SOIlk3b * Inv_L + + model->B4SOIwk3b * Inv_W + + model->B4SOIpk3b * Inv_LW; + pParam->B4SOIkb1 = model->B4SOIkb1 + + model->B4SOIlkb1 * Inv_L + + model->B4SOIwkb1 * Inv_W + + model->B4SOIpkb1 * Inv_LW; + pParam->B4SOIw0 = model->B4SOIw0 + + model->B4SOIlw0 * Inv_L + + model->B4SOIww0 * Inv_W + + model->B4SOIpw0 * Inv_LW; + pParam->B4SOIlpe0 = model->B4SOIlpe0 + + model->B4SOIllpe0 * Inv_L + + model->B4SOIwlpe0 * Inv_W + + model->B4SOIplpe0 * Inv_LW; + pParam->B4SOIlpeb = model->B4SOIlpeb + + model->B4SOIllpeb * Inv_L + + model->B4SOIwlpeb * Inv_W + + model->B4SOIplpeb * Inv_LW; /* v4.0 */ + pParam->B4SOIdvt0 = model->B4SOIdvt0 + + model->B4SOIldvt0 * Inv_L + + model->B4SOIwdvt0 * Inv_W + + model->B4SOIpdvt0 * Inv_LW; + pParam->B4SOIdvt1 = model->B4SOIdvt1 + + model->B4SOIldvt1 * Inv_L + + model->B4SOIwdvt1 * Inv_W + + model->B4SOIpdvt1 * Inv_LW; + pParam->B4SOIdvt2 = model->B4SOIdvt2 + + model->B4SOIldvt2 * Inv_L + + model->B4SOIwdvt2 * Inv_W + + model->B4SOIpdvt2 * Inv_LW; + pParam->B4SOIdvt0w = model->B4SOIdvt0w + + model->B4SOIldvt0w * Inv_L + + model->B4SOIwdvt0w * Inv_W + + model->B4SOIpdvt0w * Inv_LW; + pParam->B4SOIdvt1w = model->B4SOIdvt1w + + model->B4SOIldvt1w * Inv_L + + model->B4SOIwdvt1w * Inv_W + + model->B4SOIpdvt1w * Inv_LW; + pParam->B4SOIdvt2w = model->B4SOIdvt2w + + model->B4SOIldvt2w * Inv_L + + model->B4SOIwdvt2w * Inv_W + + model->B4SOIpdvt2w * Inv_LW; + pParam->B4SOIu0 = model->B4SOIu0 + + model->B4SOIlu0 * Inv_L + + model->B4SOIwu0 * Inv_W + + model->B4SOIpu0 * Inv_LW; + pParam->B4SOIua = model->B4SOIua + + model->B4SOIlua * Inv_L + + model->B4SOIwua * Inv_W + + model->B4SOIpua * Inv_LW; + pParam->B4SOIub = model->B4SOIub + + model->B4SOIlub * Inv_L + + model->B4SOIwub * Inv_W + + model->B4SOIpub * Inv_LW; + pParam->B4SOIuc = model->B4SOIuc + + model->B4SOIluc * Inv_L + + model->B4SOIwuc * Inv_W + + model->B4SOIpuc * Inv_LW; + pParam->B4SOIvsat = model->B4SOIvsat + + model->B4SOIlvsat * Inv_L + + model->B4SOIwvsat * Inv_W + + model->B4SOIpvsat * Inv_LW; + pParam->B4SOIa0 = model->B4SOIa0 + + model->B4SOIla0 * Inv_L + + model->B4SOIwa0 * Inv_W + + model->B4SOIpa0 * Inv_LW; + pParam->B4SOIags = model->B4SOIags + + model->B4SOIlags * Inv_L + + model->B4SOIwags * Inv_W + + model->B4SOIpags * Inv_LW; + pParam->B4SOIb0 = model->B4SOIb0 + + model->B4SOIlb0 * Inv_L + + model->B4SOIwb0 * Inv_W + + model->B4SOIpb0 * Inv_LW; + pParam->B4SOIb1 = model->B4SOIb1 + + model->B4SOIlb1 * Inv_L + + model->B4SOIwb1 * Inv_W + + model->B4SOIpb1 * Inv_LW; + pParam->B4SOIketa = model->B4SOIketa + + model->B4SOIlketa * Inv_L + + model->B4SOIwketa * Inv_W + + model->B4SOIpketa * Inv_LW; + pParam->B4SOIketas = model->B4SOIketas + + model->B4SOIlketas * Inv_L + + model->B4SOIwketas * Inv_W + + model->B4SOIpketas * Inv_LW; + pParam->B4SOIa1 = model->B4SOIa1 + + model->B4SOIla1 * Inv_L + + model->B4SOIwa1 * Inv_W + + model->B4SOIpa1 * Inv_LW; + pParam->B4SOIa2 = model->B4SOIa2 + + model->B4SOIla2 * Inv_L + + model->B4SOIwa2 * Inv_W + + model->B4SOIpa2 * Inv_LW; + pParam->B4SOIrdsw = model->B4SOIrdsw + + model->B4SOIlrdsw * Inv_L + + model->B4SOIwrdsw * Inv_W + + model->B4SOIprdsw * Inv_LW; + pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ + + model->B4SOIlrsw * Inv_L + + model->B4SOIwrsw * Inv_W + + model->B4SOIprsw * Inv_LW; + pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ + + model->B4SOIlrdw * Inv_L + + model->B4SOIwrdw * Inv_W + + model->B4SOIprdw * Inv_LW; + pParam->B4SOIprwb = model->B4SOIprwb + + model->B4SOIlprwb * Inv_L + + model->B4SOIwprwb * Inv_W + + model->B4SOIpprwb * Inv_LW; + pParam->B4SOIprwg = model->B4SOIprwg + + model->B4SOIlprwg * Inv_L + + model->B4SOIwprwg * Inv_W + + model->B4SOIpprwg * Inv_LW; + pParam->B4SOIwr = model->B4SOIwr + + model->B4SOIlwr * Inv_L + + model->B4SOIwwr * Inv_W + + model->B4SOIpwr * Inv_LW; + pParam->B4SOInfactor = model->B4SOInfactor + + model->B4SOIlnfactor * Inv_L + + model->B4SOIwnfactor * Inv_W + + model->B4SOIpnfactor * Inv_LW; + pParam->B4SOIdwg = model->B4SOIdwg + + model->B4SOIldwg * Inv_L + + model->B4SOIwdwg * Inv_W + + model->B4SOIpdwg * Inv_LW; + pParam->B4SOIdwb = model->B4SOIdwb + + model->B4SOIldwb * Inv_L + + model->B4SOIwdwb * Inv_W + + model->B4SOIpdwb * Inv_LW; + pParam->B4SOIvoff = model->B4SOIvoff + + model->B4SOIlvoff * Inv_L + + model->B4SOIwvoff * Inv_W + + model->B4SOIpvoff * Inv_LW; + pParam->B4SOIeta0 = model->B4SOIeta0 + + model->B4SOIleta0 * Inv_L + + model->B4SOIweta0 * Inv_W + + model->B4SOIpeta0 * Inv_LW; + pParam->B4SOIetab = model->B4SOIetab + + model->B4SOIletab * Inv_L + + model->B4SOIwetab * Inv_W + + model->B4SOIpetab * Inv_LW; + pParam->B4SOIdsub = model->B4SOIdsub + + model->B4SOIldsub * Inv_L + + model->B4SOIwdsub * Inv_W + + model->B4SOIpdsub * Inv_LW; + pParam->B4SOIcit = model->B4SOIcit + + model->B4SOIlcit * Inv_L + + model->B4SOIwcit * Inv_W + + model->B4SOIpcit * Inv_LW; + pParam->B4SOIcdsc = model->B4SOIcdsc + + model->B4SOIlcdsc * Inv_L + + model->B4SOIwcdsc * Inv_W + + model->B4SOIpcdsc * Inv_LW; + pParam->B4SOIcdscb = model->B4SOIcdscb + + model->B4SOIlcdscb * Inv_L + + model->B4SOIwcdscb * Inv_W + + model->B4SOIpcdscb * Inv_LW; + pParam->B4SOIcdscd = model->B4SOIcdscd + + model->B4SOIlcdscd * Inv_L + + model->B4SOIwcdscd * Inv_W + + model->B4SOIpcdscd * Inv_LW; + pParam->B4SOIpclm = model->B4SOIpclm + + model->B4SOIlpclm * Inv_L + + model->B4SOIwpclm * Inv_W + + model->B4SOIppclm * Inv_LW; + pParam->B4SOIpdibl1 = model->B4SOIpdibl1 + + model->B4SOIlpdibl1 * Inv_L + + model->B4SOIwpdibl1 * Inv_W + + model->B4SOIppdibl1 * Inv_LW; + pParam->B4SOIpdibl2 = model->B4SOIpdibl2 + + model->B4SOIlpdibl2 * Inv_L + + model->B4SOIwpdibl2 * Inv_W + + model->B4SOIppdibl2 * Inv_LW; + pParam->B4SOIpdiblb = model->B4SOIpdiblb + + model->B4SOIlpdiblb * Inv_L + + model->B4SOIwpdiblb * Inv_W + + model->B4SOIppdiblb * Inv_LW; + pParam->B4SOIdrout = model->B4SOIdrout + + model->B4SOIldrout * Inv_L + + model->B4SOIwdrout * Inv_W + + model->B4SOIpdrout * Inv_LW; + pParam->B4SOIpvag = model->B4SOIpvag + + model->B4SOIlpvag * Inv_L + + model->B4SOIwpvag * Inv_W + + model->B4SOIppvag * Inv_LW; + pParam->B4SOIdelta = model->B4SOIdelta + + model->B4SOIldelta * Inv_L + + model->B4SOIwdelta * Inv_W + + model->B4SOIpdelta * Inv_LW; + pParam->B4SOIalpha0 = model->B4SOIalpha0 + + model->B4SOIlalpha0 * Inv_L + + model->B4SOIwalpha0 * Inv_W + + model->B4SOIpalpha0 * Inv_LW; + pParam->B4SOIfbjtii = model->B4SOIfbjtii + + model->B4SOIlfbjtii * Inv_L + + model->B4SOIwfbjtii * Inv_W + + model->B4SOIpfbjtii * Inv_LW; + /*4.1 Iii model*/ + pParam->B4SOIebjtii = model->B4SOIebjtii + + model->B4SOIlebjtii * Inv_L + + model->B4SOIwebjtii * Inv_W + + model->B4SOIpebjtii * Inv_LW; + pParam->B4SOIcbjtii = model->B4SOIcbjtii + + model->B4SOIlcbjtii * Inv_L + + model->B4SOIwcbjtii * Inv_W + + model->B4SOIpcbjtii * Inv_LW; + pParam->B4SOIvbci = model->B4SOIvbci + + model->B4SOIlvbci * Inv_L + + model->B4SOIwvbci * Inv_W + + model->B4SOIpvbci * Inv_LW; - pParam->B4SOIabjtii = model->B4SOIabjtii - + model->B4SOIlabjtii * Inv_L - + model->B4SOIwabjtii * Inv_W - + model->B4SOIpabjtii * Inv_LW; - pParam->B4SOImbjtii = model->B4SOImbjtii - + model->B4SOIlmbjtii * Inv_L - + model->B4SOIwmbjtii * Inv_W - + model->B4SOIpmbjtii * Inv_LW; + pParam->B4SOIabjtii = model->B4SOIabjtii + + model->B4SOIlabjtii * Inv_L + + model->B4SOIwabjtii * Inv_W + + model->B4SOIpabjtii * Inv_LW; + pParam->B4SOImbjtii = model->B4SOImbjtii + + model->B4SOIlmbjtii * Inv_L + + model->B4SOIwmbjtii * Inv_W + + model->B4SOIpmbjtii * Inv_LW; - pParam->B4SOIbeta0 = model->B4SOIbeta0 - + model->B4SOIlbeta0 * Inv_L - + model->B4SOIwbeta0 * Inv_W - + model->B4SOIpbeta0 * Inv_LW; - pParam->B4SOIbeta1 = model->B4SOIbeta1 - + model->B4SOIlbeta1 * Inv_L - + model->B4SOIwbeta1 * Inv_W - + model->B4SOIpbeta1 * Inv_LW; - pParam->B4SOIbeta2 = model->B4SOIbeta2 - + model->B4SOIlbeta2 * Inv_L - + model->B4SOIwbeta2 * Inv_W - + model->B4SOIpbeta2 * Inv_LW; - pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 - + model->B4SOIlvdsatii0 * Inv_L - + model->B4SOIwvdsatii0 * Inv_W - + model->B4SOIpvdsatii0 * Inv_LW; - pParam->B4SOIlii = model->B4SOIlii - + model->B4SOIllii * Inv_L - + model->B4SOIwlii * Inv_W - + model->B4SOIplii * Inv_LW; - pParam->B4SOIesatii = model->B4SOIesatii - + model->B4SOIlesatii * Inv_L - + model->B4SOIwesatii * Inv_W - + model->B4SOIpesatii * Inv_LW; - pParam->B4SOIsii0 = model->B4SOIsii0 - + model->B4SOIlsii0 * Inv_L - + model->B4SOIwsii0 * Inv_W - + model->B4SOIpsii0 * Inv_LW; - pParam->B4SOIsii1 = model->B4SOIsii1 - + model->B4SOIlsii1 * Inv_L - + model->B4SOIwsii1 * Inv_W - + model->B4SOIpsii1 * Inv_LW; - pParam->B4SOIsii2 = model->B4SOIsii2 - + model->B4SOIlsii2 * Inv_L - + model->B4SOIwsii2 * Inv_W - + model->B4SOIpsii2 * Inv_LW; - pParam->B4SOIsiid = model->B4SOIsiid - + model->B4SOIlsiid * Inv_L - + model->B4SOIwsiid * Inv_W - + model->B4SOIpsiid * Inv_LW; - pParam->B4SOIagidl = model->B4SOIagidl - + model->B4SOIlagidl * Inv_L - + model->B4SOIwagidl * Inv_W - + model->B4SOIpagidl * Inv_LW; - pParam->B4SOIbgidl = model->B4SOIbgidl - + model->B4SOIlbgidl * Inv_L - + model->B4SOIwbgidl * Inv_W - + model->B4SOIpbgidl * Inv_LW; - pParam->B4SOIcgidl = model->B4SOIcgidl - + model->B4SOIlcgidl * Inv_L - + model->B4SOIwcgidl * Inv_W - + model->B4SOIpcgidl * Inv_LW; - pParam->B4SOIegidl = model->B4SOIegidl - + model->B4SOIlegidl * Inv_L - + model->B4SOIwegidl * Inv_W - + model->B4SOIpegidl * Inv_LW; - pParam->B4SOIrgidl = model->B4SOIrgidl - + model->B4SOIlrgidl * Inv_L - + model->B4SOIwrgidl * Inv_W - + model->B4SOIprgidl * Inv_LW; - pParam->B4SOIkgidl = model->B4SOIkgidl - + model->B4SOIlkgidl * Inv_L - + model->B4SOIwkgidl * Inv_W - + model->B4SOIpkgidl * Inv_LW; - pParam->B4SOIfgidl = model->B4SOIfgidl - + model->B4SOIlfgidl * Inv_L - + model->B4SOIwfgidl * Inv_W - + model->B4SOIpfgidl * Inv_LW; - pParam->B4SOIagisl = model->B4SOIagisl - + model->B4SOIlagisl * Inv_L - + model->B4SOIwagisl * Inv_W - + model->B4SOIpagisl * Inv_LW; - pParam->B4SOIbgisl = model->B4SOIbgisl - + model->B4SOIlbgisl * Inv_L - + model->B4SOIwbgisl * Inv_W - + model->B4SOIpbgisl * Inv_LW; - pParam->B4SOIcgisl = model->B4SOIcgisl - + model->B4SOIlcgisl * Inv_L - + model->B4SOIwcgisl * Inv_W - + model->B4SOIpcgisl * Inv_LW; - pParam->B4SOIegisl = model->B4SOIegisl - + model->B4SOIlegisl * Inv_L - + model->B4SOIwegisl * Inv_W - + model->B4SOIpegisl * Inv_LW; - pParam->B4SOIrgisl = model->B4SOIrgisl - + model->B4SOIlrgisl * Inv_L - + model->B4SOIwrgisl * Inv_W - + model->B4SOIprgisl * Inv_LW; - pParam->B4SOIkgisl = model->B4SOIkgisl - + model->B4SOIlkgisl * Inv_L - + model->B4SOIwkgisl * Inv_W - + model->B4SOIpkgisl * Inv_LW; - pParam->B4SOIfgisl = model->B4SOIfgisl - + model->B4SOIlfgisl * Inv_L - + model->B4SOIwfgisl * Inv_W - + model->B4SOIpfgisl * Inv_LW; + pParam->B4SOIbeta0 = model->B4SOIbeta0 + + model->B4SOIlbeta0 * Inv_L + + model->B4SOIwbeta0 * Inv_W + + model->B4SOIpbeta0 * Inv_LW; + pParam->B4SOIbeta1 = model->B4SOIbeta1 + + model->B4SOIlbeta1 * Inv_L + + model->B4SOIwbeta1 * Inv_W + + model->B4SOIpbeta1 * Inv_LW; + pParam->B4SOIbeta2 = model->B4SOIbeta2 + + model->B4SOIlbeta2 * Inv_L + + model->B4SOIwbeta2 * Inv_W + + model->B4SOIpbeta2 * Inv_LW; + pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 + + model->B4SOIlvdsatii0 * Inv_L + + model->B4SOIwvdsatii0 * Inv_W + + model->B4SOIpvdsatii0 * Inv_LW; + pParam->B4SOIlii = model->B4SOIlii + + model->B4SOIllii * Inv_L + + model->B4SOIwlii * Inv_W + + model->B4SOIplii * Inv_LW; + pParam->B4SOIesatii = model->B4SOIesatii + + model->B4SOIlesatii * Inv_L + + model->B4SOIwesatii * Inv_W + + model->B4SOIpesatii * Inv_LW; + pParam->B4SOIsii0 = model->B4SOIsii0 + + model->B4SOIlsii0 * Inv_L + + model->B4SOIwsii0 * Inv_W + + model->B4SOIpsii0 * Inv_LW; + pParam->B4SOIsii1 = model->B4SOIsii1 + + model->B4SOIlsii1 * Inv_L + + model->B4SOIwsii1 * Inv_W + + model->B4SOIpsii1 * Inv_LW; + pParam->B4SOIsii2 = model->B4SOIsii2 + + model->B4SOIlsii2 * Inv_L + + model->B4SOIwsii2 * Inv_W + + model->B4SOIpsii2 * Inv_LW; + pParam->B4SOIsiid = model->B4SOIsiid + + model->B4SOIlsiid * Inv_L + + model->B4SOIwsiid * Inv_W + + model->B4SOIpsiid * Inv_LW; + pParam->B4SOIagidl = model->B4SOIagidl + + model->B4SOIlagidl * Inv_L + + model->B4SOIwagidl * Inv_W + + model->B4SOIpagidl * Inv_LW; + pParam->B4SOIbgidl = model->B4SOIbgidl + + model->B4SOIlbgidl * Inv_L + + model->B4SOIwbgidl * Inv_W + + model->B4SOIpbgidl * Inv_LW; + pParam->B4SOIcgidl = model->B4SOIcgidl + + model->B4SOIlcgidl * Inv_L + + model->B4SOIwcgidl * Inv_W + + model->B4SOIpcgidl * Inv_LW; + pParam->B4SOIegidl = model->B4SOIegidl + + model->B4SOIlegidl * Inv_L + + model->B4SOIwegidl * Inv_W + + model->B4SOIpegidl * Inv_LW; + pParam->B4SOIrgidl = model->B4SOIrgidl + + model->B4SOIlrgidl * Inv_L + + model->B4SOIwrgidl * Inv_W + + model->B4SOIprgidl * Inv_LW; + pParam->B4SOIkgidl = model->B4SOIkgidl + + model->B4SOIlkgidl * Inv_L + + model->B4SOIwkgidl * Inv_W + + model->B4SOIpkgidl * Inv_LW; + pParam->B4SOIfgidl = model->B4SOIfgidl + + model->B4SOIlfgidl * Inv_L + + model->B4SOIwfgidl * Inv_W + + model->B4SOIpfgidl * Inv_LW; + pParam->B4SOIagisl = model->B4SOIagisl + + model->B4SOIlagisl * Inv_L + + model->B4SOIwagisl * Inv_W + + model->B4SOIpagisl * Inv_LW; + pParam->B4SOIbgisl = model->B4SOIbgisl + + model->B4SOIlbgisl * Inv_L + + model->B4SOIwbgisl * Inv_W + + model->B4SOIpbgisl * Inv_LW; + pParam->B4SOIcgisl = model->B4SOIcgisl + + model->B4SOIlcgisl * Inv_L + + model->B4SOIwcgisl * Inv_W + + model->B4SOIpcgisl * Inv_LW; + pParam->B4SOIegisl = model->B4SOIegisl + + model->B4SOIlegisl * Inv_L + + model->B4SOIwegisl * Inv_W + + model->B4SOIpegisl * Inv_LW; + pParam->B4SOIrgisl = model->B4SOIrgisl + + model->B4SOIlrgisl * Inv_L + + model->B4SOIwrgisl * Inv_W + + model->B4SOIprgisl * Inv_LW; + pParam->B4SOIkgisl = model->B4SOIkgisl + + model->B4SOIlkgisl * Inv_L + + model->B4SOIwkgisl * Inv_W + + model->B4SOIpkgisl * Inv_LW; + pParam->B4SOIfgisl = model->B4SOIfgisl + + model->B4SOIlfgisl * Inv_L + + model->B4SOIwfgisl * Inv_W + + model->B4SOIpfgisl * Inv_LW; - pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ - + model->B4SOIlntun * Inv_L - + model->B4SOIwntun * Inv_W - + model->B4SOIpntun * Inv_LW; - pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ - + model->B4SOIlntund * Inv_L - + model->B4SOIwntund * Inv_W - + model->B4SOIpntund * Inv_LW; - pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ - + model->B4SOIlndiode * Inv_L - + model->B4SOIwndiode * Inv_W - + model->B4SOIpndiode * Inv_LW; - pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ - + model->B4SOIlndioded * Inv_L - + model->B4SOIwndioded * Inv_W - + model->B4SOIpndioded * Inv_LW; - pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ - + model->B4SOIlnrecf0 * Inv_L - + model->B4SOIwnrecf0 * Inv_W - + model->B4SOIpnrecf0 * Inv_LW; - pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ - + model->B4SOIlnrecf0d * Inv_L - + model->B4SOIwnrecf0d * Inv_W - + model->B4SOIpnrecf0d * Inv_LW; - pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ - + model->B4SOIlnrecr0 * Inv_L - + model->B4SOIwnrecr0 * Inv_W - + model->B4SOIpnrecr0 * Inv_LW; - pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ - + model->B4SOIlnrecr0d * Inv_L - + model->B4SOIwnrecr0d * Inv_W - + model->B4SOIpnrecr0d * Inv_LW; - pParam->B4SOIisbjt = model->B4SOIisbjt - + model->B4SOIlisbjt * Inv_L - + model->B4SOIwisbjt * Inv_W - + model->B4SOIpisbjt * Inv_LW; - pParam->B4SOIidbjt = model->B4SOIidbjt - + model->B4SOIlidbjt * Inv_L - + model->B4SOIwidbjt * Inv_W - + model->B4SOIpidbjt * Inv_LW; - pParam->B4SOIisdif = model->B4SOIisdif - + model->B4SOIlisdif * Inv_L - + model->B4SOIwisdif * Inv_W - + model->B4SOIpisdif * Inv_LW; - pParam->B4SOIiddif = model->B4SOIiddif - + model->B4SOIliddif * Inv_L - + model->B4SOIwiddif * Inv_W - + model->B4SOIpiddif * Inv_LW; - pParam->B4SOIisrec = model->B4SOIisrec - + model->B4SOIlisrec * Inv_L - + model->B4SOIwisrec * Inv_W - + model->B4SOIpisrec * Inv_LW; - pParam->B4SOIistun = model->B4SOIistun - + model->B4SOIlistun * Inv_L - + model->B4SOIwistun * Inv_W - + model->B4SOIpistun * Inv_LW; - pParam->B4SOIidrec = model->B4SOIidrec - + model->B4SOIlidrec * Inv_L - + model->B4SOIwidrec * Inv_W - + model->B4SOIpidrec * Inv_LW; - pParam->B4SOIidtun = model->B4SOIidtun - + model->B4SOIlidtun * Inv_L - + model->B4SOIwidtun * Inv_W - + model->B4SOIpidtun * Inv_LW; - pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ - + model->B4SOIlvrec0 * Inv_L - + model->B4SOIwvrec0 * Inv_W - + model->B4SOIpvrec0 * Inv_LW; - pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ - + model->B4SOIlvrec0d * Inv_L - + model->B4SOIwvrec0d * Inv_W - + model->B4SOIpvrec0d * Inv_LW; - pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ - + model->B4SOIlvtun0 * Inv_L - + model->B4SOIwvtun0 * Inv_W - + model->B4SOIpvtun0 * Inv_LW; - pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ - + model->B4SOIlvtun0d * Inv_L - + model->B4SOIwvtun0d * Inv_W - + model->B4SOIpvtun0d * Inv_LW; - pParam->B4SOInbjt = model->B4SOInbjt - + model->B4SOIlnbjt * Inv_L - + model->B4SOIwnbjt * Inv_W - + model->B4SOIpnbjt * Inv_LW; - pParam->B4SOIlbjt0 = model->B4SOIlbjt0 - + model->B4SOIllbjt0 * Inv_L - + model->B4SOIwlbjt0 * Inv_W - + model->B4SOIplbjt0 * Inv_LW; - pParam->B4SOIvabjt = model->B4SOIvabjt - + model->B4SOIlvabjt * Inv_L - + model->B4SOIwvabjt * Inv_W - + model->B4SOIpvabjt * Inv_LW; - pParam->B4SOIaely = model->B4SOIaely - + model->B4SOIlaely * Inv_L - + model->B4SOIwaely * Inv_W - + model->B4SOIpaely * Inv_LW; - pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ - + model->B4SOIlahli * Inv_L - + model->B4SOIwahli * Inv_W - + model->B4SOIpahli * Inv_LW; - pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ - + model->B4SOIlahlid * Inv_L - + model->B4SOIwahlid * Inv_W - + model->B4SOIpahlid * Inv_LW; + pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ + + model->B4SOIlntun * Inv_L + + model->B4SOIwntun * Inv_W + + model->B4SOIpntun * Inv_LW; + pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ + + model->B4SOIlntund * Inv_L + + model->B4SOIwntund * Inv_W + + model->B4SOIpntund * Inv_LW; + pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ + + model->B4SOIlndiode * Inv_L + + model->B4SOIwndiode * Inv_W + + model->B4SOIpndiode * Inv_LW; + pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ + + model->B4SOIlndioded * Inv_L + + model->B4SOIwndioded * Inv_W + + model->B4SOIpndioded * Inv_LW; + pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ + + model->B4SOIlnrecf0 * Inv_L + + model->B4SOIwnrecf0 * Inv_W + + model->B4SOIpnrecf0 * Inv_LW; + pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ + + model->B4SOIlnrecf0d * Inv_L + + model->B4SOIwnrecf0d * Inv_W + + model->B4SOIpnrecf0d * Inv_LW; + pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ + + model->B4SOIlnrecr0 * Inv_L + + model->B4SOIwnrecr0 * Inv_W + + model->B4SOIpnrecr0 * Inv_LW; + pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ + + model->B4SOIlnrecr0d * Inv_L + + model->B4SOIwnrecr0d * Inv_W + + model->B4SOIpnrecr0d * Inv_LW; + pParam->B4SOIisbjt = model->B4SOIisbjt + + model->B4SOIlisbjt * Inv_L + + model->B4SOIwisbjt * Inv_W + + model->B4SOIpisbjt * Inv_LW; + pParam->B4SOIidbjt = model->B4SOIidbjt + + model->B4SOIlidbjt * Inv_L + + model->B4SOIwidbjt * Inv_W + + model->B4SOIpidbjt * Inv_LW; + pParam->B4SOIisdif = model->B4SOIisdif + + model->B4SOIlisdif * Inv_L + + model->B4SOIwisdif * Inv_W + + model->B4SOIpisdif * Inv_LW; + pParam->B4SOIiddif = model->B4SOIiddif + + model->B4SOIliddif * Inv_L + + model->B4SOIwiddif * Inv_W + + model->B4SOIpiddif * Inv_LW; + pParam->B4SOIisrec = model->B4SOIisrec + + model->B4SOIlisrec * Inv_L + + model->B4SOIwisrec * Inv_W + + model->B4SOIpisrec * Inv_LW; + pParam->B4SOIistun = model->B4SOIistun + + model->B4SOIlistun * Inv_L + + model->B4SOIwistun * Inv_W + + model->B4SOIpistun * Inv_LW; + pParam->B4SOIidrec = model->B4SOIidrec + + model->B4SOIlidrec * Inv_L + + model->B4SOIwidrec * Inv_W + + model->B4SOIpidrec * Inv_LW; + pParam->B4SOIidtun = model->B4SOIidtun + + model->B4SOIlidtun * Inv_L + + model->B4SOIwidtun * Inv_W + + model->B4SOIpidtun * Inv_LW; + pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ + + model->B4SOIlvrec0 * Inv_L + + model->B4SOIwvrec0 * Inv_W + + model->B4SOIpvrec0 * Inv_LW; + pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ + + model->B4SOIlvrec0d * Inv_L + + model->B4SOIwvrec0d * Inv_W + + model->B4SOIpvrec0d * Inv_LW; + pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ + + model->B4SOIlvtun0 * Inv_L + + model->B4SOIwvtun0 * Inv_W + + model->B4SOIpvtun0 * Inv_LW; + pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ + + model->B4SOIlvtun0d * Inv_L + + model->B4SOIwvtun0d * Inv_W + + model->B4SOIpvtun0d * Inv_LW; + pParam->B4SOInbjt = model->B4SOInbjt + + model->B4SOIlnbjt * Inv_L + + model->B4SOIwnbjt * Inv_W + + model->B4SOIpnbjt * Inv_LW; + pParam->B4SOIlbjt0 = model->B4SOIlbjt0 + + model->B4SOIllbjt0 * Inv_L + + model->B4SOIwlbjt0 * Inv_W + + model->B4SOIplbjt0 * Inv_LW; + pParam->B4SOIvabjt = model->B4SOIvabjt + + model->B4SOIlvabjt * Inv_L + + model->B4SOIwvabjt * Inv_W + + model->B4SOIpvabjt * Inv_LW; + pParam->B4SOIaely = model->B4SOIaely + + model->B4SOIlaely * Inv_L + + model->B4SOIwaely * Inv_W + + model->B4SOIpaely * Inv_LW; + pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ + + model->B4SOIlahli * Inv_L + + model->B4SOIwahli * Inv_W + + model->B4SOIpahli * Inv_LW; + pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ + + model->B4SOIlahlid * Inv_L + + model->B4SOIwahlid * Inv_W + + model->B4SOIpahlid * Inv_LW; - /* v3.1 */ - pParam->B4SOIxj = model->B4SOIxj - + model->B4SOIlxj * Inv_L - + model->B4SOIwxj * Inv_W - + model->B4SOIpxj * Inv_LW; - pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 - + model->B4SOIlalphaGB1 * Inv_L - + model->B4SOIwalphaGB1 * Inv_W - + model->B4SOIpalphaGB1 * Inv_LW; - pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 - + model->B4SOIlalphaGB2 * Inv_L - + model->B4SOIwalphaGB2 * Inv_W - + model->B4SOIpalphaGB2 * Inv_LW; - pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 - + model->B4SOIlbetaGB1* Inv_L - + model->B4SOIwbetaGB1 * Inv_W - + model->B4SOIpbetaGB1 * Inv_LW; - pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 - + model->B4SOIlbetaGB2 * Inv_L - + model->B4SOIwbetaGB2 * Inv_W - + model->B4SOIpbetaGB2 * Inv_LW; - pParam->B4SOIndif = model->B4SOIndif - + model->B4SOIlndif * Inv_L - + model->B4SOIwndif * Inv_W - + model->B4SOIpndif * Inv_LW; - pParam->B4SOIntrecf = model->B4SOIntrecf - + model->B4SOIlntrecf* Inv_L - + model->B4SOIwntrecf * Inv_W - + model->B4SOIpntrecf * Inv_LW; - pParam->B4SOIntrecr = model->B4SOIntrecr - + model->B4SOIlntrecr * Inv_L - + model->B4SOIwntrecr * Inv_W - + model->B4SOIpntrecr * Inv_LW; - pParam->B4SOIxbjt = model->B4SOIxbjt - + model->B4SOIlxbjt * Inv_L - + model->B4SOIwxbjt * Inv_W - + model->B4SOIpxbjt * Inv_LW; - pParam->B4SOIxdif = model->B4SOIxdif - + model->B4SOIlxdif* Inv_L - + model->B4SOIwxdif * Inv_W - + model->B4SOIpxdif * Inv_LW; - pParam->B4SOIxrec = model->B4SOIxrec - + model->B4SOIlxrec * Inv_L - + model->B4SOIwxrec * Inv_W - + model->B4SOIpxrec * Inv_LW; - pParam->B4SOIxtun = model->B4SOIxtun - + model->B4SOIlxtun * Inv_L - + model->B4SOIwxtun * Inv_W - + model->B4SOIpxtun * Inv_LW; - pParam->B4SOIxdifd = model->B4SOIxdifd - + model->B4SOIlxdifd* Inv_L - + model->B4SOIwxdifd * Inv_W - + model->B4SOIpxdifd * Inv_LW; - pParam->B4SOIxrecd = model->B4SOIxrecd - + model->B4SOIlxrecd * Inv_L - + model->B4SOIwxrecd * Inv_W - + model->B4SOIpxrecd * Inv_LW; - pParam->B4SOIxtund = model->B4SOIxtund - + model->B4SOIlxtund * Inv_L - + model->B4SOIwxtund * Inv_W - + model->B4SOIpxtund * Inv_LW; - pParam->B4SOIcgdl = model->B4SOIcgdl - + model->B4SOIlcgdl * Inv_L - + model->B4SOIwcgdl * Inv_W - + model->B4SOIpcgdl * Inv_LW; - pParam->B4SOIcgsl = model->B4SOIcgsl - + model->B4SOIlcgsl * Inv_L - + model->B4SOIwcgsl * Inv_W - + model->B4SOIpcgsl * Inv_LW; - pParam->B4SOIckappa = model->B4SOIckappa - + model->B4SOIlckappa * Inv_L - + model->B4SOIwckappa * Inv_W - + model->B4SOIpckappa * Inv_LW; - pParam->B4SOIute = model->B4SOIute - + model->B4SOIlute * Inv_L - + model->B4SOIwute * Inv_W - + model->B4SOIpute * Inv_LW; + /* v3.1 */ + pParam->B4SOIxj = model->B4SOIxj + + model->B4SOIlxj * Inv_L + + model->B4SOIwxj * Inv_W + + model->B4SOIpxj * Inv_LW; + pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 + + model->B4SOIlalphaGB1 * Inv_L + + model->B4SOIwalphaGB1 * Inv_W + + model->B4SOIpalphaGB1 * Inv_LW; + pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 + + model->B4SOIlalphaGB2 * Inv_L + + model->B4SOIwalphaGB2 * Inv_W + + model->B4SOIpalphaGB2 * Inv_LW; + pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 + + model->B4SOIlbetaGB1* Inv_L + + model->B4SOIwbetaGB1 * Inv_W + + model->B4SOIpbetaGB1 * Inv_LW; + pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 + + model->B4SOIlbetaGB2 * Inv_L + + model->B4SOIwbetaGB2 * Inv_W + + model->B4SOIpbetaGB2 * Inv_LW; + pParam->B4SOIndif = model->B4SOIndif + + model->B4SOIlndif * Inv_L + + model->B4SOIwndif * Inv_W + + model->B4SOIpndif * Inv_LW; + pParam->B4SOIntrecf = model->B4SOIntrecf + + model->B4SOIlntrecf* Inv_L + + model->B4SOIwntrecf * Inv_W + + model->B4SOIpntrecf * Inv_LW; + pParam->B4SOIntrecr = model->B4SOIntrecr + + model->B4SOIlntrecr * Inv_L + + model->B4SOIwntrecr * Inv_W + + model->B4SOIpntrecr * Inv_LW; + pParam->B4SOIxbjt = model->B4SOIxbjt + + model->B4SOIlxbjt * Inv_L + + model->B4SOIwxbjt * Inv_W + + model->B4SOIpxbjt * Inv_LW; + pParam->B4SOIxdif = model->B4SOIxdif + + model->B4SOIlxdif* Inv_L + + model->B4SOIwxdif * Inv_W + + model->B4SOIpxdif * Inv_LW; + pParam->B4SOIxrec = model->B4SOIxrec + + model->B4SOIlxrec * Inv_L + + model->B4SOIwxrec * Inv_W + + model->B4SOIpxrec * Inv_LW; + pParam->B4SOIxtun = model->B4SOIxtun + + model->B4SOIlxtun * Inv_L + + model->B4SOIwxtun * Inv_W + + model->B4SOIpxtun * Inv_LW; + pParam->B4SOIxdifd = model->B4SOIxdifd + + model->B4SOIlxdifd* Inv_L + + model->B4SOIwxdifd * Inv_W + + model->B4SOIpxdifd * Inv_LW; + pParam->B4SOIxrecd = model->B4SOIxrecd + + model->B4SOIlxrecd * Inv_L + + model->B4SOIwxrecd * Inv_W + + model->B4SOIpxrecd * Inv_LW; + pParam->B4SOIxtund = model->B4SOIxtund + + model->B4SOIlxtund * Inv_L + + model->B4SOIwxtund * Inv_W + + model->B4SOIpxtund * Inv_LW; + pParam->B4SOIcgdl = model->B4SOIcgdl + + model->B4SOIlcgdl * Inv_L + + model->B4SOIwcgdl * Inv_W + + model->B4SOIpcgdl * Inv_LW; + pParam->B4SOIcgsl = model->B4SOIcgsl + + model->B4SOIlcgsl * Inv_L + + model->B4SOIwcgsl * Inv_W + + model->B4SOIpcgsl * Inv_LW; + pParam->B4SOIckappa = model->B4SOIckappa + + model->B4SOIlckappa * Inv_L + + model->B4SOIwckappa * Inv_W + + model->B4SOIpckappa * Inv_LW; + pParam->B4SOIute = model->B4SOIute + + model->B4SOIlute * Inv_L + + model->B4SOIwute * Inv_W + + model->B4SOIpute * Inv_LW; - /*4.1 mobmod=4*/ - pParam->B4SOIud = model->B4SOIud - /* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/ - + model->B4SOIlud * Inv_L /*Fix*/ - + model->B4SOIwud * Inv_W - + model->B4SOIpud * Inv_LW; + /*4.1 mobmod=4*/ + pParam->B4SOIud = model->B4SOIud + /* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/ + + model->B4SOIlud * Inv_L /*Fix*/ + + model->B4SOIwud * Inv_W + + model->B4SOIpud * Inv_LW; - pParam->B4SOIud1 = model->B4SOIud1 - + model->B4SOIlud1 * Inv_L - + model->B4SOIwud1 * Inv_W - + model->B4SOIpud1 * Inv_LW; - pParam->B4SOIeu = model->B4SOIeu - + model->B4SOIleu * Inv_L - + model->B4SOIweu * Inv_W - + model->B4SOIpeu * Inv_LW; - pParam->B4SOIucs = model->B4SOIucs - + model->B4SOIlucs * Inv_L - + model->B4SOIwucs * Inv_W - + model->B4SOIpucs * Inv_LW; - pParam->B4SOIucste = model->B4SOIucste - + model->B4SOIlucste * Inv_L - + model->B4SOIwucste * Inv_W - + model->B4SOIpucste * Inv_LW; + pParam->B4SOIud1 = model->B4SOIud1 + + model->B4SOIlud1 * Inv_L + + model->B4SOIwud1 * Inv_W + + model->B4SOIpud1 * Inv_LW; + pParam->B4SOIeu = model->B4SOIeu + + model->B4SOIleu * Inv_L + + model->B4SOIweu * Inv_W + + model->B4SOIpeu * Inv_LW; + pParam->B4SOIucs = model->B4SOIucs + + model->B4SOIlucs * Inv_L + + model->B4SOIwucs * Inv_W + + model->B4SOIpucs * Inv_LW; + pParam->B4SOIucste = model->B4SOIucste + + model->B4SOIlucste * Inv_L + + model->B4SOIwucste * Inv_W + + model->B4SOIpucste * Inv_LW; - pParam->B4SOIkt1 = model->B4SOIkt1 - + model->B4SOIlkt1 * Inv_L - + model->B4SOIwkt1 * Inv_W - + model->B4SOIpkt1 * Inv_LW; - pParam->B4SOIkt2 = model->B4SOIkt2 - + model->B4SOIlkt2 * Inv_L - + model->B4SOIwkt2 * Inv_W - + model->B4SOIpkt2 * Inv_LW; - pParam->B4SOIkt1l = model->B4SOIkt1l - + model->B4SOIlkt1l * Inv_L - + model->B4SOIwkt1l * Inv_W - + model->B4SOIpkt1l * Inv_LW; - pParam->B4SOIua1 = model->B4SOIua1 - + model->B4SOIlua1 * Inv_L - + model->B4SOIwua1 * Inv_W - + model->B4SOIpua1 * Inv_LW; - pParam->B4SOIub1 = model->B4SOIub1 - + model->B4SOIlub1* Inv_L - + model->B4SOIwub1 * Inv_W - + model->B4SOIpub1 * Inv_LW; - pParam->B4SOIuc1 = model->B4SOIuc1 - + model->B4SOIluc1 * Inv_L - + model->B4SOIwuc1 * Inv_W - + model->B4SOIpuc1 * Inv_LW; - pParam->B4SOIat = model->B4SOIat - + model->B4SOIlat * Inv_L - + model->B4SOIwat * Inv_W - + model->B4SOIpat * Inv_LW; - pParam->B4SOIprt = model->B4SOIprt - + model->B4SOIlprt * Inv_L - + model->B4SOIwprt * Inv_W - + model->B4SOIpprt * Inv_LW; + pParam->B4SOIkt1 = model->B4SOIkt1 + + model->B4SOIlkt1 * Inv_L + + model->B4SOIwkt1 * Inv_W + + model->B4SOIpkt1 * Inv_LW; + pParam->B4SOIkt2 = model->B4SOIkt2 + + model->B4SOIlkt2 * Inv_L + + model->B4SOIwkt2 * Inv_W + + model->B4SOIpkt2 * Inv_LW; + pParam->B4SOIkt1l = model->B4SOIkt1l + + model->B4SOIlkt1l * Inv_L + + model->B4SOIwkt1l * Inv_W + + model->B4SOIpkt1l * Inv_LW; + pParam->B4SOIua1 = model->B4SOIua1 + + model->B4SOIlua1 * Inv_L + + model->B4SOIwua1 * Inv_W + + model->B4SOIpua1 * Inv_LW; + pParam->B4SOIub1 = model->B4SOIub1 + + model->B4SOIlub1* Inv_L + + model->B4SOIwub1 * Inv_W + + model->B4SOIpub1 * Inv_LW; + pParam->B4SOIuc1 = model->B4SOIuc1 + + model->B4SOIluc1 * Inv_L + + model->B4SOIwuc1 * Inv_W + + model->B4SOIpuc1 * Inv_LW; + pParam->B4SOIat = model->B4SOIat + + model->B4SOIlat * Inv_L + + model->B4SOIwat * Inv_W + + model->B4SOIpat * Inv_LW; + pParam->B4SOIprt = model->B4SOIprt + + model->B4SOIlprt * Inv_L + + model->B4SOIwprt * Inv_W + + model->B4SOIpprt * Inv_LW; - /* v3.0 */ - pParam->B4SOInigc = model->B4SOInigc - + model->B4SOIlnigc * Inv_L - + model->B4SOIwnigc * Inv_W - + model->B4SOIpnigc * Inv_LW; - pParam->B4SOIaigc = model->B4SOIaigc - + model->B4SOIlaigc * Inv_L - + model->B4SOIwaigc * Inv_W - + model->B4SOIpaigc * Inv_LW; - pParam->B4SOIbigc = model->B4SOIbigc - + model->B4SOIlbigc * Inv_L - + model->B4SOIwbigc * Inv_W - + model->B4SOIpbigc * Inv_LW; - pParam->B4SOIcigc = model->B4SOIcigc - + model->B4SOIlcigc * Inv_L - + model->B4SOIwcigc * Inv_W - + model->B4SOIpcigc * Inv_LW; - pParam->B4SOIaigsd = model->B4SOIaigsd - + model->B4SOIlaigsd * Inv_L - + model->B4SOIwaigsd * Inv_W - + model->B4SOIpaigsd * Inv_LW; - pParam->B4SOIbigsd = model->B4SOIbigsd - + model->B4SOIlbigsd * Inv_L - + model->B4SOIwbigsd * Inv_W - + model->B4SOIpbigsd * Inv_LW; - pParam->B4SOIcigsd = model->B4SOIcigsd - + model->B4SOIlcigsd * Inv_L - + model->B4SOIwcigsd * Inv_W - + model->B4SOIpcigsd * Inv_LW; - pParam->B4SOIpigcd = model->B4SOIpigcd - + model->B4SOIlpigcd * Inv_L - + model->B4SOIwpigcd * Inv_W - + model->B4SOIppigcd * Inv_LW; - pParam->B4SOIpoxedge = model->B4SOIpoxedge - + model->B4SOIlpoxedge * Inv_L - + model->B4SOIwpoxedge * Inv_W - + model->B4SOIppoxedge * Inv_LW; - /* v3.0 */ + /* v3.0 */ + pParam->B4SOInigc = model->B4SOInigc + + model->B4SOIlnigc * Inv_L + + model->B4SOIwnigc * Inv_W + + model->B4SOIpnigc * Inv_LW; + pParam->B4SOIaigc = model->B4SOIaigc + + model->B4SOIlaigc * Inv_L + + model->B4SOIwaigc * Inv_W + + model->B4SOIpaigc * Inv_LW; + pParam->B4SOIbigc = model->B4SOIbigc + + model->B4SOIlbigc * Inv_L + + model->B4SOIwbigc * Inv_W + + model->B4SOIpbigc * Inv_LW; + pParam->B4SOIcigc = model->B4SOIcigc + + model->B4SOIlcigc * Inv_L + + model->B4SOIwcigc * Inv_W + + model->B4SOIpcigc * Inv_LW; + pParam->B4SOIaigsd = model->B4SOIaigsd + + model->B4SOIlaigsd * Inv_L + + model->B4SOIwaigsd * Inv_W + + model->B4SOIpaigsd * Inv_LW; + pParam->B4SOIbigsd = model->B4SOIbigsd + + model->B4SOIlbigsd * Inv_L + + model->B4SOIwbigsd * Inv_W + + model->B4SOIpbigsd * Inv_LW; + pParam->B4SOIcigsd = model->B4SOIcigsd + + model->B4SOIlcigsd * Inv_L + + model->B4SOIwcigsd * Inv_W + + model->B4SOIpcigsd * Inv_LW; + pParam->B4SOIpigcd = model->B4SOIpigcd + + model->B4SOIlpigcd * Inv_L + + model->B4SOIwpigcd * Inv_W + + model->B4SOIppigcd * Inv_LW; + pParam->B4SOIpoxedge = model->B4SOIpoxedge + + model->B4SOIlpoxedge * Inv_L + + model->B4SOIwpoxedge * Inv_W + + model->B4SOIppoxedge * Inv_LW; + /* v3.0 */ - /* v3.1 added for RF */ - pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 - + model->B4SOIlxrcrg1 * Inv_L - + model->B4SOIwxrcrg1 * Inv_W - + model->B4SOIpxrcrg1 * Inv_LW; - pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 - + model->B4SOIlxrcrg2 * Inv_L - + model->B4SOIwxrcrg2 * Inv_W - + model->B4SOIpxrcrg2 * Inv_LW; - /* v3.1 added for RF end */ + /* v3.1 added for RF */ + pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 + + model->B4SOIlxrcrg1 * Inv_L + + model->B4SOIwxrcrg1 * Inv_W + + model->B4SOIpxrcrg1 * Inv_LW; + pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 + + model->B4SOIlxrcrg2 * Inv_L + + model->B4SOIwxrcrg2 * Inv_W + + model->B4SOIpxrcrg2 * Inv_LW; + /* v3.1 added for RF end */ - /* CV model */ - pParam->B4SOIvsdfb = model->B4SOIvsdfb - + model->B4SOIlvsdfb * Inv_L - + model->B4SOIwvsdfb * Inv_W - + model->B4SOIpvsdfb * Inv_LW; - pParam->B4SOIvsdth = model->B4SOIvsdth - + model->B4SOIlvsdth * Inv_L - + model->B4SOIwvsdth * Inv_W - + model->B4SOIpvsdth * Inv_LW; - pParam->B4SOIdelvt = model->B4SOIdelvt - + model->B4SOIldelvt * Inv_L - + model->B4SOIwdelvt * Inv_W - + model->B4SOIpdelvt * Inv_LW; - pParam->B4SOIacde = model->B4SOIacde - + model->B4SOIlacde * Inv_L - + model->B4SOIwacde * Inv_W - + model->B4SOIpacde * Inv_LW; - pParam->B4SOIacde = pParam->B4SOIacde * - pow((pParam->B4SOInpeak / 2.0e16), -0.25); - /* v3.2 bug fix */ + /* CV model */ + pParam->B4SOIvsdfb = model->B4SOIvsdfb + + model->B4SOIlvsdfb * Inv_L + + model->B4SOIwvsdfb * Inv_W + + model->B4SOIpvsdfb * Inv_LW; + pParam->B4SOIvsdth = model->B4SOIvsdth + + model->B4SOIlvsdth * Inv_L + + model->B4SOIwvsdth * Inv_W + + model->B4SOIpvsdth * Inv_LW; + pParam->B4SOIdelvt = model->B4SOIdelvt + + model->B4SOIldelvt * Inv_L + + model->B4SOIwdelvt * Inv_W + + model->B4SOIpdelvt * Inv_LW; + pParam->B4SOIacde = model->B4SOIacde + + model->B4SOIlacde * Inv_L + + model->B4SOIwacde * Inv_W + + model->B4SOIpacde * Inv_LW; + pParam->B4SOIacde = pParam->B4SOIacde * + pow((pParam->B4SOInpeak / 2.0e16), -0.25); + /* v3.2 bug fix */ - pParam->B4SOImoin = model->B4SOImoin - + model->B4SOIlmoin * Inv_L - + model->B4SOIwmoin * Inv_W - + model->B4SOIpmoin * Inv_LW; - pParam->B4SOInoff = model->B4SOInoff - + model->B4SOIlnoff * Inv_L - + model->B4SOIwnoff * Inv_W - + model->B4SOIpnoff * Inv_LW; /* v3.2 */ + pParam->B4SOImoin = model->B4SOImoin + + model->B4SOIlmoin * Inv_L + + model->B4SOIwmoin * Inv_W + + model->B4SOIpmoin * Inv_LW; + pParam->B4SOInoff = model->B4SOInoff + + model->B4SOIlnoff * Inv_L + + model->B4SOIwnoff * Inv_W + + model->B4SOIpnoff * Inv_LW; /* v3.2 */ - pParam->B4SOIdvtp0 = model->B4SOIdvtp0 - + model->B4SOIldvtp0 * Inv_L - + model->B4SOIwdvtp0 * Inv_W - + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp1 = model->B4SOIdvtp1 - + model->B4SOIldvtp1 * Inv_L - + model->B4SOIwdvtp1 * Inv_W - + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp2 = model->B4SOIdvtp2 - + model->B4SOIldvtp2 * Inv_L - + model->B4SOIwdvtp2 * Inv_W - + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp3 = model->B4SOIdvtp3 - + model->B4SOIldvtp3 * Inv_L - + model->B4SOIwdvtp3 * Inv_W - + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp4 = model->B4SOIdvtp4 - + model->B4SOIldvtp4 * Inv_L - + model->B4SOIwdvtp4 * Inv_W - + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ - pParam->B4SOIminv = model->B4SOIminv - + model->B4SOIlminv * Inv_L - + model->B4SOIwminv * Inv_W - + model->B4SOIpminv * Inv_LW; /* v4.0 */ - pParam->B4SOIminvcv = model->B4SOIminvcv - + model->B4SOIlminvcv * Inv_L - + model->B4SOIwminvcv * Inv_W - + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ - pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/ - + model->B4SOIlvoffcv * Inv_L - + model->B4SOIwvoffcv * Inv_W - + model->B4SOIpvoffcv * Inv_LW; - pParam->B4SOIfprout = model->B4SOIfprout - + model->B4SOIlfprout * Inv_L - + model->B4SOIwfprout * Inv_W - + model->B4SOIpfprout * Inv_LW; /* v4.0 */ - pParam->B4SOIpdits = model->B4SOIpdits - + model->B4SOIlpdits * Inv_L - + model->B4SOIwpdits * Inv_W - + model->B4SOIppdits * Inv_LW; /* v4.0 */ - pParam->B4SOIpditsd = model->B4SOIpditsd - + model->B4SOIlpditsd * Inv_L - + model->B4SOIwpditsd * Inv_W - + model->B4SOIppditsd * Inv_LW; /* v4.0 */ - pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 - + model->B4SOIlaigbcp2 * Inv_L - + model->B4SOIwaigbcp2 * Inv_W - + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 - + model->B4SOIlbigbcp2 * Inv_L - + model->B4SOIwbigbcp2 * Inv_W - + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 - + model->B4SOIlcigbcp2 * Inv_L - + model->B4SOIwcigbcp2 * Inv_W - + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp0 = model->B4SOIdvtp0 + + model->B4SOIldvtp0 * Inv_L + + model->B4SOIwdvtp0 * Inv_W + + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp1 = model->B4SOIdvtp1 + + model->B4SOIldvtp1 * Inv_L + + model->B4SOIwdvtp1 * Inv_W + + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp2 = model->B4SOIdvtp2 + + model->B4SOIldvtp2 * Inv_L + + model->B4SOIwdvtp2 * Inv_W + + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp3 = model->B4SOIdvtp3 + + model->B4SOIldvtp3 * Inv_L + + model->B4SOIwdvtp3 * Inv_W + + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp4 = model->B4SOIdvtp4 + + model->B4SOIldvtp4 * Inv_L + + model->B4SOIwdvtp4 * Inv_W + + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ + pParam->B4SOIminv = model->B4SOIminv + + model->B4SOIlminv * Inv_L + + model->B4SOIwminv * Inv_W + + model->B4SOIpminv * Inv_LW; /* v4.0 */ + pParam->B4SOIminvcv = model->B4SOIminvcv + + model->B4SOIlminvcv * Inv_L + + model->B4SOIwminvcv * Inv_W + + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ + pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/ + + model->B4SOIlvoffcv * Inv_L + + model->B4SOIwvoffcv * Inv_W + + model->B4SOIpvoffcv * Inv_LW; + pParam->B4SOIfprout = model->B4SOIfprout + + model->B4SOIlfprout * Inv_L + + model->B4SOIwfprout * Inv_W + + model->B4SOIpfprout * Inv_LW; /* v4.0 */ + pParam->B4SOIpdits = model->B4SOIpdits + + model->B4SOIlpdits * Inv_L + + model->B4SOIwpdits * Inv_W + + model->B4SOIppdits * Inv_LW; /* v4.0 */ + pParam->B4SOIpditsd = model->B4SOIpditsd + + model->B4SOIlpditsd * Inv_L + + model->B4SOIwpditsd * Inv_W + + model->B4SOIppditsd * Inv_LW; /* v4.0 */ + pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 + + model->B4SOIlaigbcp2 * Inv_L + + model->B4SOIwaigbcp2 * Inv_W + + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 + + model->B4SOIlbigbcp2 * Inv_L + + model->B4SOIwbigbcp2 * Inv_W + + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 + + model->B4SOIlcigbcp2 * Inv_L + + model->B4SOIwcigbcp2 * Inv_W + + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ - /* Added for binning - END */ + /* Added for binning - END */ - /* v4.0 add mstar for Vgsteff */ - pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; - if (model->B4SOIvgstcvMod == 0) - printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); - /* v4.1 add mstarcv for Vgsteffcv */ - pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; + /* v4.0 add mstar for Vgsteff */ + pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; + if (model->B4SOIvgstcvMod == 0) + printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); + /* v4.1 add mstarcv for Vgsteffcv */ + pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; - T0 = (TempRatio - 1.0); + T0 = (TempRatio - 1.0); - pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ - pParam->B4SOIubtemp = pParam->B4SOIub; - pParam->B4SOIuctemp = pParam->B4SOIuc; - pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); + pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ + pParam->B4SOIubtemp = pParam->B4SOIub; + pParam->B4SOIuctemp = pParam->B4SOIuc; + pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); - /* v2.2 release */ - pParam->B4SOIrth = here->B4SOIrth0 - / (pParam->B4SOIweff + model->B4SOIwth0) - * here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/ - pParam->B4SOIcth = here->B4SOIcth0 - * (pParam->B4SOIweff + model->B4SOIwth0) - / here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/ + /* v2.2 release */ + pParam->B4SOIrth = here->B4SOIrth0 + / (pParam->B4SOIweff + model->B4SOIwth0) + * here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/ + pParam->B4SOIcth = here->B4SOIcth0 + * (pParam->B4SOIweff + model->B4SOIwth0) + / here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/ - /* v2.2.2 adding layout-dependent Frbody multiplier */ - /* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody - * model->B4SOIrhalo - / (2 * model->B4SOIrbody - + model->B4SOIrhalo * pParam->B4SOIleff) - * pParam->B4SOIweff / here->B4SOInseg - / here->B4SOInf */ /* v4.0 *//*;*/ - - if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/ + /* v2.2.2 adding layout-dependent Frbody multiplier */ + /* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody + * model->B4SOIrhalo + / (2 * model->B4SOIrbody + + model->B4SOIrhalo * pParam->B4SOIleff) + * pParam->B4SOIweff / here->B4SOInseg + / here->B4SOInf */ /* v4.0 *//*;*/ + + if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/ pParam->B4SOIrbody = 0; else - pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody - * model->B4SOIrhalo - / (2 * model->B4SOIrbody - + model->B4SOIrhalo * pParam->B4SOIleff) - * pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */ + pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody + * model->B4SOIrhalo + / (2 * model->B4SOIrbody + + model->B4SOIrhalo * pParam->B4SOIleff) + * pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */ - pParam->B4SOIoxideRatio = pow(model->B4SOItoxref - /model->B4SOItoxqm, model->B4SOIntox) - /model->B4SOItoxqm/model->B4SOItoxqm; - /* v2.2 release */ + pParam->B4SOIoxideRatio = pow(model->B4SOItoxref + /model->B4SOItoxqm, model->B4SOIntox) + /model->B4SOItoxqm/model->B4SOItoxqm; + /* v2.2 release */ - pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; - pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; - pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; - if (pParam->B4SOIu0 > 1.0) - pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; + pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; + pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; + pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; + if (pParam->B4SOIu0 > 1.0) + pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; - pParam->B4SOIu0temp = pParam->B4SOIu0 - * pow(TempRatio, pParam->B4SOIute); - pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat - * T0; - pParam->B4SOIrds0 = (pParam->B4SOIrdsw - + pParam->B4SOIprt * T0) - / pow(pParam->B4SOIweff * 1E6, - pParam->B4SOIwr); + pParam->B4SOIu0temp = pParam->B4SOIu0 + * pow(TempRatio, pParam->B4SOIute); + pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat + * T0; + pParam->B4SOIrds0 = (pParam->B4SOIrdsw + + pParam->B4SOIprt * T0) + / pow(pParam->B4SOIweff * 1E6, + pParam->B4SOIwr); - if(model->B4SOIrdsMod) { /* v4.0 */ - PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; - T10 = pParam->B4SOIprt * T0; - /* External Rd(V) */ - T1 = pParam->B4SOIrdw + T10; - T2 = model->B4SOIrdwmin + T10; - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } + if(model->B4SOIrdsMod) { /* v4.0 */ + PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; + T10 = pParam->B4SOIprt * T0; + /* External Rd(V) */ + T1 = pParam->B4SOIrdw + T10; + T2 = model->B4SOIrdwmin + T10; + if (T1 < 0.0) + { T1 = 0.0; + printf("Warning: Rdw at current temperature is negative; set to 0.\n"); + } + if (T2 < 0.0) + { T2 = 0.0; + printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); + } - pParam->B4SOIrd0 = T1 / PowWeffWr; - pParam->B4SOIrdwmin = T2 / PowWeffWr; + pParam->B4SOIrd0 = T1 / PowWeffWr; + pParam->B4SOIrdwmin = T2 / PowWeffWr; - /* External Rs(V) */ - T3 = pParam->B4SOIrsw + T10; - T4 = model->B4SOIrswmin + T10; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->B4SOIrs0 = T3 / PowWeffWr; - pParam->B4SOIrswmin = T4 / PowWeffWr; - } + /* External Rs(V) */ + T3 = pParam->B4SOIrsw + T10; + T4 = model->B4SOIrswmin + T10; + if (T3 < 0.0) + { T3 = 0.0; + printf("Warning: Rsw at current temperature is negative; set to 0.\n"); + } + if (T4 < 0.0) + { T4 = 0.0; + printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); + } + pParam->B4SOIrs0 = T3 / PowWeffWr; + pParam->B4SOIrswmin = T4 / PowWeffWr; + } - if (B4SOIcheckModel(model, here, ckt)) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray); - return(E_BADPARM); - } + if (B4SOIcheckModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } - pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) - * pParam->B4SOIwdiodCV; - pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) - * pParam->B4SOIwdiosCV; + pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) + * pParam->B4SOIwdiodCV; + pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) + * pParam->B4SOIwdiosCV; - pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV - * here->B4SOInf; /* v4.0 */ + pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV + * here->B4SOInf; /* v4.0 */ - if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) - { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; - pParam->B4SOInpeak = 3.021E22 * T0 * T0; - } + if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) + { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; + pParam->B4SOInpeak = 3.021E22 * T0 * T0; + } - T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); - /* source side */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; - DEXP(T7, T0); - T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; - DEXP(T7, T1); - T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; - DEXP(T7, T2); + T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); + /* source side */ + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; + DEXP(T7, T0); + T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; + DEXP(T7, T1); + T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; + DEXP(T7, T2); - pParam->B4SOIahli0s = pParam->B4SOIahli * T0; - pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; - pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; - pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; - T7 = pParam->B4SOIxtun * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtuns = pParam->B4SOIistun * T0; + pParam->B4SOIahli0s = pParam->B4SOIahli * T0; + pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; + pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; + pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; + T7 = pParam->B4SOIxtun * (TempRatio - 1); + DEXP(T7, T0); + pParam->B4SOIjtuns = pParam->B4SOIistun * T0; - /* drain side */ - /* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */ + /* drain side */ + /* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; - DEXP(T7, T0); - T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; - DEXP(T7, T1); - T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; - DEXP(T7, T2); + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; + DEXP(T7, T0); + T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; + DEXP(T7, T1); + T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; + DEXP(T7, T2); - pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; - pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; - pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; - pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; - T7 = pParam->B4SOIxtund * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtund = pParam->B4SOIidtun * T0; + pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; + pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; + pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; + pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; + T7 = pParam->B4SOIxtund * (TempRatio - 1); + DEXP(T7, T0); + pParam->B4SOIjtund = pParam->B4SOIidtun * T0; - if (pParam->B4SOInsub > 0) - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(pParam->B4SOInpeak/ pParam->B4SOInsub); - else - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); + if (pParam->B4SOInsub > 0) + pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * + log(pParam->B4SOInpeak/ pParam->B4SOInsub); + else + pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * + log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); - if (!model->B4SOIvsdfbGiven) - { - if (pParam->B4SOInsub > 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(1e20 * - pParam->B4SOInsub / ni /ni) - 0.3); - else if (pParam->B4SOInsub < 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(-1e20 / - pParam->B4SOInsub) + 0.3); - } + if (!model->B4SOIvsdfbGiven) + { + if (pParam->B4SOInsub > 0) + pParam->B4SOIvsdfb = -model->B4SOItype * + (model->B4SOIvtm*log(1e20 * + pParam->B4SOInsub / ni /ni) - 0.3); + else if (pParam->B4SOInsub < 0) + pParam->B4SOIvsdfb = -model->B4SOItype * + (model->B4SOIvtm*log(-1e20 / + pParam->B4SOInsub) + 0.3); + } - /* Phi & Gamma */ - SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); - SDgamma = sqrt2qeps * sqrt(fabs(pParam->B4SOInsub)) - / model->B4SOIcbox; /* bugfix v4.3.1*/ + /* Phi & Gamma */ + SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); + SDgamma = sqrt2qeps * sqrt(fabs(pParam->B4SOInsub)) + / model->B4SOIcbox; /* bugfix v4.3.1*/ - if (!model->B4SOIvsdthGiven) - { - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } + if (!model->B4SOIvsdthGiven) + { + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + + SDgamma * sqrt(SDphi); + else + pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - + SDgamma * sqrt(SDphi); + } - if (!model->B4SOIcsdminGiven) { - /* Cdmin */ - tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * - fabs(pParam->B4SOInsub) * 1.0e6)); - tmp1 = epssub / tmp; - model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / - (tmp1 + model->B4SOIcbox); - } + if (!model->B4SOIcsdminGiven) { + /* Cdmin */ + tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * + fabs(pParam->B4SOInsub) * 1.0e6)); + tmp1 = epssub / tmp; + model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / + (tmp1 + model->B4SOIcbox); + } - pParam->B4SOIphi = 2.0 * model->B4SOIvtm - * log(pParam->B4SOInpeak / ni); + pParam->B4SOIphi = 2.0 * model->B4SOIvtm + * log(pParam->B4SOInpeak / ni); - pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); - pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; + pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); + pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; - pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->B4SOInpeak * 1.0e6)) - * pParam->B4SOIsqrtPhi; - pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); - /*4.1*/ - if (model->B4SOImtrlMod==0) - pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj - * model->B4SOItox); - else - /* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/ - pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */ - pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - pParam->B4SOIcdep0 = sqrt(Charge_q * epssub - * pParam->B4SOInpeak * 1.0e6 / 2.0 - / pParam->B4SOIphi); + pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q + * pParam->B4SOInpeak * 1.0e6)) + * pParam->B4SOIsqrtPhi; + pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); + /*4.1*/ + if (model->B4SOImtrlMod==0) + pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj + * model->B4SOItox); + else + /* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/ + pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */ + pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 + * pParam->B4SOInpeak / (ni * ni)); + pParam->B4SOIcdep0 = sqrt(Charge_q * epssub + * pParam->B4SOInpeak * 1.0e6 / 2.0 + / pParam->B4SOIphi); - /* v3.0 */ - /*4.1 */ - if (model->B4SOImtrlMod ==0) - { - if (pParam->B4SOIngate > 0.0) - { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate - / 1.0e20); - } - else - pParam->B4SOIvfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->B4SOInsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; - pParam->B4SOIvfbsd = model->B4SOIphig - T2; + /* v3.0 */ + /*4.1 */ + if (model->B4SOImtrlMod ==0) + { + if (pParam->B4SOIngate > 0.0) + { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate + / 1.0e20); + } + else + pParam->B4SOIvfbsd = 0.0; + } + else + { + T0 = Vtm0 * log(pParam->B4SOInsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; + pParam->B4SOIvfbsd = model->B4SOIphig - T2; - } - pParam->B4SOIToxRatio = exp(model->B4SOIntox - * log(model->B4SOItoxref /model->B4SOItoxqm)) - /model->B4SOItoxqm /model->B4SOItoxqm; - pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox - * log(model->B4SOItoxref - / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) - / model->B4SOItoxqm / model->B4SOItoxqm - / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; - /* pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; */ - pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? agbc2p : agbc2n; /* bugfix 4.3.1 -Tanvir */ - pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? bgbc2p : bgbc2n; /* bugfix v4.3.1 -Tanvir */ + } + pParam->B4SOIToxRatio = exp(model->B4SOIntox + * log(model->B4SOItoxref /model->B4SOItoxqm)) + /model->B4SOItoxqm /model->B4SOItoxqm; + pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox + * log(model->B4SOItoxref + / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) + / model->B4SOItoxqm / model->B4SOItoxqm + / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; + /* pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; + pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; */ + pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? agbc2p : agbc2n; /* bugfix 4.3.1 -Tanvir */ + pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? bgbc2p : bgbc2n; /* bugfix v4.3.1 -Tanvir */ // The edge should have a contribution from psbcp & pdbcp. Need s & d terms. // There is no NF correction because psbcp & pdbcp are "per finger" in manual. pParam->B4SOIAechvbEdges = pParam->B4SOIAechvb @@ -1355,8 +1357,8 @@ B4SOItemp( pParam->B4SOIAechvbEdged = pParam->B4SOIAechvb * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpdbcp) * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ - pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb - * model->B4SOItoxqm * pParam->B4SOIpoxedge; + pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb + * model->B4SOItoxqm * pParam->B4SOIpoxedge; /* pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg */ /* * pParam->B4SOIleff */ /* * pParam->B4SOIToxRatio */ @@ -1366,716 +1368,716 @@ B4SOItemp( + here->B4SOIagbcpd/here->B4SOInf) /* LFW */ * pParam->B4SOIToxRatio; /* From Geoffrey Coram 10/22/09 */ - pParam->B4SOIBechvb *= -model->B4SOItoxqm; - /* v3.0 */ - - - if (model->B4SOIk1Given || model->B4SOIk2Given) - { if (!model->B4SOIk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B4SOIk1 = 0.53; - } - if (!model->B4SOIk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B4SOIk2 = -0.0186; - } - if (model->B4SOIxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B4SOIvbxGiven){ - if (model->B4SOImtrlMod) - T0 = Charge_q / 2.0 / epssub * 1.0e6; - else - T0 = 7.7348e-4; - pParam->B4SOIvbx = pParam->B4SOIphi - T0 - * pParam->B4SOInpeak - * pParam->B4SOIxt * pParam->B4SOIxt;} /* bugfix 4.3.1 */ - if (pParam->B4SOIvbx > 0.0) - pParam->B4SOIvbx = -pParam->B4SOIvbx; - if (pParam->B4SOIvbm > 0.0) - pParam->B4SOIvbm = -pParam->B4SOIvbm; - - if (!model->B4SOIgamma1Given) - pParam->B4SOIgamma1 = sqrt2qeps - * sqrt(pParam->B4SOInpeak) - / model->B4SOIcox; /* bugfix 4.3.1 */ - if (!model->B4SOIgamma2Given) - pParam->B4SOIgamma2 = sqrt2qeps - * sqrt(pParam->B4SOInsub) - / model->B4SOIcox; /* bugfix 4.3.1 */ - - T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; - T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) - - pParam->B4SOIsqrtPhi; - T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi - - pParam->B4SOIvbm)) - pParam->B4SOIphi; - pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); - pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 - * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi - - pParam->B4SOIvbm); - } - - /*if (pParam->B4SOIk2 < 0.0) - { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; - pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); - if (pParam->B4SOIvbsc > -3.0) - pParam->B4SOIvbsc = -3.0; - else if (pParam->B4SOIvbsc < -30.0) - pParam->B4SOIvbsc = -30.0; - } - else - { pParam->B4SOIvbsc = -30.0; - } - if (pParam->B4SOIvbsc > pParam->B4SOIvbm) - pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */ - - if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) - T0 = 1e-8; - pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); - /*4.0 - if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } - */ - /* v4.1 */ - if (!model->B4SOIvfbGiven) - { if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - } - } - if (!model->B4SOIvth0Given) - { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } - /* v4.0 */ - pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox - / model->B4SOItoxm; - if(model->B4SOImtrlMod == 0) - T1 = sqrt(EPSSI / EPSOX * model->B4SOItox - * pParam->B4SOIXdep0); - else - T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox - * pParam->B4SOIXdep0); - T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); - pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 - + pParam->B4SOIpdibl2; - - /* New DITS term (added in 4.1) */ - pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); - - /* stress effect */ - if (model->B4SOIwlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); - model->B4SOIwlod = 0.0; - } - - T0 = pow(Ldrn, model->B4SOIllodku0); - W_tmp = Wdrn + model->B4SOIwlod; - T1 = pow(W_tmp, model->B4SOIwlodku0); - tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 - + model->B4SOIpku0 / (T0 * T1); - pParam->B4SOIku0 = 1.0 + tmp1; - - T0 = pow(Ldrn, model->B4SOIllodvth); - T1 = pow(W_tmp, model->B4SOIwlodvth); - tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 - + model->B4SOIpkvth0 / (T0 * T1); - pParam->B4SOIkvth0 = 1.0 + tmp1; - pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 - * pParam->B4SOIkvth0 + DELTA); - - /*T0 = (TRatio - 1.0);*/ - T0 = (TempRatio - 1.0); /* bug fix v4.1 */ - pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 - + model->B4SOItku0 * T0) + DELTA; - - Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); - Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); - pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; - pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp - * pParam->B4SOIinv_od_ref; - /* stress effect end */ - - } - - /* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/ - /* v4.0 stress effect */ - if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ( (here->B4SOInf == 1.0) || - ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) - ) - ) - { Inv_sa = 0; - Inv_sb = 0; - - if (model->B4SOIkvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = -1.0; - } - else if (model->B4SOIkvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = 1.0; - } - else here->B4SOIkvsat = model->B4SOIkvsat; - - for(i = 0; i < here->B4SOInf; i++) { - T0 = 1.0 / here->B4SOInf / (here->B4SOIsa - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - T1 = 1.0 / here->B4SOInf / (here->B4SOIsb - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - - Inv_ODeff = Inv_sa + Inv_sb; - here->B4SOIInv_ODeff = Inv_ODeff; - rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); - here->B4SOIu0temp = pParam->B4SOIu0temp * T0; - - T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ - here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; - - OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; - dvth0_lod = model->B4SOIkvth0 - / pParam->B4SOIkvth0 * OD_offset; - dk2_lod = model->B4SOIstk2 - / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) - * OD_offset; - deta0_lod = model->B4SOIsteta0 - / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) - * OD_offset; - here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; - - here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; - - here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; - } - else { - here->B4SOIu0temp = pParam->B4SOIu0temp; - here->B4SOIvth0 = pParam->B4SOIvth0; - here->B4SOIvsattemp = pParam->B4SOIvsattemp; - here->B4SOIk2 = pParam->B4SOIk2; - here->B4SOIeta0 = pParam->B4SOIeta0; - here->B4SOIInv_ODeff = 0; - pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ - here->B4SOIkvsat = 0; /*Stress bug fix*/ - } /* v4.0 stress effect end */ - - - - - here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox - / model->B4SOItoxm; /* v4.0 */ - here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ - here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; - /* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/ - - here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; - here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; - here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; - here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; - - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; - pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; - T1 = here->B4SOIcsbox - here->B4SOIcsmin; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsmin * pParam->B4SOIvsdfb; - - T1 = here->B4SOIcdbox - here->B4SOIcdmin; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdmin * pParam->B4SOIvsdfb; - } else - { - T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; - pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; - T1 = here->B4SOIcsmin - here->B4SOIcsbox; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsbox * pParam->B4SOIvsdth; - - T1 = here->B4SOIcdmin - here->B4SOIcdbox; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdbox * pParam->B4SOIvsdth; - } - - /* v2.2.2 bug fix */ - T0 = model->B4SOIcsdesw * log(1 + model->B4SOItsi / - model->B4SOItbox); - T1 = here->B4SOIsourcePerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcsesw = T0 * T1; - else - here->B4SOIcsesw = 0.0; - T1 = here->B4SOIdrainPerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcdesw = T0 * T1; - else - here->B4SOIcdesw = 0.0; - - - here->B4SOIphi = pParam->B4SOIphi; - /* process source/drain series resistance */ - here->B4SOIdrainConductance = model->B4SOIsheetResistance - * here->B4SOIdrainSquares; - if (here->B4SOIdrainConductance > 0.0) - here->B4SOIdrainConductance = 1.0 - / here->B4SOIdrainConductance; - else - here->B4SOIdrainConductance = 0.0; - - here->B4SOIsourceConductance = model->B4SOIsheetResistance - * here->B4SOIsourceSquares; - if (here->B4SOIsourceConductance > 0.0) - here->B4SOIsourceConductance = 1.0 - / here->B4SOIsourceConductance; - else - here->B4SOIsourceConductance = 0.0; - here->B4SOIcgso = pParam->B4SOIcgso; - here->B4SOIcgdo = pParam->B4SOIcgdo; - - - /* v2.0 release */ - if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; - T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; - DEXP(T0,T1); - pParam->B4SOIarfabjt = T1; - - T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); - pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); - pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); - - if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) - pParam->B4SOIvearly = 1; - - /*4.1 toxp calculation*/ - if(model->B4SOImtrlMod==0) - { - model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; - } - else - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->B4SOItempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - phieot = 2.0 * Vtm0eot - * log(pParam->B4SOInpeak / ni); - sqrtphieot = sqrt(phieot); - tmp2 = here->B4SOIvfb + phieot; - vddeot = model->B4SOItype * model->B4SOIvddeot; - - T0 = model->B4SOIepsrgate * EPS0; - if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - /* T7 = 1.12 - T3 - 0.05; */ - T7 = eggdep - T3 - 0.05; /* bugfix v4.3.1 -Tanvir */ - T6 = sqrt(T7 * T7 + 0.224); - /* T5 = 1.12 - 0.5 * (T7 + T6); */ - T5 = eggdep - 0.5 * (T7 + T6); /* bugfix v4.3.1 -Tanvir */ - Vgs_eff = vddeot - T5; - - } - else - { Vgs_eff = vddeot; + pParam->B4SOIBechvb *= -model->B4SOItoxqm; + /* v3.0 */ + + + if (model->B4SOIk1Given || model->B4SOIk2Given) + { if (!model->B4SOIk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->B4SOIk1 = 0.53; + } + if (!model->B4SOIk2Given) + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->B4SOIk2 = -0.0186; + } + if (model->B4SOIxtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->B4SOIvbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->B4SOIvbmGiven) + fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); + if (model->B4SOIgamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->B4SOIgamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + else + { if (!model->B4SOIvbxGiven){ + if (model->B4SOImtrlMod) + T0 = Charge_q / 2.0 / epssub * 1.0e6; + else + T0 = 7.7348e-4; + pParam->B4SOIvbx = pParam->B4SOIphi - T0 + * pParam->B4SOInpeak + * pParam->B4SOIxt * pParam->B4SOIxt;} /* bugfix 4.3.1 */ + if (pParam->B4SOIvbx > 0.0) + pParam->B4SOIvbx = -pParam->B4SOIvbx; + if (pParam->B4SOIvbm > 0.0) + pParam->B4SOIvbm = -pParam->B4SOIvbm; + + if (!model->B4SOIgamma1Given) + pParam->B4SOIgamma1 = sqrt2qeps + * sqrt(pParam->B4SOInpeak) + / model->B4SOIcox; /* bugfix 4.3.1 */ + if (!model->B4SOIgamma2Given) + pParam->B4SOIgamma2 = sqrt2qeps + * sqrt(pParam->B4SOInsub) + / model->B4SOIcox; /* bugfix 4.3.1 */ + + T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; + T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) + - pParam->B4SOIsqrtPhi; + T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi + - pParam->B4SOIvbm)) - pParam->B4SOIphi; + pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); + pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 + * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi + - pParam->B4SOIvbm); + } + + /*if (pParam->B4SOIk2 < 0.0) + { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; + pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); + if (pParam->B4SOIvbsc > -3.0) + pParam->B4SOIvbsc = -3.0; + else if (pParam->B4SOIvbsc < -30.0) + pParam->B4SOIvbsc = -30.0; + } + else + { pParam->B4SOIvbsc = -30.0; + } + if (pParam->B4SOIvbsc > pParam->B4SOIvbm) + pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */ + + if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) + T0 = 1e-8; + pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); + /*4.0 + if (model->B4SOIvth0Given) + { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 + - pParam->B4SOIphi - pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi; + } + else + { pParam->B4SOIvfb = -1.0; + pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + + pParam->B4SOIphi + pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi); + } + */ + /* v4.1 */ + if (!model->B4SOIvfbGiven) + { if (model->B4SOIvth0Given) + { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 + - pParam->B4SOIphi - pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi; + } + else + { pParam->B4SOIvfb = -1.0; + } + } + if (!model->B4SOIvth0Given) + { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + + pParam->B4SOIphi + pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi); + } + /* v4.0 */ + pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox + / model->B4SOItoxm; + if(model->B4SOImtrlMod == 0) + T1 = sqrt(EPSSI / EPSOX * model->B4SOItox + * pParam->B4SOIXdep0); + else + T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox + * pParam->B4SOIXdep0); + T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); + pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); + + T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 + + pParam->B4SOIpdibl2; + + /* New DITS term (added in 4.1) */ + pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); + + /* stress effect */ + if (model->B4SOIwlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); + model->B4SOIwlod = 0.0; + } + + T0 = pow(Ldrn, model->B4SOIllodku0); + W_tmp = Wdrn + model->B4SOIwlod; + T1 = pow(W_tmp, model->B4SOIwlodku0); + tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 + + model->B4SOIpku0 / (T0 * T1); + pParam->B4SOIku0 = 1.0 + tmp1; + + T0 = pow(Ldrn, model->B4SOIllodvth); + T1 = pow(W_tmp, model->B4SOIwlodvth); + tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 + + model->B4SOIpkvth0 / (T0 * T1); + pParam->B4SOIkvth0 = 1.0 + tmp1; + pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 + * pParam->B4SOIkvth0 + DELTA); + + /*T0 = (TRatio - 1.0);*/ + T0 = (TempRatio - 1.0); /* bug fix v4.1 */ + pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 + + model->B4SOItku0 * T0) + DELTA; + + Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); + Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); + pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; + pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp + * pParam->B4SOIinv_od_ref; + /* stress effect end */ + + } + + /* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/ + /* v4.0 stress effect */ + if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && + ( (here->B4SOInf == 1.0) || + ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) + ) + ) + { Inv_sa = 0; + Inv_sb = 0; + + if (model->B4SOIkvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); + here->B4SOIkvsat = kvsat = -1.0; + } + else if (model->B4SOIkvsat > 1.0) + { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); + here->B4SOIkvsat = kvsat = 1.0; + } + else here->B4SOIkvsat = model->B4SOIkvsat; + + for(i = 0; i < here->B4SOInf; i++) { + T0 = 1.0 / here->B4SOInf / (here->B4SOIsa + + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); + T1 = 1.0 / here->B4SOInf / (here->B4SOIsb + + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; + } + + Inv_ODeff = Inv_sa + Inv_sb; + here->B4SOIInv_ODeff = Inv_ODeff; + rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; + T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); + here->B4SOIu0temp = pParam->B4SOIu0temp * T0; + + T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ + here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; + + OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; + dvth0_lod = model->B4SOIkvth0 + / pParam->B4SOIkvth0 * OD_offset; + dk2_lod = model->B4SOIstk2 + / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) + * OD_offset; + deta0_lod = model->B4SOIsteta0 + / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) + * OD_offset; + here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; + + here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; + + here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; + } + else { + here->B4SOIu0temp = pParam->B4SOIu0temp; + here->B4SOIvth0 = pParam->B4SOIvth0; + here->B4SOIvsattemp = pParam->B4SOIvsattemp; + here->B4SOIk2 = pParam->B4SOIk2; + here->B4SOIeta0 = pParam->B4SOIeta0; + here->B4SOIInv_ODeff = 0; + pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ + here->B4SOIkvsat = 0; /*Stress bug fix*/ + } /* v4.0 stress effect end */ + + + + + here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox + / model->B4SOItoxm; /* v4.0 */ + here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ + here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; + /* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/ + + here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; + here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; + here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; + here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; + + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + { + T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; + pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; + T1 = here->B4SOIcsbox - here->B4SOIcsmin; + T2 = T1 / T0 / T0; + pParam->B4SOIst2 = T2 / model->B4SOIasd; + pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcsmin * pParam->B4SOIvsdfb; + + T1 = here->B4SOIcdbox - here->B4SOIcdmin; + T2 = T1 / T0 / T0; + pParam->B4SOIdt2 = T2 / model->B4SOIasd; + pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcdmin * pParam->B4SOIvsdfb; + } else + { + T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; + pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; + T1 = here->B4SOIcsmin - here->B4SOIcsbox; + T2 = T1 / T0 / T0; + pParam->B4SOIst2 = T2 / model->B4SOIasd; + pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcsbox * pParam->B4SOIvsdth; + + T1 = here->B4SOIcdmin - here->B4SOIcdbox; + T2 = T1 / T0 / T0; + pParam->B4SOIdt2 = T2 / model->B4SOIasd; + pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcdbox * pParam->B4SOIvsdth; + } + + /* v2.2.2 bug fix */ + T0 = model->B4SOIcsdesw * log(model->B4SOIcfrcoeff * (1 + model->B4SOItsi / + model->B4SOItbox)); /* v4.4 */ + T1 = here->B4SOIsourcePerimeter - here->B4SOIw; + if (T1 > 0.0) + here->B4SOIcsesw = T0 * T1; + else + here->B4SOIcsesw = 0.0; + T1 = here->B4SOIdrainPerimeter - here->B4SOIw; + if (T1 > 0.0) + here->B4SOIcdesw = T0 * T1; + else + here->B4SOIcdesw = 0.0; + + + here->B4SOIphi = pParam->B4SOIphi; + /* process source/drain series resistance */ + here->B4SOIdrainConductance = model->B4SOIsheetResistance + * here->B4SOIdrainSquares; + if (here->B4SOIdrainConductance > 0.0) + here->B4SOIdrainConductance = 1.0 + / here->B4SOIdrainConductance; + else + here->B4SOIdrainConductance = 0.0; + + here->B4SOIsourceConductance = model->B4SOIsheetResistance + * here->B4SOIsourceSquares; + if (here->B4SOIsourceConductance > 0.0) + here->B4SOIsourceConductance = 1.0 + / here->B4SOIsourceConductance; + else + here->B4SOIsourceConductance = 0.0; + here->B4SOIcgso = pParam->B4SOIcgso; + here->B4SOIcgdo = pParam->B4SOIcgdo; + + + /* v2.0 release */ + if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; + T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; + DEXP(T0,T1); + pParam->B4SOIarfabjt = T1; + + T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); + pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); + pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); + + if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) + pParam->B4SOIvearly = 1; + + /*4.1 toxp calculation*/ + if(model->B4SOImtrlMod==0) + { + model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; + } + else + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + Vtm0eot = KboQ * model->B4SOItempeot; + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(1.0e20 + * pParam->B4SOInpeak / (ni * ni)); + phieot = 2.0 * Vtm0eot + * log(pParam->B4SOInpeak / ni); + sqrtphieot = sqrt(phieot); + tmp2 = here->B4SOIvfb + phieot; + vddeot = model->B4SOItype * model->B4SOIvddeot; + + T0 = model->B4SOIepsrgate * EPS0; + if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) + && (vddeot > tmp2) && (T0!=0)) + { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate + / (model->B4SOIcox * model->B4SOIcox); + T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + /* T7 = 1.12 - T3 - 0.05; */ + T7 = eggdep - T3 - 0.05; /* bugfix v4.3.1 -Tanvir */ + T6 = sqrt(T7 * T7 + 0.224); + /* T5 = 1.12 - 0.5 * (T7 + T6); */ + T5 = eggdep - 0.5 * (T7 + T6); /* bugfix v4.3.1 -Tanvir */ + Vgs_eff = vddeot - T5; + + } + else + { Vgs_eff = vddeot; - } + } - /* Calculate Vth @ Vds=Vbs=0 */ + /* Calculate Vth @ Vds=Vbs=0 */ - V0 = vbieot - phieot; + V0 = vbieot - phieot; - T3 = sqrt(pParam->B4SOIXdep0); + T3 = sqrt(pParam->B4SOIXdep0); - lt1 = model->B4SOIfactor1 * T3; + lt1 = model->B4SOIfactor1 * T3; - ltw= model->B4SOIfactor1 * T3 ; + ltw= model->B4SOIfactor1 * T3 ; - T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); + T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); - } + } - /* Calculate n */ - T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; - T3 = pParam->B4SOIcdsc ; - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + /* Calculate n */ + T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; + T3 = pParam->B4SOIcdsc ; + T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - if (T4 >= -0.5) - { n = 1.0 + T4; + if (T4 >= -0.5) + { n = 1.0 + T4; - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; + } + else + /* avoid discontinuity problems caused by T4 */ + { T0 = 1.0 / (3.0 + 8.0 * T4); + n = (1.0 + 3.0 * T4) * T0; - } + } - /* v4.0 DITS */ - if (pParam->B4SOIdvtp0 > 0.0) { - T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */ - /* T0 = 0.0; - T2 = exp(T0); - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; + /* v4.0 DITS */ + if (pParam->B4SOIdvtp0 > 0.0) { + T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */ + /* T0 = 0.0; + T2 = exp(T0); + if (T0 < -EXPL_THRESHOLD) { + T2 = MIN_EXPL; - } - else { - T2 = exp(T0); + } + else { + T2 = exp(T0); - } end */ + } end */ - T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); + T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); - T4 = Vtmeot * log(model->B4SOIleffeot / T3); + T4 = Vtmeot * log(model->B4SOIleffeot / T3); - DITS_Sft = n * T4; + DITS_Sft = n * T4; - } - else { - DITS_Sft=0.0; + } + else { + DITS_Sft=0.0; - } + } - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; + here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; + Delt_vth = here->B4SOIthetavth * V0; - T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot - * model->B4SOIleffeot / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); + T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot + * model->B4SOIleffeot / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); - } + } - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; + T0 = pParam->B4SOIdvt0w * T2; + DeltVthw = T0 * V0; - TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; + TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot - + T1 * TempRatioMinus1; /* v4.0 */ + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); + DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot + + T1 * TempRatioMinus1; /* v4.0 */ - tmp2 = toxe * phieot - / (model->B4SOIweffeot + pParam->B4SOIw0); + tmp2 = toxe * phieot + / (model->B4SOIweffeot + pParam->B4SOIw0); - DIBL_Sft = 0.0; - DITS_Sft2 = 0.0; + DIBL_Sft = 0.0; + DITS_Sft2 = 0.0; - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); - sqrtPhisExt = sqrtphieot; + sqrtPhisExt = sqrtphieot; - Vth = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhisExt - - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb - - Delt_vth - DeltVthw - +pParam->B4SOIk3 * tmp2 - + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; + Vth = model->B4SOItype * here->B4SOIvth0 + + (pParam->B4SOIk1ox * sqrtPhisExt + - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb + - Delt_vth - DeltVthw + +pParam->B4SOIk3 * tmp2 + + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; - Vgst = Vgs_eff - Vth; + Vgst = Vgs_eff - Vth; - T10 = n * Vtmeot; /* v4.0 */ - VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ + T10 = n * Vtmeot; /* v4.0 */ + VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) - / T10; /* v4.0 */ + ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) + / T10; /* v4.0 */ - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst; + /* T0 is dVgsteff_dVbseff */ - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); - ExpVgst = exp(T0); - Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); + ExpVgst = exp(T0); + Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); + } + else + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); - T3 = (1.0 / model->B4SOItempeot); + T3 = (1.0 / model->B4SOItempeot); - T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar); - T2 = pParam->B4SOImstar - T10 * T4 - / (1.0 - pParam->B4SOImstar); + T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstar); + T2 = pParam->B4SOImstar - T10 * T4 + / (1.0 - pParam->B4SOImstar); - Vgsteff = T1 / T2; + Vgsteff = T1 / T2; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; + } + Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; - /* calculating Toxp */ - T3 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - phieot; + /* calculating Toxp */ + T3 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - phieot; - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; + vtfbphi2eot = 4.0 * T3; + if (vtfbphi2eot < 0.0) + vtfbphi2eot = 0.0; - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); - Tcen = model->B4SOIados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->B4SOItoxp = toxpf; - /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); + Tcen = model->B4SOIados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->B4SOItoxp = toxpf; + /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ - }/*End of Toxp*/ - - /* vfbzb calculation for capMod 3 */ - tmp = sqrt(pParam->B4SOIXdep0); - tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; - tmp2 = model->B4SOIfactor1 * tmp; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff - * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B4SOIdvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->B4SOIdvt0 * T3 * tmp1; - - /* v2.2.3 */ - /*4.1*/ - /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); - */ - T4 = model->B4SOItoxp * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ - T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi - + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) - * (TempRatio - 1.0); /* v4.0 */ - - tmp3 = model->B4SOItype * pParam->B4SOIvth0 - - T2 - T3 + pParam->B4SOIk3 * T4 + T5; - pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 - * pParam->B4SOIsqrtPhi; - /* End of vfbzb */ - - - /* v3.2 */ - pParam->B4SOIqsi = Charge_q * model->B4SOInpeak - * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) - * 1e6 * model->B4SOItsi; - - - /* v3.1 added for RF */ - here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw - + pParam->B4SOIweff / here->B4SOInseg - / 3.0 / model->B4SOIngcon) / - (model->B4SOIngcon * here->B4SOInf * - (here->B4SOIl - model->B4SOIxgl)); - if (here->B4SOIgrgeltd > 0.0) - here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; - else - { here->B4SOIgrgeltd = 1.0e3; /* mho */ - if (here->B4SOIrgateMod !=0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - /* v3.1 added for RF end */ - - /* v4.0 rbodyMod */ - if (here->B4SOIrbodyMod) - { if (here->B4SOIrbdb < 1.0e-3) - here->B4SOIgrbdb = 1.0e3; /* in mho */ - else - here->B4SOIgrbdb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbdb; - if (here->B4SOIrbsb < 1.0e-3) - here->B4SOIgrbsb = 1.0e3; - else - here->B4SOIgrbsb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbsb; - } - /* v4.0 rbodyMod end */ - /* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/ - - here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; - - pParam->B4SOIldeb = sqrt(epssub * Vtm0 / - (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; - - /*For high k mobility*/ - T1 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - pParam->B4SOIphi; - T2 = T1 + T1; - T3 = 2.5 * T1; - here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; - if (here->B4SOIvtfbphi1 < 0.0) - here->B4SOIvtfbphi1 = 0.0; - /*Calculate VgsteffVth for mobMod=4*/ - if(model->B4SOImobMod == 4) - { - /*Calculate n @ Vbs=Vds=0*/ - /*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */ - lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; - /* ltw = lt1; */ /* v4.2 never used in code */ - T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; - if (T0 < EXPL_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXPL; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXPL - 2.0); - - tmp1 = epssub / pParam->B4SOIXdep0; - /*here->B4SOInstar = model->B4SOIvtm / Charge_q * - (model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */ - tmp2 = pParam->B4SOInfactor * tmp1; - tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * Vtm0; - T1 = pParam->B4SOIvoff; - T2 = T1/T0; - if (T2 < -EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else if (T2 > EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else - { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - - } - - here->B4SOIvgsteffvth = T0 * log(2.0)/T4; - - } - - - } + }/*End of Toxp*/ + + /* vfbzb calculation for capMod 3 */ + tmp = sqrt(pParam->B4SOIXdep0); + tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; + tmp2 = model->B4SOIfactor1 * tmp; + + T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff + * pParam->B4SOIleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->B4SOIdvt0w * T2; + T2 = T0 * tmp1; + + T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->B4SOIdvt0 * T3 * tmp1; + + /* v2.2.3 */ + /*4.1*/ + /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi + / (pParam->B4SOIweff + pParam->B4SOIw0); + */ + T4 = model->B4SOItoxp * pParam->B4SOIphi + / (pParam->B4SOIweff + pParam->B4SOIw0); + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ + T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi + + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) + * (TempRatio - 1.0); /* v4.0 */ + + tmp3 = model->B4SOItype * pParam->B4SOIvth0 + - T2 - T3 + pParam->B4SOIk3 * T4 + T5; + pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 + * pParam->B4SOIsqrtPhi; + /* End of vfbzb */ + + + /* v3.2 */ + pParam->B4SOIqsi = Charge_q * model->B4SOInpeak + * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) + * 1e6 * model->B4SOItsi; + + + /* v3.1 added for RF */ + here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw + + pParam->B4SOIweff / here->B4SOInseg + / 3.0 / model->B4SOIngcon) / + (model->B4SOIngcon * here->B4SOInf * + (here->B4SOIl - model->B4SOIxgl)); + if (here->B4SOIgrgeltd > 0.0) + here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; + else + { here->B4SOIgrgeltd = 1.0e3; /* mho */ + if (here->B4SOIrgateMod !=0) + printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); + } + /* v3.1 added for RF end */ + + /* v4.0 rbodyMod */ + if (here->B4SOIrbodyMod) + { if (here->B4SOIrbdb < 1.0e-3) + here->B4SOIgrbdb = 1.0e3; /* in mho */ + else + here->B4SOIgrbdb = model->B4SOIgbmin + + 1.0 / here->B4SOIrbdb; + if (here->B4SOIrbsb < 1.0e-3) + here->B4SOIgrbsb = 1.0e3; + else + here->B4SOIgrbsb = model->B4SOIgbmin + + 1.0 / here->B4SOIrbsb; + } + /* v4.0 rbodyMod end */ + /* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/ + + here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; + + pParam->B4SOIldeb = sqrt(epssub * Vtm0 / + (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; + + /*For high k mobility*/ + T1 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - pParam->B4SOIphi; + T2 = T1 + T1; + T3 = 2.5 * T1; + here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; + if (here->B4SOIvtfbphi1 < 0.0) + here->B4SOIvtfbphi1 = 0.0; + /*Calculate VgsteffVth for mobMod=4*/ + if(model->B4SOImobMod == 4) + { + /*Calculate n @ Vbs=Vds=0*/ + /*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */ + lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; + /* ltw = lt1; */ /* v4.2 never used in code */ + T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; + if (T0 < EXPL_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXPL; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXPL - 2.0); + + tmp1 = epssub / pParam->B4SOIXdep0; + /*here->B4SOInstar = model->B4SOIvtm / Charge_q * + (model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */ + tmp2 = pParam->B4SOInfactor * tmp1; + tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + if (tmp3 >= -0.5) + n0 = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n0 = (1.0 + 3.0 * tmp3) * T0; + } + + T0 = n0 * Vtm0; + T1 = pParam->B4SOIvoff; + T2 = T1/T0; + if (T2 < -EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else if (T2 > EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else + { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + + } + + here->B4SOIvgsteffvth = T0 * log(2.0)/T4; + + } + + + } } return(OK); } diff --git a/src/spicelib/devices/bsim3soi/b4soitrunc.c b/src/spicelib/devices/bsim3soi/b4soitrunc.c index e02ae3517..a23855ce4 100644 --- a/src/spicelib/devices/bsim3soi/b4soitrunc.c +++ b/src/spicelib/devices/bsim3soi/b4soitrunc.c @@ -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 */