1 /* $Id: d_mos7.cc,v 1.2 2010-07-09 12:14:21 felix Exp $ -*- C++ -*-
2 * Copyright (C) 2001 Albert Davis
3 * Author: Albert Davis <aldavis@gnu.org>
5 * This file is part of "Gnucap", the Gnu Circuit Analysis Package
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3, or (at your option)
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 *------------------------------------------------------------------
22 * Berkeley BSIM3v3.1 model
23 * Derived from Spice3f4,Copyright 1990 Regents of the University of California
24 * Author: 1991 JianHui Huang and Min-Chie Jeng.
25 * Recoded for Gnucap model compiler, Al Davis, 2000
27 /* This file is automatically generated. DO NOT EDIT */
30 #include "l_denoise.h"
34 /*--------------------------------------------------------------------------*/
35 const double NA(NOT_INPUT
);
36 const double INF(BIGBIG
);
37 /*--------------------------------------------------------------------------*/
38 int MODEL_BUILT_IN_MOS7::_count
= 0;
39 /*--------------------------------------------------------------------------*/
41 /*--------------------------------------------------------------------------*/
42 namespace MODEL_BUILT_IN_MOS7_DISPATCHER
{
43 static DEV_BUILT_IN_MOS p1d
;
44 static MODEL_BUILT_IN_MOS7
p1(&p1d
);
45 static DISPATCHER
<MODEL_CARD
>::INSTALL
46 d1(&model_dispatcher
, "nmos7|pmos7", &p1
);
48 /*--------------------------------------------------------------------------*/
49 void SDP_BUILT_IN_MOS7::init(const COMMON_COMPONENT
* cc
)
52 SDP_BUILT_IN_MOS_BASE::init(cc
);
53 const COMMON_BUILT_IN_MOS
* c
= prechecked_cast
<const COMMON_BUILT_IN_MOS
*>(cc
);
55 const MODEL_BUILT_IN_MOS7
* m
= prechecked_cast
<const MODEL_BUILT_IN_MOS7
*>(c
->model());
57 const CARD_LIST
* par_scope
= m
->scope();
61 double T0
= pow(c
->l_in
, m
->Lln
);
62 double T1
= pow(c
->w_in
, m
->Lwn
);
63 double tmp1
= m
->Ll
/ T0
+ m
->Lw
/ T1
+ m
->Lwl
/ (T0
* T1
);
68 double T2
= pow(c
->l_in
, m
->Wln
);
69 double T3
= pow(c
->w_in
, m
->Wwn
);
70 double tmp2
= m
->Wl
/ T2
+ m
->Ww
/ T3
+ m
->Wwl
/ (T2
* T3
);
75 leff
= c
->l_in
- 2.0 * dl
;
76 weff
= c
->w_in
- 2.0 * dw
;
77 leffCV
= c
->l_in
- 2.0 * dlc
;
78 weffCV
= c
->w_in
- 2.0 * dwc
;
79 cgate
= m
->cox
* w_eff
* l_eff
; /* BUG:: not adjusted values?? */
82 if (m
->binUnit
== 1) {
88 cdsc
= m
->cdsc(L
, W
, 2.4e-4, par_scope
);
89 cdscb
= m
->cdscb(L
, W
, 0.0, par_scope
);
90 cdscd
= m
->cdscd(L
, W
, 0.0, par_scope
);
91 cit
= m
->cit(L
, W
, 0.0, par_scope
);
92 nfactor
= m
->nfactor(L
, W
, 1, par_scope
);
93 xj
= m
->xj(L
, W
, .15e-6, par_scope
);
94 vsat
= m
->vsat(L
, W
, 8.0e4
, par_scope
);
95 at
= m
->at(L
, W
, 3.3e4
, par_scope
);
96 a0
= m
->a0(L
, W
, 1.0, par_scope
);
97 ags
= m
->ags(L
, W
, 0.0, par_scope
);
98 a1
= m
->a1(L
, W
, 0.0, par_scope
);
99 a2
= m
->a2(L
, W
, 1.0, par_scope
);
100 keta
= m
->keta(L
, W
, -0.047, par_scope
);
101 nsub
= m
->nsub(L
, W
, 6.0e16
, par_scope
);
102 npeak
= m
->npeak(L
, W
, NA
, par_scope
);
103 ngate
= m
->ngate(L
, W
, 0.0, par_scope
);
104 gamma1
= m
->gamma1(L
, W
, NA
, par_scope
);
105 gamma2
= m
->gamma2(L
, W
, NA
, par_scope
);
106 vbx
= m
->vbx(L
, W
, NA
, par_scope
);
107 vbm
= m
->vbm(L
, W
, -3.0, par_scope
);
108 xt
= m
->xt(L
, W
, 1.55e-7, par_scope
);
109 k1
= m
->k1(L
, W
, NA
, par_scope
);
110 kt1
= m
->kt1(L
, W
, -0.11, par_scope
);
111 kt1l
= m
->kt1l(L
, W
, 0.0, par_scope
);
112 kt2
= m
->kt2(L
, W
, 0.022, par_scope
);
113 k2
= m
->k2(L
, W
, NA
, par_scope
);
114 k3
= m
->k3(L
, W
, 80.0, par_scope
);
115 k3b
= m
->k3b(L
, W
, 0.0, par_scope
);
116 w0
= m
->w0(L
, W
, 2.5e-6, par_scope
);
117 nlx
= m
->nlx(L
, W
, 1.74e-7, par_scope
);
118 dvt0
= m
->dvt0(L
, W
, 2.2, par_scope
);
119 dvt1
= m
->dvt1(L
, W
, 0.53, par_scope
);
120 dvt2
= m
->dvt2(L
, W
, -0.032, par_scope
);
121 dvt0w
= m
->dvt0w(L
, W
, 0.0, par_scope
);
122 dvt1w
= m
->dvt1w(L
, W
, 5.3e6
, par_scope
);
123 dvt2w
= m
->dvt2w(L
, W
, -0.032, par_scope
);
124 drout
= m
->drout(L
, W
, 0.56, par_scope
);
125 dsub
= m
->dsub(L
, W
, drout
, par_scope
);
130 vth0
= m
->vth0(L
, W
, NA
, par_scope
);
135 ua1
= m
->ua1(L
, W
, 4.31e-9, par_scope
);
136 ua
= m
->ua(L
, W
, 2.25e-9, par_scope
);
137 ub1
= m
->ub1(L
, W
, -7.61e-18, par_scope
);
138 ub
= m
->ub(L
, W
, 5.87e-19, par_scope
);
139 uc1
= m
->uc1(L
, W
, ((m
->mobMod
==3) ? -0.056 : -0.056e-9), par_scope
);
141 uc1
= ((m
->mobMod
==3) ? -0.056 : -0.056e-9);
144 uc
= m
->uc(L
, W
, ((m
->mobMod
==3) ? -0.0465 : -0.0465e-9), par_scope
);
146 uc
= ((m
->mobMod
==3) ? -0.0465 : -0.0465e-9);
149 u0
= m
->u0(L
, W
, ((m
->polarity
== pN
) ? 0.067 : 0.025), par_scope
);
151 u0
= ((m
->polarity
== pN
) ? 0.067 : 0.025);
154 ute
= m
->ute(L
, W
, -1.5, par_scope
);
155 voff
= m
->voff(L
, W
, -0.08, par_scope
);
156 delta
= m
->delta(L
, W
, 0.01, par_scope
);
157 rdsw
= m
->rdsw(L
, W
, 0.0, par_scope
);
158 prwg
= m
->prwg(L
, W
, 0.0, par_scope
);
159 prwb
= m
->prwb(L
, W
, 0.0, par_scope
);
160 prt
= m
->prt(L
, W
, 0.0, par_scope
);
161 eta0
= m
->eta0(L
, W
, 0.08, par_scope
);
162 etab
= m
->etab(L
, W
, -0.07, par_scope
);
163 pclm
= m
->pclm(L
, W
, 1.3, par_scope
);
164 pdibl1
= m
->pdibl1(L
, W
, .39, par_scope
);
165 pdibl2
= m
->pdibl2(L
, W
, 0.0086, par_scope
);
166 pdiblb
= m
->pdiblb(L
, W
, 0.0, par_scope
);
167 pscbe1
= m
->pscbe1(L
, W
, 4.24e8
, par_scope
);
168 pscbe2
= m
->pscbe2(L
, W
, 1.0e-5, par_scope
);
169 pvag
= m
->pvag(L
, W
, 0.0, par_scope
);
170 wr
= m
->wr(L
, W
, 1.0, par_scope
);
171 dwg
= m
->dwg(L
, W
, 0.0, par_scope
);
172 dwb
= m
->dwb(L
, W
, 0.0, par_scope
);
173 b0
= m
->b0(L
, W
, 0.0, par_scope
);
174 b1
= m
->b1(L
, W
, 0.0, par_scope
);
175 alpha0
= m
->alpha0(L
, W
, 0.0, par_scope
);
176 beta0
= m
->beta0(L
, W
, 30.0, par_scope
);
177 elm
= m
->elm(L
, W
, 5.0, par_scope
);
178 vfbcv
= m
->vfbcv(L
, W
, -1.0, par_scope
);
179 cgsl
= m
->cgsl(L
, W
, 0.0, par_scope
);
180 cgdl
= m
->cgdl(L
, W
, 0.0, par_scope
);
181 ckappa
= m
->ckappa(L
, W
, 0.6, par_scope
);
182 cf
= m
->cf(L
, W
, 2.0 * P_EPS_OX
/ M_PI
* log(1.0 + 0.4e-6 / m
->tox
), par_scope
);
184 cf
= 2.0 * P_EPS_OX
/ M_PI
* log(1.0 + 0.4e-6 / m
->tox
);
187 clc
= m
->clc(L
, W
, 0.1e-6, par_scope
);
188 cle
= m
->cle(L
, W
, 0.6, par_scope
);
189 // adjust: calculated
190 abulkCVfactor
= 1.0 + pow((clc
/ leff
), cle
);
191 cgso
= (m
->cgso
+ cf
) * weffCV
;
192 cgdo
= (m
->cgdo
+ cf
) * weffCV
;
193 cgbo
= m
->cgbo
* leffCV
;
194 litl
= sqrt(3.0 * xj
* m
->tox
);
200 if (m
->npeak
.nom() == NA
) {
201 if (m
->gamma1
.nom() != NA
) {
202 double T0
= gamma1
* m
->cox
;
203 npeak
= 3.021E22
* T0
* T0
;
208 if (m
->k1
.nom() != NA
&& m
->k2
.nom() != NA
) {
209 if (m
->k1
.nom() == NA
) {
212 if (m
->k2
.nom() == NA
) {
216 vbm
= -std::abs(vbm
);
217 if (m
->gamma1
.nom() == NA
) {
218 gamma1
= 5.753e-12 * sqrt(npeak
) / m
->cox
;
220 if (m
->gamma2
.nom() == NA
) {
221 gamma2
= 5.753e-12 * sqrt(nsub
) / m
->cox
;
225 /*--------------------------------------------------------------------------*/
226 TDP_BUILT_IN_MOS7::TDP_BUILT_IN_MOS7(const DEV_BUILT_IN_MOS
* d
)
227 :TDP_BUILT_IN_MOS_BASE(d
)
230 const COMMON_BUILT_IN_MOS
* c
= prechecked_cast
<const COMMON_BUILT_IN_MOS
*>(d
->common());
232 const SDP_BUILT_IN_MOS7
* s
= prechecked_cast
<const SDP_BUILT_IN_MOS7
*>(c
->sdp());
234 const MODEL_BUILT_IN_MOS7
* m
= prechecked_cast
<const MODEL_BUILT_IN_MOS7
*>(c
->model());
236 const CARD_LIST
* par_scope
= d
->scope();
237 assert(par_scope
); USE(par_scope
);
238 // final adjust: code_pre
240 temp
= d
->_sim
->_temp_c
+ P_CELSIUS0
;
241 double egap
= 1.16 - 7.02e-4 * temp
* temp
/ (temp
+ 1108.0);
242 // final adjust: override
245 // final adjust: calculated
246 tempratio
= temp
/ m
->tnom_k
;
247 tempratio_1
= tempratio
- 1;
249 // final adjust: post
251 double jctTempSatCurDensity
;
252 double jctSidewallTempSatCurDensity
;
253 if (temp
!= m
->tnom_k
) {
254 double T0
= m
->egap
/ m
->vt_at_tnom
- egap
/ vtm
+ m
->jctTempExponent
255 * log(temp
/ m
->tnom_k
);
256 double T1
= exp(T0
/ m
->jctEmissionCoeff
);
257 jctTempSatCurDensity
= m
->js
* T1
;
258 jctSidewallTempSatCurDensity
= m
->jctSidewallSatCurDensity
* T1
;
260 jctTempSatCurDensity
= m
->js
;
261 jctSidewallTempSatCurDensity
= m
->jctSidewallSatCurDensity
;
263 if (jctTempSatCurDensity
< 0.0) {
264 jctTempSatCurDensity
= 0.0;
266 if (jctSidewallTempSatCurDensity
< 0.0) {
267 jctSidewallTempSatCurDensity
= 0.0;
270 double T0
= (tempratio
- 1.0);
271 ua
= s
->ua
+ s
->ua1
* T0
;
272 ub
= s
->ub
+ s
->ub1
* T0
;
273 uc
= s
->uc
+ s
->uc1
* T0
;
274 u0temp
= s
->u0
* pow(tempratio
, s
->ute
);
275 vsattemp
= s
->vsat
- s
->at
* T0
;
276 rds0
= (s
->rdsw
+ s
->prt
* T0
) / pow(s
->weff
* 1E6
, s
->wr
);
278 phi
= 2.0 * m
->vt_at_tnom
* log(s
->npeak
/ m
->ni
);
280 phis3
= sqrtPhi
* phi
;
281 Xdep0
= sqrt(2.0 * P_EPS_SI
/ (P_Q
* s
->npeak
* 1.0e6
)) * sqrtPhi
;
282 vbi
= m
->vt_at_tnom
* log(1.0e20
* s
->npeak
/ (m
->ni
* m
->ni
));
283 cdep0
= sqrt(P_Q
* P_EPS_SI
* s
->npeak
* 1.0e6
/ 2.0 / phi
);
285 if (m
->k1
.nom() != NA
&& m
->k2
.nom() != NA
) {
289 double vbx
= (m
->vbx
.nom() == NA
)
290 ? -std::abs(phi
- 7.7348e-4 * s
->npeak
* s
->xt
* s
->xt
)
292 double T0
= s
->gamma1
- s
->gamma2
;
293 double T1
= sqrt(phi
- vbx
) - sqrtPhi
;
294 double T2
= sqrt(phi
* (phi
- s
->vbm
)) - phi
;
295 k2
= T0
* T1
/ (2.0 * T2
+ s
->vbm
);
296 k1
= s
->gamma2
- 2.0 * k2
* sqrt(phi
- s
->vbm
);
299 double T0
= 0.5 * k1
/ k2
;
300 vbsc
= to_range(-30.0, (0.9 * (phi
- T0
* T0
)), -3.0);
304 vbsc
= std::min(vbsc
, s
->vbm
);
307 vth0
= m
->polarity
* (vfb
+ phi
+ k1
* sqrtPhi
);
310 vfb
= m
->polarity
* vth0
- phi
- k1
* sqrtPhi
;
312 trace3("", s
->vth0
, vth0
, vfb
);
314 double T1
= sqrt(P_EPS_SI
/ P_EPS_OX
* m
->tox
* Xdep0
);
315 double T0
= exp(-0.5 * s
->dsub
* s
->leff
/ T1
);
316 theta0vb0
= (T0
+ 2.0 * T0
* T0
);
318 T0
= exp(-0.5 * s
->drout
* s
->leff
/ T1
);
319 double T2
= (T0
+ 2.0 * T0
* T0
);
320 thetaRout
= s
->pdibl1
* T2
+ s
->pdibl2
;
322 // final adjust: done
324 /*--------------------------------------------------------------------------*/
325 MODEL_BUILT_IN_MOS7::MODEL_BUILT_IN_MOS7(const BASE_SUBCKT
* p
)
326 :MODEL_BUILT_IN_MOS_BASE(p
),
413 jctSidewallSatCurDensity(0.0),
416 unitLengthGateSidewallJctCap(NA
),
417 jctEmissionCoeff(1.0),
418 jctTempExponent(3.0),
443 if (ENV::run_mode
!= rPRE_MAIN
) {
447 set_default(&mjsw
, NA
);
448 set_default(&pb
, NA
);
449 set_default(&pbsw
, NA
);
450 set_default(&cjo
, 5.0E-4);
451 set_default(&cgdo
, NA
);
452 set_default(&cgso
, NA
);
453 set_default(&cgbo
, NA
);
454 set_default(&mos_level
, LEVEL
);
456 /*--------------------------------------------------------------------------*/
457 MODEL_BUILT_IN_MOS7::MODEL_BUILT_IN_MOS7(const MODEL_BUILT_IN_MOS7
& p
)
458 :MODEL_BUILT_IN_MOS_BASE(p
),
540 paramChk(p
.paramChk
),
545 jctSidewallSatCurDensity(p
.jctSidewallSatCurDensity
),
548 unitLengthGateSidewallJctCap(p
.unitLengthGateSidewallJctCap
),
549 jctEmissionCoeff(p
.jctEmissionCoeff
),
550 jctTempExponent(p
.jctTempExponent
),
572 vt_at_tnom(p
.vt_at_tnom
),
575 if (ENV::run_mode
!= rPRE_MAIN
) {
577 }else{untested();//194
580 /*--------------------------------------------------------------------------*/
581 std::string
MODEL_BUILT_IN_MOS7::dev_type()const
583 if (polarity
== pN
) {
585 }else if (polarity
== pP
) {
587 }else{untested();//235
588 return MODEL_BUILT_IN_MOS_BASE::dev_type();
591 /*--------------------------------------------------------------------------*/
592 void MODEL_BUILT_IN_MOS7::set_dev_type(const std::string
& new_type
)
594 if (Umatch(new_type
, "nmos7 ")) {
596 }else if (Umatch(new_type
, "pmos7 ")) {
599 MODEL_BUILT_IN_MOS_BASE::set_dev_type(new_type
);
602 /*--------------------------------------------------------------------------*/
603 void MODEL_BUILT_IN_MOS7::precalc_first()
605 const CARD_LIST
* par_scope
= scope();
607 MODEL_BUILT_IN_MOS_BASE::precalc_first();
608 e_val(&(this->capMod
), 2, par_scope
);
609 e_val(&(this->nqsMod
), 0, par_scope
);
610 e_val(&(this->mobMod
), 1, par_scope
);
611 e_val(&(this->noiMod
), 1, par_scope
);
612 e_val(&(this->paramChk
), 0, par_scope
);
613 e_val(&(this->binUnit
), 1, par_scope
);
614 e_val(&(this->version
), 3.1, par_scope
);
615 e_val(&(this->tox
), 150.0e-10, par_scope
);
616 e_val(&(this->xpart
), 0.0, par_scope
);
617 e_val(&(this->jctSidewallSatCurDensity
), 0.0, par_scope
);
618 e_val(&(this->mjswg
), NA
, par_scope
);
619 e_val(&(this->pbswg
), NA
, par_scope
);
620 e_val(&(this->unitLengthGateSidewallJctCap
), NA
, par_scope
);
621 e_val(&(this->jctEmissionCoeff
), 1.0, par_scope
);
622 e_val(&(this->jctTempExponent
), 3.0, par_scope
);
623 e_val(&(this->Lint
), 0.0, par_scope
);
624 e_val(&(this->Ll
), 0.0, par_scope
);
625 e_val(&(this->Lln
), 1.0, par_scope
);
626 e_val(&(this->Lw
), 0.0, par_scope
);
627 e_val(&(this->Lwn
), 1.0, par_scope
);
628 e_val(&(this->Lwl
), 0.0, par_scope
);
629 e_val(&(this->Wint
), 0.0, par_scope
);
630 e_val(&(this->Wl
), 0.0, par_scope
);
631 e_val(&(this->Wln
), 1.0, par_scope
);
632 e_val(&(this->Ww
), 0.0, par_scope
);
633 e_val(&(this->Wwn
), 1.0, par_scope
);
634 e_val(&(this->Wwl
), 0.0, par_scope
);
635 e_val(&(this->dwc
), NA
, par_scope
);
636 e_val(&(this->dlc
), NA
, par_scope
);
637 e_val(&(this->noia
), NA
, par_scope
);
638 e_val(&(this->noib
), NA
, par_scope
);
639 e_val(&(this->noic
), NA
, par_scope
);
640 e_val(&(this->em
), 4.1e7
, par_scope
);
641 e_val(&(this->ef
), 1.0, par_scope
);
642 // final adjust: code_pre
644 //tox = std::max(tox, 1e-20);
645 cox
= 3.453133e-11 / tox
;
646 // final adjust: override
655 //pb = std::max(pb, 0.1);
660 //pbsw = std::max(pbsw, 0.1);
662 cgdo
= (((dlc
!= NA
) && (dlc
> 0.0))
663 ? dlc
* cox
- cgdl
.nom()
664 : 0.6 * xj
.nom() * cox
);
668 cgso
= (((dlc
!= NA
) && (dlc
> 0.0))
669 ? dlc
* cox
- cgsl
.nom()
670 : 0.6 * xj
.nom() * cox
);
679 cmodel
= ((!cmodel
)?1:cmodel
);
680 needs_isub
= (alpha0
.nom()!=0.);
682 e_val(&(this->capMod
), 2, par_scope
);
683 e_val(&(this->nqsMod
), 0, par_scope
);
684 e_val(&(this->mobMod
), 1, par_scope
);
685 e_val(&(this->noiMod
), 1, par_scope
);
686 e_val(&(this->paramChk
), 0, par_scope
);
687 e_val(&(this->binUnit
), 1, par_scope
);
688 e_val(&(this->version
), 3.1, par_scope
);
689 e_val(&(this->tox
), 150.0e-10, par_scope
);
690 e_val(&(this->xpart
), 0.0, par_scope
);
691 e_val(&(this->jctSidewallSatCurDensity
), 0.0, par_scope
);
692 e_val(&(this->mjswg
), mjsw
, par_scope
);
693 e_val(&(this->pbswg
), pbsw
, par_scope
);
694 //this->pbswg = std::max(pbswg, 0.1);
695 e_val(&(this->unitLengthGateSidewallJctCap
), cjsw
, par_scope
);
696 e_val(&(this->jctEmissionCoeff
), 1.0, par_scope
);
697 e_val(&(this->jctTempExponent
), 3.0, par_scope
);
698 e_val(&(this->Lint
), 0.0, par_scope
);
699 e_val(&(this->Ll
), 0.0, par_scope
);
700 e_val(&(this->Lln
), 1.0, par_scope
);
701 e_val(&(this->Lw
), 0.0, par_scope
);
702 e_val(&(this->Lwn
), 1.0, par_scope
);
703 e_val(&(this->Lwl
), 0.0, par_scope
);
704 e_val(&(this->Wint
), 0.0, par_scope
);
705 e_val(&(this->Wl
), 0.0, par_scope
);
706 e_val(&(this->Wln
), 1.0, par_scope
);
707 e_val(&(this->Ww
), 0.0, par_scope
);
708 e_val(&(this->Wwn
), 1.0, par_scope
);
709 e_val(&(this->Wwl
), 0.0, par_scope
);
710 e_val(&(this->dwc
), Wint
, par_scope
);
711 e_val(&(this->dlc
), Lint
, par_scope
);
712 e_val(&(this->noia
), (polarity
==pN
) ? 1e20
: 9.9e18
, par_scope
);
713 e_val(&(this->noib
), (polarity
==pN
) ? 5e4
: 2.4e3
, par_scope
);
714 e_val(&(this->noic
), (polarity
==pN
) ?-1.4e-12 :1.4e-12, par_scope
);
715 e_val(&(this->em
), 4.1e7
, par_scope
);
716 e_val(&(this->ef
), 1.0, par_scope
);
718 // final adjust: calculated
719 factor1
= sqrt(tox
* P_EPS_SI
/ P_EPS_OX
);
720 vt_at_tnom
= tnom_k
* P_K_Q
;
721 ni
= (1.45e10
* (tnom_k
/ 300.15)
722 * sqrt(tnom_k
/ 300.15)
723 * exp(21.5565981 - egap
/ (2.0 * vt_at_tnom
)));
724 // final adjust: post
726 if (npeak
.has_good_value() && npeak
.nom() > 1.0e20
) {
727 npeak
.set_nom(npeak
.nom() * 1.0e-6);
729 if (ngate
.has_good_value() && ngate
.nom() > 1.0e23
) {
730 ngate
.set_nom(ngate
.nom() * 1.0e-6);
732 // final adjust: done
734 /*--------------------------------------------------------------------------*/
735 void MODEL_BUILT_IN_MOS7::precalc_last()
737 MODEL_BUILT_IN_MOS_BASE::precalc_last();
739 /*--------------------------------------------------------------------------*/
740 SDP_CARD
* MODEL_BUILT_IN_MOS7::new_sdp(COMMON_COMPONENT
* c
)const
743 if (COMMON_BUILT_IN_MOS
* cc
= dynamic_cast<COMMON_BUILT_IN_MOS
*>(c
)) {
749 return new SDP_BUILT_IN_MOS7(c
);
752 return MODEL_BUILT_IN_MOS_BASE::new_sdp(c
);
755 /*--------------------------------------------------------------------------*/
756 void MODEL_BUILT_IN_MOS7::set_param_by_index(int i
, std::string
& value
, int offset
)
758 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i
) {
759 case 0: level
= value
; break; //7
760 case 1: unreachable(); break;
761 case 2: unreachable(); break;
762 case 3: unreachable(); break;
763 case 4: unreachable(); break;
764 case 5: unreachable(); break;
765 case 6: unreachable(); break;
766 case 7: unreachable(); break;
767 case 8: unreachable(); break;
768 case 9: unreachable(); break;
769 case 10: mos_level
= value
; break;
770 case 11: cdsc
.set_nom(value
); break;
771 case 12: cdsc
.set_w(value
); break;
772 case 13: cdsc
.set_l(value
); break;
773 case 14: cdsc
.set_p(value
); break;
774 case 15: cdscb
.set_nom(value
); break;
775 case 16: cdscb
.set_w(value
); break;
776 case 17: cdscb
.set_l(value
); break;
777 case 18: cdscb
.set_p(value
); break;
778 case 19: cdscd
.set_nom(value
); break;
779 case 20: cdscd
.set_w(value
); break;
780 case 21: cdscd
.set_l(value
); break;
781 case 22: cdscd
.set_p(value
); break;
782 case 23: cit
.set_nom(value
); break;
783 case 24: cit
.set_w(value
); break;
784 case 25: cit
.set_l(value
); break;
785 case 26: cit
.set_p(value
); break;
786 case 27: nfactor
.set_nom(value
); break;
787 case 28: nfactor
.set_w(value
); break;
788 case 29: nfactor
.set_l(value
); break;
789 case 30: nfactor
.set_p(value
); break;
790 case 31: xj
.set_nom(value
); break;
791 case 32: xj
.set_w(value
); break;
792 case 33: xj
.set_l(value
); break;
793 case 34: xj
.set_p(value
); break;
794 case 35: vsat
.set_nom(value
); break;
795 case 36: vsat
.set_w(value
); break;
796 case 37: vsat
.set_l(value
); break;
797 case 38: vsat
.set_p(value
); break;
798 case 39: at
.set_nom(value
); break;
799 case 40: at
.set_w(value
); break;
800 case 41: at
.set_l(value
); break;
801 case 42: at
.set_p(value
); break;
802 case 43: a0
.set_nom(value
); break;
803 case 44: a0
.set_w(value
); break;
804 case 45: a0
.set_l(value
); break;
805 case 46: a0
.set_p(value
); break;
806 case 47: ags
.set_nom(value
); break;
807 case 48: ags
.set_w(value
); break;
808 case 49: ags
.set_l(value
); break;
809 case 50: ags
.set_p(value
); break;
810 case 51: a1
.set_nom(value
); break;
811 case 52: a1
.set_w(value
); break;
812 case 53: a1
.set_l(value
); break;
813 case 54: a1
.set_p(value
); break;
814 case 55: a2
.set_nom(value
); break;
815 case 56: a2
.set_w(value
); break;
816 case 57: a2
.set_l(value
); break;
817 case 58: a2
.set_p(value
); break;
818 case 59: keta
.set_nom(value
); break;
819 case 60: keta
.set_w(value
); break;
820 case 61: keta
.set_l(value
); break;
821 case 62: keta
.set_p(value
); break;
822 case 63: nsub
.set_nom(value
); break;
823 case 64: nsub
.set_w(value
); break;
824 case 65: nsub
.set_l(value
); break;
825 case 66: nsub
.set_p(value
); break;
826 case 67: npeak
.set_nom(value
); break;
827 case 68: npeak
.set_w(value
); break;
828 case 69: npeak
.set_l(value
); break;
829 case 70: npeak
.set_p(value
); break;
830 case 71: ngate
.set_nom(value
); break;
831 case 72: ngate
.set_w(value
); break;
832 case 73: ngate
.set_l(value
); break;
833 case 74: ngate
.set_p(value
); break;
834 case 75: gamma1
.set_nom(value
); break;
835 case 76: gamma1
.set_w(value
); break;
836 case 77: gamma1
.set_l(value
); break;
837 case 78: gamma1
.set_p(value
); break;
838 case 79: gamma2
.set_nom(value
); break;
839 case 80: gamma2
.set_w(value
); break;
840 case 81: gamma2
.set_l(value
); break;
841 case 82: gamma2
.set_p(value
); break;
842 case 83: vbx
.set_nom(value
); break;
843 case 84: vbx
.set_w(value
); break;
844 case 85: vbx
.set_l(value
); break;
845 case 86: vbx
.set_p(value
); break;
846 case 87: vbm
.set_nom(value
); break;
847 case 88: vbm
.set_w(value
); break;
848 case 89: vbm
.set_l(value
); break;
849 case 90: vbm
.set_p(value
); break;
850 case 91: xt
.set_nom(value
); break;
851 case 92: xt
.set_w(value
); break;
852 case 93: xt
.set_l(value
); break;
853 case 94: xt
.set_p(value
); break;
854 case 95: k1
.set_nom(value
); break;
855 case 96: k1
.set_w(value
); break;
856 case 97: k1
.set_l(value
); break;
857 case 98: k1
.set_p(value
); break;
858 case 99: kt1
.set_nom(value
); break;
859 case 100: kt1
.set_w(value
); break;
860 case 101: kt1
.set_l(value
); break;
861 case 102: kt1
.set_p(value
); break;
862 case 103: kt1l
.set_nom(value
); break;
863 case 104: kt1l
.set_w(value
); break;
864 case 105: kt1l
.set_l(value
); break;
865 case 106: kt1l
.set_p(value
); break;
866 case 107: kt2
.set_nom(value
); break;
867 case 108: kt2
.set_w(value
); break;
868 case 109: kt2
.set_l(value
); break;
869 case 110: kt2
.set_p(value
); break;
870 case 111: k2
.set_nom(value
); break;
871 case 112: k2
.set_w(value
); break;
872 case 113: k2
.set_l(value
); break;
873 case 114: k2
.set_p(value
); break;
874 case 115: k3
.set_nom(value
); break;
875 case 116: k3
.set_w(value
); break;
876 case 117: k3
.set_l(value
); break;
877 case 118: k3
.set_p(value
); break;
878 case 119: k3b
.set_nom(value
); break;
879 case 120: k3b
.set_w(value
); break;
880 case 121: k3b
.set_l(value
); break;
881 case 122: k3b
.set_p(value
); break;
882 case 123: w0
.set_nom(value
); break;
883 case 124: w0
.set_w(value
); break;
884 case 125: w0
.set_l(value
); break;
885 case 126: w0
.set_p(value
); break;
886 case 127: nlx
.set_nom(value
); break;
887 case 128: nlx
.set_w(value
); break;
888 case 129: nlx
.set_l(value
); break;
889 case 130: nlx
.set_p(value
); break;
890 case 131: dvt0
.set_nom(value
); break;
891 case 132: dvt0
.set_w(value
); break;
892 case 133: dvt0
.set_l(value
); break;
893 case 134: dvt0
.set_p(value
); break;
894 case 135: dvt1
.set_nom(value
); break;
895 case 136: dvt1
.set_w(value
); break;
896 case 137: dvt1
.set_l(value
); break;
897 case 138: dvt1
.set_p(value
); break;
898 case 139: dvt2
.set_nom(value
); break;
899 case 140: dvt2
.set_w(value
); break;
900 case 141: dvt2
.set_l(value
); break;
901 case 142: dvt2
.set_p(value
); break;
902 case 143: dvt0w
.set_nom(value
); break;
903 case 144: dvt0w
.set_w(value
); break;
904 case 145: dvt0w
.set_l(value
); break;
905 case 146: dvt0w
.set_p(value
); break;
906 case 147: dvt1w
.set_nom(value
); break;
907 case 148: dvt1w
.set_w(value
); break;
908 case 149: dvt1w
.set_l(value
); break;
909 case 150: dvt1w
.set_p(value
); break;
910 case 151: dvt2w
.set_nom(value
); break;
911 case 152: dvt2w
.set_w(value
); break;
912 case 153: dvt2w
.set_l(value
); break;
913 case 154: dvt2w
.set_p(value
); break;
914 case 155: drout
.set_nom(value
); break;
915 case 156: drout
.set_w(value
); break;
916 case 157: drout
.set_l(value
); break;
917 case 158: drout
.set_p(value
); break;
918 case 159: dsub
.set_nom(value
); break;
919 case 160: dsub
.set_w(value
); break;
920 case 161: dsub
.set_l(value
); break;
921 case 162: dsub
.set_p(value
); break;
922 case 163: vth0
.set_nom(value
); break;
923 case 164: vth0
.set_w(value
); break;
924 case 165: vth0
.set_l(value
); break;
925 case 166: vth0
.set_p(value
); break;
926 case 167: ua1
.set_nom(value
); break;
927 case 168: ua1
.set_w(value
); break;
928 case 169: ua1
.set_l(value
); break;
929 case 170: ua1
.set_p(value
); break;
930 case 171: ua
.set_nom(value
); break;
931 case 172: ua
.set_w(value
); break;
932 case 173: ua
.set_l(value
); break;
933 case 174: ua
.set_p(value
); break;
934 case 175: ub1
.set_nom(value
); break;
935 case 176: ub1
.set_w(value
); break;
936 case 177: ub1
.set_l(value
); break;
937 case 178: ub1
.set_p(value
); break;
938 case 179: ub
.set_nom(value
); break;
939 case 180: ub
.set_w(value
); break;
940 case 181: ub
.set_l(value
); break;
941 case 182: ub
.set_p(value
); break;
942 case 183: uc1
.set_nom(value
); break;
943 case 184: uc1
.set_w(value
); break;
944 case 185: uc1
.set_l(value
); break;
945 case 186: uc1
.set_p(value
); break;
946 case 187: uc
.set_nom(value
); break;
947 case 188: uc
.set_w(value
); break;
948 case 189: uc
.set_l(value
); break;
949 case 190: uc
.set_p(value
); break;
950 case 191: u0
.set_nom(value
); break;
951 case 192: u0
.set_w(value
); break;
952 case 193: u0
.set_l(value
); break;
953 case 194: u0
.set_p(value
); break;
954 case 195: ute
.set_nom(value
); break;
955 case 196: ute
.set_w(value
); break;
956 case 197: ute
.set_l(value
); break;
957 case 198: ute
.set_p(value
); break;
958 case 199: voff
.set_nom(value
); break;
959 case 200: voff
.set_w(value
); break;
960 case 201: voff
.set_l(value
); break;
961 case 202: voff
.set_p(value
); break;
962 case 203: delta
.set_nom(value
); break;
963 case 204: delta
.set_w(value
); break;
964 case 205: delta
.set_l(value
); break;
965 case 206: delta
.set_p(value
); break;
966 case 207: rdsw
.set_nom(value
); break;
967 case 208: rdsw
.set_w(value
); break;
968 case 209: rdsw
.set_l(value
); break;
969 case 210: rdsw
.set_p(value
); break;
970 case 211: prwg
.set_nom(value
); break;
971 case 212: prwg
.set_w(value
); break;
972 case 213: prwg
.set_l(value
); break;
973 case 214: prwg
.set_p(value
); break;
974 case 215: prwb
.set_nom(value
); break;
975 case 216: prwb
.set_w(value
); break;
976 case 217: prwb
.set_l(value
); break;
977 case 218: prwb
.set_p(value
); break;
978 case 219: prt
.set_nom(value
); break;
979 case 220: prt
.set_w(value
); break;
980 case 221: prt
.set_l(value
); break;
981 case 222: prt
.set_p(value
); break;
982 case 223: eta0
.set_nom(value
); break;
983 case 224: eta0
.set_w(value
); break;
984 case 225: eta0
.set_l(value
); break;
985 case 226: eta0
.set_p(value
); break;
986 case 227: etab
.set_nom(value
); break;
987 case 228: etab
.set_w(value
); break;
988 case 229: etab
.set_l(value
); break;
989 case 230: etab
.set_p(value
); break;
990 case 231: pclm
.set_nom(value
); break;
991 case 232: pclm
.set_w(value
); break;
992 case 233: pclm
.set_l(value
); break;
993 case 234: pclm
.set_p(value
); break;
994 case 235: pdibl1
.set_nom(value
); break;
995 case 236: pdibl1
.set_w(value
); break;
996 case 237: pdibl1
.set_l(value
); break;
997 case 238: pdibl1
.set_p(value
); break;
998 case 239: pdibl2
.set_nom(value
); break;
999 case 240: pdibl2
.set_w(value
); break;
1000 case 241: pdibl2
.set_l(value
); break;
1001 case 242: pdibl2
.set_p(value
); break;
1002 case 243: pdiblb
.set_nom(value
); break;
1003 case 244: pdiblb
.set_w(value
); break;
1004 case 245: pdiblb
.set_l(value
); break;
1005 case 246: pdiblb
.set_p(value
); break;
1006 case 247: pscbe1
.set_nom(value
); break;
1007 case 248: pscbe1
.set_w(value
); break;
1008 case 249: pscbe1
.set_l(value
); break;
1009 case 250: pscbe1
.set_p(value
); break;
1010 case 251: pscbe2
.set_nom(value
); break;
1011 case 252: pscbe2
.set_w(value
); break;
1012 case 253: pscbe2
.set_l(value
); break;
1013 case 254: pscbe2
.set_p(value
); break;
1014 case 255: pvag
.set_nom(value
); break;
1015 case 256: pvag
.set_w(value
); break;
1016 case 257: pvag
.set_l(value
); break;
1017 case 258: pvag
.set_p(value
); break;
1018 case 259: wr
.set_nom(value
); break;
1019 case 260: wr
.set_w(value
); break;
1020 case 261: wr
.set_l(value
); break;
1021 case 262: wr
.set_p(value
); break;
1022 case 263: dwg
.set_nom(value
); break;
1023 case 264: dwg
.set_w(value
); break;
1024 case 265: dwg
.set_l(value
); break;
1025 case 266: dwg
.set_p(value
); break;
1026 case 267: dwb
.set_nom(value
); break;
1027 case 268: dwb
.set_w(value
); break;
1028 case 269: dwb
.set_l(value
); break;
1029 case 270: dwb
.set_p(value
); break;
1030 case 271: b0
.set_nom(value
); break;
1031 case 272: b0
.set_w(value
); break;
1032 case 273: b0
.set_l(value
); break;
1033 case 274: b0
.set_p(value
); break;
1034 case 275: b1
.set_nom(value
); break;
1035 case 276: b1
.set_w(value
); break;
1036 case 277: b1
.set_l(value
); break;
1037 case 278: b1
.set_p(value
); break;
1038 case 279: alpha0
.set_nom(value
); break;
1039 case 280: alpha0
.set_w(value
); break;
1040 case 281: alpha0
.set_l(value
); break;
1041 case 282: alpha0
.set_p(value
); break;
1042 case 283: beta0
.set_nom(value
); break;
1043 case 284: beta0
.set_w(value
); break;
1044 case 285: beta0
.set_l(value
); break;
1045 case 286: beta0
.set_p(value
); break;
1046 case 287: elm
.set_nom(value
); break;
1047 case 288: elm
.set_w(value
); break;
1048 case 289: elm
.set_l(value
); break;
1049 case 290: elm
.set_p(value
); break;
1050 case 291: vfbcv
.set_nom(value
); break;
1051 case 292: vfbcv
.set_w(value
); break;
1052 case 293: vfbcv
.set_l(value
); break;
1053 case 294: vfbcv
.set_p(value
); break;
1054 case 295: cgsl
.set_nom(value
); break;
1055 case 296: cgsl
.set_w(value
); break;
1056 case 297: cgsl
.set_l(value
); break;
1057 case 298: cgsl
.set_p(value
); break;
1058 case 299: cgdl
.set_nom(value
); break;
1059 case 300: cgdl
.set_w(value
); break;
1060 case 301: cgdl
.set_l(value
); break;
1061 case 302: cgdl
.set_p(value
); break;
1062 case 303: ckappa
.set_nom(value
); break;
1063 case 304: ckappa
.set_w(value
); break;
1064 case 305: ckappa
.set_l(value
); break;
1065 case 306: ckappa
.set_p(value
); break;
1066 case 307: cf
.set_nom(value
); break;
1067 case 308: cf
.set_w(value
); break;
1068 case 309: cf
.set_l(value
); break;
1069 case 310: cf
.set_p(value
); break;
1070 case 311: clc
.set_nom(value
); break;
1071 case 312: clc
.set_w(value
); break;
1072 case 313: clc
.set_l(value
); break;
1073 case 314: clc
.set_p(value
); break;
1074 case 315: cle
.set_nom(value
); break;
1075 case 316: cle
.set_w(value
); break;
1076 case 317: cle
.set_l(value
); break;
1077 case 318: cle
.set_p(value
); break;
1078 case 319: capMod
= value
; break;
1079 case 320: nqsMod
= value
; break;
1080 case 321: mobMod
= value
; break;
1081 case 322: noiMod
= value
; break;
1082 case 323: paramChk
= value
; break;
1083 case 324: binUnit
= value
; break;
1084 case 325: version
= value
; break;
1085 case 326: tox
= value
; break;
1086 case 327: xpart
= value
; break;
1087 case 328: jctSidewallSatCurDensity
= value
; break;
1088 case 329: mjswg
= value
; break;
1089 case 330: pbswg
= value
; break;
1090 case 331: unitLengthGateSidewallJctCap
= value
; break;
1091 case 332: jctEmissionCoeff
= value
; break;
1092 case 333: jctTempExponent
= value
; break;
1093 case 334: Lint
= value
; break;
1094 case 335: Ll
= value
; break;
1095 case 336: Lln
= value
; break;
1096 case 337: Lw
= value
; break;
1097 case 338: Lwn
= value
; break;
1098 case 339: Lwl
= value
; break;
1099 case 340: Wint
= value
; break;
1100 case 341: Wl
= value
; break;
1101 case 342: Wln
= value
; break;
1102 case 343: Ww
= value
; break;
1103 case 344: Wwn
= value
; break;
1104 case 345: Wwl
= value
; break;
1105 case 346: dwc
= value
; break;
1106 case 347: dlc
= value
; break;
1107 case 348: noia
= value
; break;
1108 case 349: noib
= value
; break;
1109 case 350: noic
= value
; break;
1110 case 351: em
= value
; break;
1111 case 352: ef
= value
; break;
1112 default: MODEL_BUILT_IN_MOS_BASE::set_param_by_index(i
, value
, offset
); break;
1115 /*--------------------------------------------------------------------------*/
1116 bool MODEL_BUILT_IN_MOS7::param_is_printable(int i
)const
1118 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i
) {
1119 case 0: return (true);
1120 case 1: return (false);
1121 case 2: return (false);
1122 case 3: return (false);
1123 case 4: return (false);
1124 case 5: return (false);
1125 case 6: return (false);
1126 case 7: return (false);
1127 case 8: return (false);
1128 case 9: return (false);
1129 case 10: return (mos_level
!= LEVEL
);
1130 case 11: return (true);
1131 case 12: return (cdsc
.w_has_value());
1132 case 13: return (cdsc
.l_has_value());
1133 case 14: return (cdsc
.p_has_value());
1134 case 15: return (true);
1135 case 16: return (cdscb
.w_has_value());
1136 case 17: return (cdscb
.l_has_value());
1137 case 18: return (cdscb
.p_has_value());
1138 case 19: return (true);
1139 case 20: return (cdscd
.w_has_value());
1140 case 21: return (cdscd
.l_has_value());
1141 case 22: return (cdscd
.p_has_value());
1142 case 23: return (true);
1143 case 24: return (cit
.w_has_value());
1144 case 25: return (cit
.l_has_value());
1145 case 26: return (cit
.p_has_value());
1146 case 27: return (true);
1147 case 28: return (nfactor
.w_has_value());
1148 case 29: return (nfactor
.l_has_value());
1149 case 30: return (nfactor
.p_has_value());
1150 case 31: return (true);
1151 case 32: return (xj
.w_has_value());
1152 case 33: return (xj
.l_has_value());
1153 case 34: return (xj
.p_has_value());
1154 case 35: return (true);
1155 case 36: return (vsat
.w_has_value());
1156 case 37: return (vsat
.l_has_value());
1157 case 38: return (vsat
.p_has_value());
1158 case 39: return (true);
1159 case 40: return (at
.w_has_value());
1160 case 41: return (at
.l_has_value());
1161 case 42: return (at
.p_has_value());
1162 case 43: return (true);
1163 case 44: return (a0
.w_has_value());
1164 case 45: return (a0
.l_has_value());
1165 case 46: return (a0
.p_has_value());
1166 case 47: return (true);
1167 case 48: return (ags
.w_has_value());
1168 case 49: return (ags
.l_has_value());
1169 case 50: return (ags
.p_has_value());
1170 case 51: return (true);
1171 case 52: return (a1
.w_has_value());
1172 case 53: return (a1
.l_has_value());
1173 case 54: return (a1
.p_has_value());
1174 case 55: return (true);
1175 case 56: return (a2
.w_has_value());
1176 case 57: return (a2
.l_has_value());
1177 case 58: return (a2
.p_has_value());
1178 case 59: return (true);
1179 case 60: return (keta
.w_has_value());
1180 case 61: return (keta
.l_has_value());
1181 case 62: return (keta
.p_has_value());
1182 case 63: return (true);
1183 case 64: return (nsub
.w_has_value());
1184 case 65: return (nsub
.l_has_value());
1185 case 66: return (nsub
.p_has_value());
1186 case 67: return (npeak
.has_value());
1187 case 68: return (npeak
.w_has_value());
1188 case 69: return (npeak
.l_has_value());
1189 case 70: return (npeak
.p_has_value());
1190 case 71: return (true);
1191 case 72: return (ngate
.w_has_value());
1192 case 73: return (ngate
.l_has_value());
1193 case 74: return (ngate
.p_has_value());
1194 case 75: return (gamma1
.has_value());
1195 case 76: return (gamma1
.w_has_value());
1196 case 77: return (gamma1
.l_has_value());
1197 case 78: return (gamma1
.p_has_value());
1198 case 79: return (gamma2
.has_value());
1199 case 80: return (gamma2
.w_has_value());
1200 case 81: return (gamma2
.l_has_value());
1201 case 82: return (gamma2
.p_has_value());
1202 case 83: return (vbx
.has_value());
1203 case 84: return (vbx
.w_has_value());
1204 case 85: return (vbx
.l_has_value());
1205 case 86: return (vbx
.p_has_value());
1206 case 87: return (true);
1207 case 88: return (vbm
.w_has_value());
1208 case 89: return (vbm
.l_has_value());
1209 case 90: return (vbm
.p_has_value());
1210 case 91: return (true);
1211 case 92: return (xt
.w_has_value());
1212 case 93: return (xt
.l_has_value());
1213 case 94: return (xt
.p_has_value());
1214 case 95: return (k1
.has_value());
1215 case 96: return (k1
.w_has_value());
1216 case 97: return (k1
.l_has_value());
1217 case 98: return (k1
.p_has_value());
1218 case 99: return (true);
1219 case 100: return (kt1
.w_has_value());
1220 case 101: return (kt1
.l_has_value());
1221 case 102: return (kt1
.p_has_value());
1222 case 103: return (true);
1223 case 104: return (kt1l
.w_has_value());
1224 case 105: return (kt1l
.l_has_value());
1225 case 106: return (kt1l
.p_has_value());
1226 case 107: return (true);
1227 case 108: return (kt2
.w_has_value());
1228 case 109: return (kt2
.l_has_value());
1229 case 110: return (kt2
.p_has_value());
1230 case 111: return (k2
.has_value());
1231 case 112: return (k2
.w_has_value());
1232 case 113: return (k2
.l_has_value());
1233 case 114: return (k2
.p_has_value());
1234 case 115: return (true);
1235 case 116: return (k3
.w_has_value());
1236 case 117: return (k3
.l_has_value());
1237 case 118: return (k3
.p_has_value());
1238 case 119: return (true);
1239 case 120: return (k3b
.w_has_value());
1240 case 121: return (k3b
.l_has_value());
1241 case 122: return (k3b
.p_has_value());
1242 case 123: return (true);
1243 case 124: return (w0
.w_has_value());
1244 case 125: return (w0
.l_has_value());
1245 case 126: return (w0
.p_has_value());
1246 case 127: return (true);
1247 case 128: return (nlx
.w_has_value());
1248 case 129: return (nlx
.l_has_value());
1249 case 130: return (nlx
.p_has_value());
1250 case 131: return (true);
1251 case 132: return (dvt0
.w_has_value());
1252 case 133: return (dvt0
.l_has_value());
1253 case 134: return (dvt0
.p_has_value());
1254 case 135: return (true);
1255 case 136: return (dvt1
.w_has_value());
1256 case 137: return (dvt1
.l_has_value());
1257 case 138: return (dvt1
.p_has_value());
1258 case 139: return (true);
1259 case 140: return (dvt2
.w_has_value());
1260 case 141: return (dvt2
.l_has_value());
1261 case 142: return (dvt2
.p_has_value());
1262 case 143: return (true);
1263 case 144: return (dvt0w
.w_has_value());
1264 case 145: return (dvt0w
.l_has_value());
1265 case 146: return (dvt0w
.p_has_value());
1266 case 147: return (true);
1267 case 148: return (dvt1w
.w_has_value());
1268 case 149: return (dvt1w
.l_has_value());
1269 case 150: return (dvt1w
.p_has_value());
1270 case 151: return (true);
1271 case 152: return (dvt2w
.w_has_value());
1272 case 153: return (dvt2w
.l_has_value());
1273 case 154: return (dvt2w
.p_has_value());
1274 case 155: return (true);
1275 case 156: return (drout
.w_has_value());
1276 case 157: return (drout
.l_has_value());
1277 case 158: return (drout
.p_has_value());
1278 case 159: return (dsub
.has_value());
1279 case 160: return (dsub
.w_has_value());
1280 case 161: return (dsub
.l_has_value());
1281 case 162: return (dsub
.p_has_value());
1282 case 163: return (vth0
.has_value());
1283 case 164: return (vth0
.w_has_value());
1284 case 165: return (vth0
.l_has_value());
1285 case 166: return (vth0
.p_has_value());
1286 case 167: return (true);
1287 case 168: return (ua1
.w_has_value());
1288 case 169: return (ua1
.l_has_value());
1289 case 170: return (ua1
.p_has_value());
1290 case 171: return (true);
1291 case 172: return (ua
.w_has_value());
1292 case 173: return (ua
.l_has_value());
1293 case 174: return (ua
.p_has_value());
1294 case 175: return (true);
1295 case 176: return (ub1
.w_has_value());
1296 case 177: return (ub1
.l_has_value());
1297 case 178: return (ub1
.p_has_value());
1298 case 179: return (true);
1299 case 180: return (ub
.w_has_value());
1300 case 181: return (ub
.l_has_value());
1301 case 182: return (ub
.p_has_value());
1302 case 183: return (uc1
.has_value());
1303 case 184: return (uc1
.w_has_value());
1304 case 185: return (uc1
.l_has_value());
1305 case 186: return (uc1
.p_has_value());
1306 case 187: return (uc
.has_value());
1307 case 188: return (uc
.w_has_value());
1308 case 189: return (uc
.l_has_value());
1309 case 190: return (uc
.p_has_value());
1310 case 191: return (u0
.has_value());
1311 case 192: return (u0
.w_has_value());
1312 case 193: return (u0
.l_has_value());
1313 case 194: return (u0
.p_has_value());
1314 case 195: return (true);
1315 case 196: return (ute
.w_has_value());
1316 case 197: return (ute
.l_has_value());
1317 case 198: return (ute
.p_has_value());
1318 case 199: return (true);
1319 case 200: return (voff
.w_has_value());
1320 case 201: return (voff
.l_has_value());
1321 case 202: return (voff
.p_has_value());
1322 case 203: return (true);
1323 case 204: return (delta
.w_has_value());
1324 case 205: return (delta
.l_has_value());
1325 case 206: return (delta
.p_has_value());
1326 case 207: return (true);
1327 case 208: return (rdsw
.w_has_value());
1328 case 209: return (rdsw
.l_has_value());
1329 case 210: return (rdsw
.p_has_value());
1330 case 211: return (true);
1331 case 212: return (prwg
.w_has_value());
1332 case 213: return (prwg
.l_has_value());
1333 case 214: return (prwg
.p_has_value());
1334 case 215: return (true);
1335 case 216: return (prwb
.w_has_value());
1336 case 217: return (prwb
.l_has_value());
1337 case 218: return (prwb
.p_has_value());
1338 case 219: return (true);
1339 case 220: return (prt
.w_has_value());
1340 case 221: return (prt
.l_has_value());
1341 case 222: return (prt
.p_has_value());
1342 case 223: return (true);
1343 case 224: return (eta0
.w_has_value());
1344 case 225: return (eta0
.l_has_value());
1345 case 226: return (eta0
.p_has_value());
1346 case 227: return (true);
1347 case 228: return (etab
.w_has_value());
1348 case 229: return (etab
.l_has_value());
1349 case 230: return (etab
.p_has_value());
1350 case 231: return (true);
1351 case 232: return (pclm
.w_has_value());
1352 case 233: return (pclm
.l_has_value());
1353 case 234: return (pclm
.p_has_value());
1354 case 235: return (true);
1355 case 236: return (pdibl1
.w_has_value());
1356 case 237: return (pdibl1
.l_has_value());
1357 case 238: return (pdibl1
.p_has_value());
1358 case 239: return (true);
1359 case 240: return (pdibl2
.w_has_value());
1360 case 241: return (pdibl2
.l_has_value());
1361 case 242: return (pdibl2
.p_has_value());
1362 case 243: return (true);
1363 case 244: return (pdiblb
.w_has_value());
1364 case 245: return (pdiblb
.l_has_value());
1365 case 246: return (pdiblb
.p_has_value());
1366 case 247: return (true);
1367 case 248: return (pscbe1
.w_has_value());
1368 case 249: return (pscbe1
.l_has_value());
1369 case 250: return (pscbe1
.p_has_value());
1370 case 251: return (true);
1371 case 252: return (pscbe2
.w_has_value());
1372 case 253: return (pscbe2
.l_has_value());
1373 case 254: return (pscbe2
.p_has_value());
1374 case 255: return (true);
1375 case 256: return (pvag
.w_has_value());
1376 case 257: return (pvag
.l_has_value());
1377 case 258: return (pvag
.p_has_value());
1378 case 259: return (true);
1379 case 260: return (wr
.w_has_value());
1380 case 261: return (wr
.l_has_value());
1381 case 262: return (wr
.p_has_value());
1382 case 263: return (true);
1383 case 264: return (dwg
.w_has_value());
1384 case 265: return (dwg
.l_has_value());
1385 case 266: return (dwg
.p_has_value());
1386 case 267: return (true);
1387 case 268: return (dwb
.w_has_value());
1388 case 269: return (dwb
.l_has_value());
1389 case 270: return (dwb
.p_has_value());
1390 case 271: return (true);
1391 case 272: return (b0
.w_has_value());
1392 case 273: return (b0
.l_has_value());
1393 case 274: return (b0
.p_has_value());
1394 case 275: return (true);
1395 case 276: return (b1
.w_has_value());
1396 case 277: return (b1
.l_has_value());
1397 case 278: return (b1
.p_has_value());
1398 case 279: return (true);
1399 case 280: return (alpha0
.w_has_value());
1400 case 281: return (alpha0
.l_has_value());
1401 case 282: return (alpha0
.p_has_value());
1402 case 283: return (true);
1403 case 284: return (beta0
.w_has_value());
1404 case 285: return (beta0
.l_has_value());
1405 case 286: return (beta0
.p_has_value());
1406 case 287: return (true);
1407 case 288: return (elm
.w_has_value());
1408 case 289: return (elm
.l_has_value());
1409 case 290: return (elm
.p_has_value());
1410 case 291: return (true);
1411 case 292: return (vfbcv
.w_has_value());
1412 case 293: return (vfbcv
.l_has_value());
1413 case 294: return (vfbcv
.p_has_value());
1414 case 295: return (true);
1415 case 296: return (cgsl
.w_has_value());
1416 case 297: return (cgsl
.l_has_value());
1417 case 298: return (cgsl
.p_has_value());
1418 case 299: return (true);
1419 case 300: return (cgdl
.w_has_value());
1420 case 301: return (cgdl
.l_has_value());
1421 case 302: return (cgdl
.p_has_value());
1422 case 303: return (true);
1423 case 304: return (ckappa
.w_has_value());
1424 case 305: return (ckappa
.l_has_value());
1425 case 306: return (ckappa
.p_has_value());
1426 case 307: return (cf
.has_value());
1427 case 308: return (cf
.w_has_value());
1428 case 309: return (cf
.l_has_value());
1429 case 310: return (cf
.p_has_value());
1430 case 311: return (true);
1431 case 312: return (clc
.w_has_value());
1432 case 313: return (clc
.l_has_value());
1433 case 314: return (clc
.p_has_value());
1434 case 315: return (true);
1435 case 316: return (cle
.w_has_value());
1436 case 317: return (cle
.l_has_value());
1437 case 318: return (cle
.p_has_value());
1438 case 319: return (true);
1439 case 320: return (true);
1440 case 321: return (true);
1441 case 322: return (true);
1442 case 323: return (true);
1443 case 324: return (true);
1444 case 325: return (true);
1445 case 326: return (true);
1446 case 327: return (true);
1447 case 328: return (true);
1448 case 329: return (mjswg
.has_hard_value());
1449 case 330: return (pbswg
.has_hard_value());
1450 case 331: return (unitLengthGateSidewallJctCap
.has_hard_value());
1451 case 332: return (true);
1452 case 333: return (true);
1453 case 334: return (true);
1454 case 335: return (true);
1455 case 336: return (true);
1456 case 337: return (true);
1457 case 338: return (true);
1458 case 339: return (true);
1459 case 340: return (true);
1460 case 341: return (true);
1461 case 342: return (true);
1462 case 343: return (true);
1463 case 344: return (true);
1464 case 345: return (true);
1465 case 346: return (dwc
.has_hard_value());
1466 case 347: return (dlc
.has_hard_value());
1467 case 348: return (noia
.has_hard_value());
1468 case 349: return (noib
.has_hard_value());
1469 case 350: return (noic
.has_hard_value());
1470 case 351: return (true);
1471 case 352: return (true);
1472 default: return MODEL_BUILT_IN_MOS_BASE::param_is_printable(i
);
1475 /*--------------------------------------------------------------------------*/
1476 std::string
MODEL_BUILT_IN_MOS7::param_name(int i
)const
1478 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i
) {
1479 case 0: return "level";
1480 case 1: return "=====";
1481 case 2: return "=====";
1482 case 3: return "=====";
1483 case 4: return "=====";
1484 case 5: return "=====";
1485 case 6: return "=====";
1486 case 7: return "=====";
1487 case 8: return "=====";
1488 case 9: return "=====";
1489 case 10: return "diodelevel";
1490 case 11: return "cdsc";
1491 case 12: return "wcdsc";
1492 case 13: return "lcdsc";
1493 case 14: return "pcdsc";
1494 case 15: return "cdscb";
1495 case 16: return "wcdscb";
1496 case 17: return "lcdscb";
1497 case 18: return "pcdscb";
1498 case 19: return "cdscd";
1499 case 20: return "wcdscd";
1500 case 21: return "lcdscd";
1501 case 22: return "pcdscd";
1502 case 23: return "cit";
1503 case 24: return "wcit";
1504 case 25: return "lcit";
1505 case 26: return "pcit";
1506 case 27: return "nfactor";
1507 case 28: return "wnfactor";
1508 case 29: return "lnfactor";
1509 case 30: return "pnfactor";
1510 case 31: return "xj";
1511 case 32: return "wxj";
1512 case 33: return "lxj";
1513 case 34: return "pxj";
1514 case 35: return "vsat";
1515 case 36: return "wvsat";
1516 case 37: return "lvsat";
1517 case 38: return "pvsat";
1518 case 39: return "at";
1519 case 40: return "wat";
1520 case 41: return "lat";
1521 case 42: return "pat";
1522 case 43: return "a0";
1523 case 44: return "wa0";
1524 case 45: return "la0";
1525 case 46: return "pa0";
1526 case 47: return "ags";
1527 case 48: return "wags";
1528 case 49: return "lags";
1529 case 50: return "pags";
1530 case 51: return "a1";
1531 case 52: return "wa1";
1532 case 53: return "la1";
1533 case 54: return "pa1";
1534 case 55: return "a2";
1535 case 56: return "wa2";
1536 case 57: return "la2";
1537 case 58: return "pa2";
1538 case 59: return "keta";
1539 case 60: return "wketa";
1540 case 61: return "lketa";
1541 case 62: return "pketa";
1542 case 63: return "nsub";
1543 case 64: return "wnsub";
1544 case 65: return "lnsub";
1545 case 66: return "pnsub";
1546 case 67: return "nch";
1547 case 68: return "wnch";
1548 case 69: return "lnch";
1549 case 70: return "pnch";
1550 case 71: return "ngate";
1551 case 72: return "wngate";
1552 case 73: return "lngate";
1553 case 74: return "pngate";
1554 case 75: return "gamma1";
1555 case 76: return "wgamma1";
1556 case 77: return "lgamma1";
1557 case 78: return "pgamma1";
1558 case 79: return "gamma2";
1559 case 80: return "wgamma2";
1560 case 81: return "lgamma2";
1561 case 82: return "pgamma2";
1562 case 83: return "vbx";
1563 case 84: return "wvbx";
1564 case 85: return "lvbx";
1565 case 86: return "pvbx";
1566 case 87: return "vbm";
1567 case 88: return "wvbm";
1568 case 89: return "lvbm";
1569 case 90: return "pvbm";
1570 case 91: return "xt";
1571 case 92: return "wxt";
1572 case 93: return "lxt";
1573 case 94: return "pxt";
1574 case 95: return "k1";
1575 case 96: return "wk1";
1576 case 97: return "lk1";
1577 case 98: return "pk1";
1578 case 99: return "kt1";
1579 case 100: return "wkt1";
1580 case 101: return "lkt1";
1581 case 102: return "pkt1";
1582 case 103: return "kt1l";
1583 case 104: return "wkt1l";
1584 case 105: return "lkt1l";
1585 case 106: return "pkt1l";
1586 case 107: return "kt2";
1587 case 108: return "wkt2";
1588 case 109: return "lkt2";
1589 case 110: return "pkt2";
1590 case 111: return "k2";
1591 case 112: return "wk2";
1592 case 113: return "lk2";
1593 case 114: return "pk2";
1594 case 115: return "k3";
1595 case 116: return "wk3";
1596 case 117: return "lk3";
1597 case 118: return "pk3";
1598 case 119: return "k3b";
1599 case 120: return "wk3b";
1600 case 121: return "lk3b";
1601 case 122: return "pk3b";
1602 case 123: return "w0";
1603 case 124: return "ww0";
1604 case 125: return "lw0";
1605 case 126: return "pw0";
1606 case 127: return "nlx";
1607 case 128: return "wnlx";
1608 case 129: return "lnlx";
1609 case 130: return "pnlx";
1610 case 131: return "dvt0";
1611 case 132: return "wdvt0";
1612 case 133: return "ldvt0";
1613 case 134: return "pdvt0";
1614 case 135: return "dvt1";
1615 case 136: return "wdvt1";
1616 case 137: return "ldvt1";
1617 case 138: return "pdvt1";
1618 case 139: return "dvt2";
1619 case 140: return "wdvt2";
1620 case 141: return "ldvt2";
1621 case 142: return "pdvt2";
1622 case 143: return "dvt0w";
1623 case 144: return "wdvt0w";
1624 case 145: return "ldvt0w";
1625 case 146: return "pdvt0w";
1626 case 147: return "dvt1w";
1627 case 148: return "wdvt1w";
1628 case 149: return "ldvt1w";
1629 case 150: return "pdvt1w";
1630 case 151: return "dvt2w";
1631 case 152: return "wdvt2w";
1632 case 153: return "ldvt2w";
1633 case 154: return "pdvt2w";
1634 case 155: return "drout";
1635 case 156: return "wdrout";
1636 case 157: return "ldrout";
1637 case 158: return "pdrout";
1638 case 159: return "dsub";
1639 case 160: return "wdsub";
1640 case 161: return "ldsub";
1641 case 162: return "pdsub";
1642 case 163: return "vth0";
1643 case 164: return "wvth0";
1644 case 165: return "lvth0";
1645 case 166: return "pvth0";
1646 case 167: return "ua1";
1647 case 168: return "wua1";
1648 case 169: return "lua1";
1649 case 170: return "pua1";
1650 case 171: return "ua";
1651 case 172: return "wua";
1652 case 173: return "lua";
1653 case 174: return "pua";
1654 case 175: return "ub1";
1655 case 176: return "wub1";
1656 case 177: return "lub1";
1657 case 178: return "pub1";
1658 case 179: return "ub";
1659 case 180: return "wub";
1660 case 181: return "lub";
1661 case 182: return "pub";
1662 case 183: return "uc1";
1663 case 184: return "wuc1";
1664 case 185: return "luc1";
1665 case 186: return "puc1";
1666 case 187: return "uc";
1667 case 188: return "wuc";
1668 case 189: return "luc";
1669 case 190: return "puc";
1670 case 191: return "u0";
1671 case 192: return "wu0";
1672 case 193: return "lu0";
1673 case 194: return "pu0";
1674 case 195: return "ute";
1675 case 196: return "wute";
1676 case 197: return "lute";
1677 case 198: return "pute";
1678 case 199: return "voff";
1679 case 200: return "wvoff";
1680 case 201: return "lvoff";
1681 case 202: return "pvoff";
1682 case 203: return "delta";
1683 case 204: return "wdelta";
1684 case 205: return "ldelta";
1685 case 206: return "pdelta";
1686 case 207: return "rdsw";
1687 case 208: return "wrdsw";
1688 case 209: return "lrdsw";
1689 case 210: return "prdsw";
1690 case 211: return "prwg";
1691 case 212: return "wprwg";
1692 case 213: return "lprwg";
1693 case 214: return "pprwg";
1694 case 215: return "prwb";
1695 case 216: return "wprwb";
1696 case 217: return "lprwb";
1697 case 218: return "pprwb";
1698 case 219: return "prt";
1699 case 220: return "wprt";
1700 case 221: return "lprt";
1701 case 222: return "pprt";
1702 case 223: return "eta0";
1703 case 224: return "weta0";
1704 case 225: return "leta0";
1705 case 226: return "peta0";
1706 case 227: return "etab";
1707 case 228: return "wetab";
1708 case 229: return "letab";
1709 case 230: return "petab";
1710 case 231: return "pclm";
1711 case 232: return "wpclm";
1712 case 233: return "lpclm";
1713 case 234: return "ppclm";
1714 case 235: return "pdiblc1";
1715 case 236: return "wpdiblc1";
1716 case 237: return "lpdiblc1";
1717 case 238: return "ppdiblc1";
1718 case 239: return "pdiblc2";
1719 case 240: return "wpdiblc2";
1720 case 241: return "lpdiblc2";
1721 case 242: return "ppdiblc2";
1722 case 243: return "pdiblcb";
1723 case 244: return "wpdiblcb";
1724 case 245: return "lpdiblcb";
1725 case 246: return "ppdiblcb";
1726 case 247: return "pscbe1";
1727 case 248: return "wpscbe1";
1728 case 249: return "lpscbe1";
1729 case 250: return "ppscbe1";
1730 case 251: return "pscbe2";
1731 case 252: return "wpscbe2";
1732 case 253: return "lpscbe2";
1733 case 254: return "ppscbe2";
1734 case 255: return "pvag";
1735 case 256: return "wpvag";
1736 case 257: return "lpvag";
1737 case 258: return "ppvag";
1738 case 259: return "wr";
1739 case 260: return "wwr";
1740 case 261: return "lwr";
1741 case 262: return "pwr";
1742 case 263: return "dwg";
1743 case 264: return "wdwg";
1744 case 265: return "ldwg";
1745 case 266: return "pdwg";
1746 case 267: return "dwb";
1747 case 268: return "wdwb";
1748 case 269: return "ldwb";
1749 case 270: return "pdwb";
1750 case 271: return "b0";
1751 case 272: return "wb0";
1752 case 273: return "lb0";
1753 case 274: return "pb0";
1754 case 275: return "b1";
1755 case 276: return "wb1";
1756 case 277: return "lb1";
1757 case 278: return "pb1";
1758 case 279: return "alpha0";
1759 case 280: return "walpha0";
1760 case 281: return "lalpha0";
1761 case 282: return "palpha0";
1762 case 283: return "beta0";
1763 case 284: return "wbeta0";
1764 case 285: return "lbeta0";
1765 case 286: return "pbeta0";
1766 case 287: return "elm";
1767 case 288: return "welm";
1768 case 289: return "lelm";
1769 case 290: return "pelm";
1770 case 291: return "vfbcv";
1771 case 292: return "wvfbcv";
1772 case 293: return "lvfbcv";
1773 case 294: return "pvfbcv";
1774 case 295: return "cgsl";
1775 case 296: return "wcgsl";
1776 case 297: return "lcgsl";
1777 case 298: return "pcgsl";
1778 case 299: return "cgdl";
1779 case 300: return "wcgdl";
1780 case 301: return "lcgdl";
1781 case 302: return "pcgdl";
1782 case 303: return "ckappa";
1783 case 304: return "wckappa";
1784 case 305: return "lckappa";
1785 case 306: return "pckappa";
1786 case 307: return "cf";
1787 case 308: return "wcf";
1788 case 309: return "lcf";
1789 case 310: return "pcf";
1790 case 311: return "clc";
1791 case 312: return "wclc";
1792 case 313: return "lclc";
1793 case 314: return "pclc";
1794 case 315: return "cle";
1795 case 316: return "wcle";
1796 case 317: return "lcle";
1797 case 318: return "pcle";
1798 case 319: return "capmod";
1799 case 320: return "nqsmod";
1800 case 321: return "mobmod";
1801 case 322: return "noimod";
1802 case 323: return "paramchk";
1803 case 324: return "binunit";
1804 case 325: return "version";
1805 case 326: return "tox";
1806 case 327: return "xpart";
1807 case 328: return "jsw";
1808 case 329: return "mjswg";
1809 case 330: return "pbswg";
1810 case 331: return "cjswg";
1811 case 332: return "nj";
1812 case 333: return "xti";
1813 case 334: return "lint";
1814 case 335: return "ll";
1815 case 336: return "lln";
1816 case 337: return "lw";
1817 case 338: return "lwn";
1818 case 339: return "lwl";
1819 case 340: return "wint";
1820 case 341: return "wl";
1821 case 342: return "wln";
1822 case 343: return "ww";
1823 case 344: return "wwn";
1824 case 345: return "wwl";
1825 case 346: return "dwc";
1826 case 347: return "dlc";
1827 case 348: return "noia";
1828 case 349: return "noib";
1829 case 350: return "noic";
1830 case 351: return "em";
1831 case 352: return "ef";
1832 default: return MODEL_BUILT_IN_MOS_BASE::param_name(i
);
1835 /*--------------------------------------------------------------------------*/
1836 std::string
MODEL_BUILT_IN_MOS7::param_name(int i
, int j
)const
1839 return param_name(i
);
1841 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i
) {
1942 case 100: return "";
1943 case 101: return "";
1944 case 102: return "";
1945 case 103: return "";
1946 case 104: return "";
1947 case 105: return "";
1948 case 106: return "";
1949 case 107: return "";
1950 case 108: return "";
1951 case 109: return "";
1952 case 110: return "";
1953 case 111: return "";
1954 case 112: return "";
1955 case 113: return "";
1956 case 114: return "";
1957 case 115: return "";
1958 case 116: return "";
1959 case 117: return "";
1960 case 118: return "";
1961 case 119: return "";
1962 case 120: return "";
1963 case 121: return "";
1964 case 122: return "";
1965 case 123: return "";
1966 case 124: return "";
1967 case 125: return "";
1968 case 126: return "";
1969 case 127: return "";
1970 case 128: return "";
1971 case 129: return "";
1972 case 130: return "";
1973 case 131: return "";
1974 case 132: return "";
1975 case 133: return "";
1976 case 134: return "";
1977 case 135: return "";
1978 case 136: return "";
1979 case 137: return "";
1980 case 138: return "";
1981 case 139: return "";
1982 case 140: return "";
1983 case 141: return "";
1984 case 142: return "";
1985 case 143: return "";
1986 case 144: return "";
1987 case 145: return "";
1988 case 146: return "";
1989 case 147: return "";
1990 case 148: return "";
1991 case 149: return "";
1992 case 150: return "";
1993 case 151: return "";
1994 case 152: return "";
1995 case 153: return "";
1996 case 154: return "";
1997 case 155: return "";
1998 case 156: return "";
1999 case 157: return "";
2000 case 158: return "";
2001 case 159: return "";
2002 case 160: return "";
2003 case 161: return "";
2004 case 162: return "";
2005 case 163: return "";
2006 case 164: return "";
2007 case 165: return "";
2008 case 166: return "";
2009 case 167: return "";
2010 case 168: return "";
2011 case 169: return "";
2012 case 170: return "";
2013 case 171: return "";
2014 case 172: return "";
2015 case 173: return "";
2016 case 174: return "";
2017 case 175: return "";
2018 case 176: return "";
2019 case 177: return "";
2020 case 178: return "";
2021 case 179: return "";
2022 case 180: return "";
2023 case 181: return "";
2024 case 182: return "";
2025 case 183: return "";
2026 case 184: return "";
2027 case 185: return "";
2028 case 186: return "";
2029 case 187: return "";
2030 case 188: return "";
2031 case 189: return "";
2032 case 190: return "";
2033 case 191: return "";
2034 case 192: return "";
2035 case 193: return "";
2036 case 194: return "";
2037 case 195: return "";
2038 case 196: return "";
2039 case 197: return "";
2040 case 198: return "";
2041 case 199: return "";
2042 case 200: return "";
2043 case 201: return "";
2044 case 202: return "";
2045 case 203: return "";
2046 case 204: return "";
2047 case 205: return "";
2048 case 206: return "";
2049 case 207: return "";
2050 case 208: return "";
2051 case 209: return "";
2052 case 210: return "";
2053 case 211: return "";
2054 case 212: return "";
2055 case 213: return "";
2056 case 214: return "";
2057 case 215: return "";
2058 case 216: return "";
2059 case 217: return "";
2060 case 218: return "";
2061 case 219: return "";
2062 case 220: return "";
2063 case 221: return "";
2064 case 222: return "";
2065 case 223: return "";
2066 case 224: return "";
2067 case 225: return "";
2068 case 226: return "";
2069 case 227: return "";
2070 case 228: return "";
2071 case 229: return "";
2072 case 230: return "";
2073 case 231: return "";
2074 case 232: return "";
2075 case 233: return "";
2076 case 234: return "";
2077 case 235: return "";
2078 case 236: return "";
2079 case 237: return "";
2080 case 238: return "";
2081 case 239: return "";
2082 case 240: return "";
2083 case 241: return "";
2084 case 242: return "";
2085 case 243: return "";
2086 case 244: return "";
2087 case 245: return "";
2088 case 246: return "";
2089 case 247: return "";
2090 case 248: return "";
2091 case 249: return "";
2092 case 250: return "";
2093 case 251: return "";
2094 case 252: return "";
2095 case 253: return "";
2096 case 254: return "";
2097 case 255: return "";
2098 case 256: return "";
2099 case 257: return "";
2100 case 258: return "";
2101 case 259: return "";
2102 case 260: return "";
2103 case 261: return "";
2104 case 262: return "";
2105 case 263: return "";
2106 case 264: return "";
2107 case 265: return "";
2108 case 266: return "";
2109 case 267: return "";
2110 case 268: return "";
2111 case 269: return "";
2112 case 270: return "";
2113 case 271: return "";
2114 case 272: return "";
2115 case 273: return "";
2116 case 274: return "";
2117 case 275: return "";
2118 case 276: return "";
2119 case 277: return "";
2120 case 278: return "";
2121 case 279: return "";
2122 case 280: return "";
2123 case 281: return "";
2124 case 282: return "";
2125 case 283: return "";
2126 case 284: return "";
2127 case 285: return "";
2128 case 286: return "";
2129 case 287: return "";
2130 case 288: return "";
2131 case 289: return "";
2132 case 290: return "";
2133 case 291: return "";
2134 case 292: return "";
2135 case 293: return "";
2136 case 294: return "";
2137 case 295: return "";
2138 case 296: return "";
2139 case 297: return "";
2140 case 298: return "";
2141 case 299: return "";
2142 case 300: return "";
2143 case 301: return "";
2144 case 302: return "";
2145 case 303: return "";
2146 case 304: return "";
2147 case 305: return "";
2148 case 306: return "";
2149 case 307: return "";
2150 case 308: return "";
2151 case 309: return "";
2152 case 310: return "";
2153 case 311: return "";
2154 case 312: return "";
2155 case 313: return "";
2156 case 314: return "";
2157 case 315: return "";
2158 case 316: return "";
2159 case 317: return "";
2160 case 318: return "";
2161 case 319: return "";
2162 case 320: return "";
2163 case 321: return "";
2164 case 322: return "";
2165 case 323: return "";
2166 case 324: return "";
2167 case 325: return "";
2168 case 326: return "";
2169 case 327: return "";
2170 case 328: return "";
2171 case 329: return "";
2172 case 330: return "";
2173 case 331: return "";
2174 case 332: return "";
2175 case 333: return "";
2176 case 334: return "";
2177 case 335: return "";
2178 case 336: return "";
2179 case 337: return "";
2180 case 338: return "";
2181 case 339: return "";
2182 case 340: return "";
2183 case 341: return "";
2184 case 342: return "";
2185 case 343: return "";
2186 case 344: return "";
2187 case 345: return "";
2188 case 346: return "";
2189 case 347: return "";
2190 case 348: return "";
2191 case 349: return "";
2192 case 350: return "";
2193 case 351: return "";
2194 case 352: return "";
2195 default: return MODEL_BUILT_IN_MOS_BASE::param_name(i
, j
);
2197 }else if (i
< 353) {
2200 return MODEL_BUILT_IN_MOS_BASE::param_name(i
, j
);
2203 /*--------------------------------------------------------------------------*/
2204 std::string
MODEL_BUILT_IN_MOS7::param_value(int i
)const
2206 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i
) {
2208 case 1: unreachable(); return "";
2209 case 2: unreachable(); return "";
2210 case 3: unreachable(); return "";
2211 case 4: unreachable(); return "";
2212 case 5: unreachable(); return "";
2213 case 6: unreachable(); return "";
2214 case 7: unreachable(); return "";
2215 case 8: unreachable(); return "";
2216 case 9: unreachable(); return "";
2217 case 10: return mos_level
.string();
2218 case 11: return cdsc
.string();
2219 case 12: return cdsc
.w_string();
2220 case 13: return cdsc
.l_string();
2221 case 14: return cdsc
.p_string();
2222 case 15: return cdscb
.string();
2223 case 16: return cdscb
.w_string();
2224 case 17: return cdscb
.l_string();
2225 case 18: return cdscb
.p_string();
2226 case 19: return cdscd
.string();
2227 case 20: return cdscd
.w_string();
2228 case 21: return cdscd
.l_string();
2229 case 22: return cdscd
.p_string();
2230 case 23: return cit
.string();
2231 case 24: return cit
.w_string();
2232 case 25: return cit
.l_string();
2233 case 26: return cit
.p_string();
2234 case 27: return nfactor
.string();
2235 case 28: return nfactor
.w_string();
2236 case 29: return nfactor
.l_string();
2237 case 30: return nfactor
.p_string();
2238 case 31: return xj
.string();
2239 case 32: return xj
.w_string();
2240 case 33: return xj
.l_string();
2241 case 34: return xj
.p_string();
2242 case 35: return vsat
.string();
2243 case 36: return vsat
.w_string();
2244 case 37: return vsat
.l_string();
2245 case 38: return vsat
.p_string();
2246 case 39: return at
.string();
2247 case 40: return at
.w_string();
2248 case 41: return at
.l_string();
2249 case 42: return at
.p_string();
2250 case 43: return a0
.string();
2251 case 44: return a0
.w_string();
2252 case 45: return a0
.l_string();
2253 case 46: return a0
.p_string();
2254 case 47: return ags
.string();
2255 case 48: return ags
.w_string();
2256 case 49: return ags
.l_string();
2257 case 50: return ags
.p_string();
2258 case 51: return a1
.string();
2259 case 52: return a1
.w_string();
2260 case 53: return a1
.l_string();
2261 case 54: return a1
.p_string();
2262 case 55: return a2
.string();
2263 case 56: return a2
.w_string();
2264 case 57: return a2
.l_string();
2265 case 58: return a2
.p_string();
2266 case 59: return keta
.string();
2267 case 60: return keta
.w_string();
2268 case 61: return keta
.l_string();
2269 case 62: return keta
.p_string();
2270 case 63: return nsub
.string();
2271 case 64: return nsub
.w_string();
2272 case 65: return nsub
.l_string();
2273 case 66: return nsub
.p_string();
2274 case 67: return npeak
.string();
2275 case 68: return npeak
.w_string();
2276 case 69: return npeak
.l_string();
2277 case 70: return npeak
.p_string();
2278 case 71: return ngate
.string();
2279 case 72: return ngate
.w_string();
2280 case 73: return ngate
.l_string();
2281 case 74: return ngate
.p_string();
2282 case 75: return gamma1
.string();
2283 case 76: return gamma1
.w_string();
2284 case 77: return gamma1
.l_string();
2285 case 78: return gamma1
.p_string();
2286 case 79: return gamma2
.string();
2287 case 80: return gamma2
.w_string();
2288 case 81: return gamma2
.l_string();
2289 case 82: return gamma2
.p_string();
2290 case 83: return vbx
.string();
2291 case 84: return vbx
.w_string();
2292 case 85: return vbx
.l_string();
2293 case 86: return vbx
.p_string();
2294 case 87: return vbm
.string();
2295 case 88: return vbm
.w_string();
2296 case 89: return vbm
.l_string();
2297 case 90: return vbm
.p_string();
2298 case 91: return xt
.string();
2299 case 92: return xt
.w_string();
2300 case 93: return xt
.l_string();
2301 case 94: return xt
.p_string();
2302 case 95: return k1
.string();
2303 case 96: return k1
.w_string();
2304 case 97: return k1
.l_string();
2305 case 98: return k1
.p_string();
2306 case 99: return kt1
.string();
2307 case 100: return kt1
.w_string();
2308 case 101: return kt1
.l_string();
2309 case 102: return kt1
.p_string();
2310 case 103: return kt1l
.string();
2311 case 104: return kt1l
.w_string();
2312 case 105: return kt1l
.l_string();
2313 case 106: return kt1l
.p_string();
2314 case 107: return kt2
.string();
2315 case 108: return kt2
.w_string();
2316 case 109: return kt2
.l_string();
2317 case 110: return kt2
.p_string();
2318 case 111: return k2
.string();
2319 case 112: return k2
.w_string();
2320 case 113: return k2
.l_string();
2321 case 114: return k2
.p_string();
2322 case 115: return k3
.string();
2323 case 116: return k3
.w_string();
2324 case 117: return k3
.l_string();
2325 case 118: return k3
.p_string();
2326 case 119: return k3b
.string();
2327 case 120: return k3b
.w_string();
2328 case 121: return k3b
.l_string();
2329 case 122: return k3b
.p_string();
2330 case 123: return w0
.string();
2331 case 124: return w0
.w_string();
2332 case 125: return w0
.l_string();
2333 case 126: return w0
.p_string();
2334 case 127: return nlx
.string();
2335 case 128: return nlx
.w_string();
2336 case 129: return nlx
.l_string();
2337 case 130: return nlx
.p_string();
2338 case 131: return dvt0
.string();
2339 case 132: return dvt0
.w_string();
2340 case 133: return dvt0
.l_string();
2341 case 134: return dvt0
.p_string();
2342 case 135: return dvt1
.string();
2343 case 136: return dvt1
.w_string();
2344 case 137: return dvt1
.l_string();
2345 case 138: return dvt1
.p_string();
2346 case 139: return dvt2
.string();
2347 case 140: return dvt2
.w_string();
2348 case 141: return dvt2
.l_string();
2349 case 142: return dvt2
.p_string();
2350 case 143: return dvt0w
.string();
2351 case 144: return dvt0w
.w_string();
2352 case 145: return dvt0w
.l_string();
2353 case 146: return dvt0w
.p_string();
2354 case 147: return dvt1w
.string();
2355 case 148: return dvt1w
.w_string();
2356 case 149: return dvt1w
.l_string();
2357 case 150: return dvt1w
.p_string();
2358 case 151: return dvt2w
.string();
2359 case 152: return dvt2w
.w_string();
2360 case 153: return dvt2w
.l_string();
2361 case 154: return dvt2w
.p_string();
2362 case 155: return drout
.string();
2363 case 156: return drout
.w_string();
2364 case 157: return drout
.l_string();
2365 case 158: return drout
.p_string();
2366 case 159: return dsub
.string();
2367 case 160: return dsub
.w_string();
2368 case 161: return dsub
.l_string();
2369 case 162: return dsub
.p_string();
2370 case 163: return vth0
.string();
2371 case 164: return vth0
.w_string();
2372 case 165: return vth0
.l_string();
2373 case 166: return vth0
.p_string();
2374 case 167: return ua1
.string();
2375 case 168: return ua1
.w_string();
2376 case 169: return ua1
.l_string();
2377 case 170: return ua1
.p_string();
2378 case 171: return ua
.string();
2379 case 172: return ua
.w_string();
2380 case 173: return ua
.l_string();
2381 case 174: return ua
.p_string();
2382 case 175: return ub1
.string();
2383 case 176: return ub1
.w_string();
2384 case 177: return ub1
.l_string();
2385 case 178: return ub1
.p_string();
2386 case 179: return ub
.string();
2387 case 180: return ub
.w_string();
2388 case 181: return ub
.l_string();
2389 case 182: return ub
.p_string();
2390 case 183: return uc1
.string();
2391 case 184: return uc1
.w_string();
2392 case 185: return uc1
.l_string();
2393 case 186: return uc1
.p_string();
2394 case 187: return uc
.string();
2395 case 188: return uc
.w_string();
2396 case 189: return uc
.l_string();
2397 case 190: return uc
.p_string();
2398 case 191: return u0
.string();
2399 case 192: return u0
.w_string();
2400 case 193: return u0
.l_string();
2401 case 194: return u0
.p_string();
2402 case 195: return ute
.string();
2403 case 196: return ute
.w_string();
2404 case 197: return ute
.l_string();
2405 case 198: return ute
.p_string();
2406 case 199: return voff
.string();
2407 case 200: return voff
.w_string();
2408 case 201: return voff
.l_string();
2409 case 202: return voff
.p_string();
2410 case 203: return delta
.string();
2411 case 204: return delta
.w_string();
2412 case 205: return delta
.l_string();
2413 case 206: return delta
.p_string();
2414 case 207: return rdsw
.string();
2415 case 208: return rdsw
.w_string();
2416 case 209: return rdsw
.l_string();
2417 case 210: return rdsw
.p_string();
2418 case 211: return prwg
.string();
2419 case 212: return prwg
.w_string();
2420 case 213: return prwg
.l_string();
2421 case 214: return prwg
.p_string();
2422 case 215: return prwb
.string();
2423 case 216: return prwb
.w_string();
2424 case 217: return prwb
.l_string();
2425 case 218: return prwb
.p_string();
2426 case 219: return prt
.string();
2427 case 220: return prt
.w_string();
2428 case 221: return prt
.l_string();
2429 case 222: return prt
.p_string();
2430 case 223: return eta0
.string();
2431 case 224: return eta0
.w_string();
2432 case 225: return eta0
.l_string();
2433 case 226: return eta0
.p_string();
2434 case 227: return etab
.string();
2435 case 228: return etab
.w_string();
2436 case 229: return etab
.l_string();
2437 case 230: return etab
.p_string();
2438 case 231: return pclm
.string();
2439 case 232: return pclm
.w_string();
2440 case 233: return pclm
.l_string();
2441 case 234: return pclm
.p_string();
2442 case 235: return pdibl1
.string();
2443 case 236: return pdibl1
.w_string();
2444 case 237: return pdibl1
.l_string();
2445 case 238: return pdibl1
.p_string();
2446 case 239: return pdibl2
.string();
2447 case 240: return pdibl2
.w_string();
2448 case 241: return pdibl2
.l_string();
2449 case 242: return pdibl2
.p_string();
2450 case 243: return pdiblb
.string();
2451 case 244: return pdiblb
.w_string();
2452 case 245: return pdiblb
.l_string();
2453 case 246: return pdiblb
.p_string();
2454 case 247: return pscbe1
.string();
2455 case 248: return pscbe1
.w_string();
2456 case 249: return pscbe1
.l_string();
2457 case 250: return pscbe1
.p_string();
2458 case 251: return pscbe2
.string();
2459 case 252: return pscbe2
.w_string();
2460 case 253: return pscbe2
.l_string();
2461 case 254: return pscbe2
.p_string();
2462 case 255: return pvag
.string();
2463 case 256: return pvag
.w_string();
2464 case 257: return pvag
.l_string();
2465 case 258: return pvag
.p_string();
2466 case 259: return wr
.string();
2467 case 260: return wr
.w_string();
2468 case 261: return wr
.l_string();
2469 case 262: return wr
.p_string();
2470 case 263: return dwg
.string();
2471 case 264: return dwg
.w_string();
2472 case 265: return dwg
.l_string();
2473 case 266: return dwg
.p_string();
2474 case 267: return dwb
.string();
2475 case 268: return dwb
.w_string();
2476 case 269: return dwb
.l_string();
2477 case 270: return dwb
.p_string();
2478 case 271: return b0
.string();
2479 case 272: return b0
.w_string();
2480 case 273: return b0
.l_string();
2481 case 274: return b0
.p_string();
2482 case 275: return b1
.string();
2483 case 276: return b1
.w_string();
2484 case 277: return b1
.l_string();
2485 case 278: return b1
.p_string();
2486 case 279: return alpha0
.string();
2487 case 280: return alpha0
.w_string();
2488 case 281: return alpha0
.l_string();
2489 case 282: return alpha0
.p_string();
2490 case 283: return beta0
.string();
2491 case 284: return beta0
.w_string();
2492 case 285: return beta0
.l_string();
2493 case 286: return beta0
.p_string();
2494 case 287: return elm
.string();
2495 case 288: return elm
.w_string();
2496 case 289: return elm
.l_string();
2497 case 290: return elm
.p_string();
2498 case 291: return vfbcv
.string();
2499 case 292: return vfbcv
.w_string();
2500 case 293: return vfbcv
.l_string();
2501 case 294: return vfbcv
.p_string();
2502 case 295: return cgsl
.string();
2503 case 296: return cgsl
.w_string();
2504 case 297: return cgsl
.l_string();
2505 case 298: return cgsl
.p_string();
2506 case 299: return cgdl
.string();
2507 case 300: return cgdl
.w_string();
2508 case 301: return cgdl
.l_string();
2509 case 302: return cgdl
.p_string();
2510 case 303: return ckappa
.string();
2511 case 304: return ckappa
.w_string();
2512 case 305: return ckappa
.l_string();
2513 case 306: return ckappa
.p_string();
2514 case 307: return cf
.string();
2515 case 308: return cf
.w_string();
2516 case 309: return cf
.l_string();
2517 case 310: return cf
.p_string();
2518 case 311: return clc
.string();
2519 case 312: return clc
.w_string();
2520 case 313: return clc
.l_string();
2521 case 314: return clc
.p_string();
2522 case 315: return cle
.string();
2523 case 316: return cle
.w_string();
2524 case 317: return cle
.l_string();
2525 case 318: return cle
.p_string();
2526 case 319: return capMod
.string();
2527 case 320: return nqsMod
.string();
2528 case 321: return mobMod
.string();
2529 case 322: return noiMod
.string();
2530 case 323: return paramChk
.string();
2531 case 324: return binUnit
.string();
2532 case 325: return version
.string();
2533 case 326: return tox
.string();
2534 case 327: return xpart
.string();
2535 case 328: return jctSidewallSatCurDensity
.string();
2536 case 329: return mjswg
.string();
2537 case 330: return pbswg
.string();
2538 case 331: return unitLengthGateSidewallJctCap
.string();
2539 case 332: return jctEmissionCoeff
.string();
2540 case 333: return jctTempExponent
.string();
2541 case 334: return Lint
.string();
2542 case 335: return Ll
.string();
2543 case 336: return Lln
.string();
2544 case 337: return Lw
.string();
2545 case 338: return Lwn
.string();
2546 case 339: return Lwl
.string();
2547 case 340: return Wint
.string();
2548 case 341: return Wl
.string();
2549 case 342: return Wln
.string();
2550 case 343: return Ww
.string();
2551 case 344: return Wwn
.string();
2552 case 345: return Wwl
.string();
2553 case 346: return dwc
.string();
2554 case 347: return dlc
.string();
2555 case 348: return noia
.string();
2556 case 349: return noib
.string();
2557 case 350: return noic
.string();
2558 case 351: return em
.string();
2559 case 352: return ef
.string();
2560 default: return MODEL_BUILT_IN_MOS_BASE::param_value(i
);
2563 /*--------------------------------------------------------------------------*/
2564 bool MODEL_BUILT_IN_MOS7::is_valid(const COMPONENT
* d
)const
2567 return MODEL_BUILT_IN_MOS_BASE::is_valid(d
);
2569 /*--------------------------------------------------------------------------*/
2570 void MODEL_BUILT_IN_MOS7::tr_eval(COMPONENT
* brh
)const
2572 DEV_BUILT_IN_MOS
* d
= prechecked_cast
<DEV_BUILT_IN_MOS
*>(brh
);
2574 const COMMON_BUILT_IN_MOS
* c
= prechecked_cast
<const COMMON_BUILT_IN_MOS
*>(d
->common());
2576 const SDP_BUILT_IN_MOS7
* s
= prechecked_cast
<const SDP_BUILT_IN_MOS7
*>(c
->sdp());
2578 const MODEL_BUILT_IN_MOS7
* m
= this;
2579 const TDP_BUILT_IN_MOS7
T(d
);
2580 const TDP_BUILT_IN_MOS7
* t
= &T
;
2582 trace3("", d
->vds
, d
->vgs
, d
->vbs
);
2583 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2584 const double EXP_THRESHOLD
= 34.0;
2585 const double MIN_EXP
= 1.713908431e-15;
2586 const double MAX_EXP
= 5.834617425e14
;
2587 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2588 d
->reverse_if_needed();
2589 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2590 double Vbseff
, dVbseff_dVb
;
2592 double T0
= d
->vbs
- t
->vbsc
- 0.001;
2593 double T1
= sqrt(T0
* T0
- 0.004 * t
->vbsc
);
2594 trace3("", t
->vbsc
, T0
, T1
);
2595 Vbseff
= t
->vbsc
+ 0.5 * (T0
+ T1
);
2596 dVbseff_dVb
= 0.5 * (1.0 + T0
/ T1
);
2597 trace2("raw", Vbseff
, dVbseff_dVb
);
2599 fixzero(&Vbseff
, t
->vbsc
);
2600 if (Vbseff
< d
->vbs
) { // From Spice, to fix numeric problems
2601 // inadequately. Above fixzero should do a
2602 Vbseff
= d
->vbs
; // better job, but I left this in case.
2605 trace2("fixed", Vbseff
, dVbseff_dVb
);
2606 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2607 double Phis
, dPhis_dVb
, sqrtPhis
, dsqrtPhis_dVb
;
2610 double T0
= t
->phi
/ (t
->phi
+ Vbseff
);
2612 dPhis_dVb
= -T0
* T0
;
2613 sqrtPhis
= t
->phis3
/ (t
->phi
+ 0.5 * Vbseff
);
2614 dsqrtPhis_dVb
= -0.5 * sqrtPhis
* sqrtPhis
/ t
->phis3
;
2615 trace0("bs-fwd-bias");
2618 Phis
= t
->phi
- Vbseff
;
2620 sqrtPhis
= sqrt(Phis
);
2621 dsqrtPhis_dVb
= -0.5 / sqrtPhis
;
2622 trace0("bs-normal");
2624 trace4("", Phis
, dPhis_dVb
, sqrtPhis
, dsqrtPhis_dVb
);
2625 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2626 double Xdep
= t
->Xdep0
* sqrtPhis
/ t
->sqrtPhi
;
2627 double dXdep_dVb
= (t
->Xdep0
/ t
->sqrtPhi
) * dsqrtPhis_dVb
;
2628 trace2("", Xdep
, dXdep_dVb
);
2629 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2630 double Theta0
, dTheta0_dVb
;
2632 double lt1
, dlt1_dVb
;
2634 double T3
= sqrt(Xdep
);
2635 double T0
= s
->dvt2
* Vbseff
;
2640 trace4("", T0
, T1
, T2
, T3
);
2643 /* Added to avoid any discontinuity problems caused by dvt2 */
2644 double T4
= 1.0 / (3.0 + 8.0 * T0
);
2645 T1
= (1.0 + 3.0 * T0
) * T4
;
2646 T2
= s
->dvt2
* T4
* T4
;
2647 trace4("dvd2 fix", T0
, T1
, T2
, T3
);
2649 lt1
= m
->factor1
* T3
* T1
;
2650 dlt1_dVb
= m
->factor1
* (0.5 / T3
* T1
* dXdep_dVb
+ T3
* T2
);
2652 trace2("", lt1
, dlt1_dVb
);
2654 double T0
= -0.5 * s
->dvt1
* s
->leff
/ lt1
;
2655 if (T0
> -EXP_THRESHOLD
) {
2656 double T1
= exp(T0
);
2657 Theta0
= T1
* (1.0 + 2.0 * T1
);
2658 double dT1_dVb
= -T0
/ lt1
* T1
* dlt1_dVb
;
2659 dTheta0_dVb
= (1.0 + 4.0 * T1
) * dT1_dVb
;
2660 trace2("T0 > -ET", Theta0
, dTheta0_dVb
);
2662 double T1
= MIN_EXP
;
2663 Theta0
= T1
* (1.0 + 2.0 * T1
);
2665 trace2("T0 < -ET", Theta0
, dTheta0_dVb
);
2668 trace2("", Theta0
, dTheta0_dVb
);
2669 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2670 double dVth_dVb
, dVth_dVd
; // d->von
2672 double V0
= t
->vbi
- t
->phi
;
2675 double ltw
, dltw_dVb
;
2677 double t3
= sqrt(Xdep
);
2678 double t0
= s
->dvt2w
* Vbseff
;
2685 /* Added to avoid any discontinuity problems caused by dvt2w */
2686 double t4
= 1.0 / (3.0 + 8.0 * t0
);
2687 t1
= (1.0 + 3.0 * t0
) * t4
;
2688 t2
= s
->dvt2w
* t4
* t4
;
2690 trace4("", t0
, t1
, t2
, t3
);
2691 ltw
= m
->factor1
* t3
* t1
;
2692 dltw_dVb
= m
->factor1
* (0.5 / t3
* t1
* dXdep_dVb
+ t3
* t2
);
2694 trace2("", ltw
, dltw_dVb
);
2695 double T0
= -0.5 * s
->dvt1w
* s
->weff
* s
->leff
/ ltw
;
2696 if (T0
> -EXP_THRESHOLD
) {
2697 double T1
= exp(T0
);
2698 T2
= T1
* (1.0 + 2.0 * T1
);
2699 double dT1_dVb
= -T0
/ ltw
* T1
* dltw_dVb
;
2700 dT2_dVb
= (1.0 + 4.0 * T1
) * dT1_dVb
;
2702 double T1
= MIN_EXP
;
2703 T2
= T1
* (1.0 + 2.0 * T1
);
2708 dT2_dVb
= s
->dvt0w
* dT2_dVb
* V0
;
2710 trace3("", V0
, T2
, dT2_dVb
);
2711 double T0
= sqrt(1.0 + s
->nlx
/ s
->leff
);
2712 double T1
= t
->k1
* (T0
- 1.0) * t
->sqrtPhi
2713 + (s
->kt1
+ s
->kt1l
/ s
->leff
+ s
->kt2
* Vbseff
) * t
->tempratio_1
;
2714 double tmp2
= m
->tox
* t
->phi
/ (s
->weff
+ s
->w0
);
2716 double T3
= s
->eta0
+ s
->etab
* Vbseff
;
2717 trace4("", T0
, T1
, tmp2
, T3
);
2721 /* avoid discontinuity problems caused by etab */
2722 double T9
= 1.0 / (3.0 - 2.0e4
* T3
);
2723 T3
= (2.0e-4 - T3
) * T9
;
2725 trace3("", T9
, T3
, T4
);
2730 double thetavth
= s
->dvt0
* Theta0
;
2731 double Delt_vth
= thetavth
* V0
;
2732 double dDelt_vth_dVb
= s
->dvt0
* dTheta0_dVb
* V0
;
2733 trace4("", thetavth
, t
->theta0vb0
, Delt_vth
, dDelt_vth_dVb
);
2734 double dDIBL_Sft_dVd
= T3
* t
->theta0vb0
;
2735 double DIBL_Sft
= dDIBL_Sft_dVd
* d
->vds
;
2736 trace2("", dDIBL_Sft_dVd
, DIBL_Sft
);
2738 trace4("", t
->vth0
, t
->k1
, sqrtPhis
, t
->sqrtPhi
);
2739 trace4("", t
->k2
, Vbseff
, Delt_vth
, T2
);
2740 trace4("", s
->k3
, s
->k3b
, Vbseff
, tmp2
);
2741 trace2("", T1
, DIBL_Sft
);
2742 double Vth
= m
->polarity
* t
->vth0
+ t
->k1
* (sqrtPhis
- t
->sqrtPhi
)
2743 - t
->k2
* Vbseff
- Delt_vth
- T2
+ (s
->k3
+ s
->k3b
* Vbseff
) * tmp2
2747 dVth_dVb
= t
->k1
* dsqrtPhis_dVb
- t
->k2
- dDelt_vth_dVb
- dT2_dVb
2748 + s
->k3b
* tmp2
- s
->etab
* d
->vds
* t
->theta0vb0
* T4
2749 + s
->kt2
* t
->tempratio_1
;
2750 dVth_dVd
= -dDIBL_Sft_dVd
;
2752 trace3("", d
->von
, dVth_dVb
, dVth_dVd
);
2753 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2755 double n
, dn_dVb
, dn_dVd
;
2757 double tmp2
= s
->nfactor
* P_EPS_SI
/ Xdep
;
2758 double tmp3
= s
->cdsc
+ s
->cdscb
* Vbseff
+ s
->cdscd
* d
->vds
;
2759 double tmp4
= (tmp2
+ tmp3
* Theta0
+ s
->cit
) / m
->cox
;
2760 trace3("", tmp2
, tmp3
, tmp4
);
2763 dn_dVb
= (-tmp2
/ Xdep
* dXdep_dVb
+ tmp3
* dTheta0_dVb
2764 + s
->cdscb
* Theta0
) / m
->cox
;
2765 dn_dVd
= s
->cdscd
* Theta0
/ m
->cox
;
2766 trace3("n", n
, dn_dVb
, dn_dVd
);
2768 /* avoid discontinuity problems caused by tmp4 */
2769 double T0
= 1.0 / (3.0 + 8.0 * tmp4
);
2770 n
= (1.0 + 3.0 * tmp4
) * T0
;
2772 dn_dVb
= (-tmp2
/ Xdep
* dXdep_dVb
+ tmp3
* dTheta0_dVb
2773 + s
->cdscb
* Theta0
) / m
->cox
* T0
;
2774 dn_dVd
= s
->cdscd
* Theta0
/ m
->cox
* T0
;
2775 trace3("n disc", n
, dn_dVb
, dn_dVd
);
2778 trace3("", n
, dn_dVb
, dn_dVd
);
2779 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2780 /* Poly Gate Si Depletion Effect */
2781 double Vgs_eff
, dVgs_eff_dVg
;
2783 double T0
= t
->vfb
+ t
->phi
;
2784 trace2("Poly", t
->vfb
, t
->phi
);
2785 trace3("", s
->ngate
, d
->vgs
, T0
);
2786 if ((s
->ngate
> 1.e18
) && (s
->ngate
< 1.e25
) && (d
->vgs
> T0
)) {
2787 /* added to avoid the problem caused by ngate */
2788 double T1
= 1.0e6
* P_Q
* P_EPS_SI
* s
->ngate
/ (m
->cox
* m
->cox
);
2789 double T4
= sqrt(1.0 + 2.0 * (d
->vgs
- T0
) / T1
);
2790 double T2
= T1
* (T4
- 1.0);
2791 double T3
= 0.5 * T2
* T2
/ T1
; /* T3 = Vpoly */
2792 double T7
= 1.12 - T3
- 0.05;
2793 double T6
= sqrt(T7
* T7
+ 0.224);
2794 double T5
= 1.12 - 0.5 * (T7
+ T6
);
2795 Vgs_eff
= d
->vgs
- T5
;
2796 dVgs_eff_dVg
= 1.0 - (0.5 - 0.5 / T4
) * (1.0 + T7
/ T6
);
2797 trace2("><", Vgs_eff
, dVgs_eff_dVg
);
2801 trace2("const", Vgs_eff
, dVgs_eff_dVg
);
2804 trace2("", Vgs_eff
, dVgs_eff_dVg
);
2805 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2806 /* Effective Vgst (Vgsteff) Calculation */
2807 double /*Vgsteff,*/ dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
, Vgst2Vtm
;
2808 double VgstNVt
, ExpVgst
; // d->vgst
2810 double Vgst
= Vgs_eff
- d
->von
;
2811 double T10
= 2.0 * n
* t
->vtm
;
2812 VgstNVt
= Vgst
/ T10
;
2813 double ExpArg
= (2.0 * s
->voff
- Vgst
) / T10
;
2814 trace4("", Vgst
, T10
, VgstNVt
, ExpArg
);
2816 /* MCJ: Very small Vgst */
2817 if (VgstNVt
> EXP_THRESHOLD
) {
2819 dVgsteff_dVg
= dVgs_eff_dVg
;
2820 dVgsteff_dVd
= -dVth_dVd
;
2821 dVgsteff_dVb
= -dVth_dVb
;
2822 ExpVgst
= NOT_VALID
;
2823 trace4(">>", d
->vgst
, dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
);
2824 }else if (ExpArg
> EXP_THRESHOLD
) {
2825 double T0
= (Vgst
- s
->voff
) / (n
* t
->vtm
);
2827 d
->vgst
= t
->vtm
* t
->cdep0
/ m
->cox
* ExpVgst
;
2828 dVgsteff_dVg
= d
->vgst
/ (n
* t
->vtm
);
2829 dVgsteff_dVd
= -dVgsteff_dVg
* (dVth_dVd
+ T0
* t
->vtm
* dn_dVd
);
2830 dVgsteff_dVb
= -dVgsteff_dVg
* (dVth_dVb
+ T0
* t
->vtm
* dn_dVb
);
2831 dVgsteff_dVg
*= dVgs_eff_dVg
;
2832 trace4(">", d
->vgst
, dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
);
2834 ExpVgst
= exp(VgstNVt
);
2835 double T1
= T10
* log(1.0 + ExpVgst
);
2836 double dT1_dVg
= ExpVgst
/ (1.0 + ExpVgst
);
2837 double dT1_dVb
= -dT1_dVg
* (dVth_dVb
+ Vgst
/ n
* dn_dVb
)
2839 double dT1_dVd
= -dT1_dVg
* (dVth_dVd
+ Vgst
/ n
* dn_dVd
)
2842 double dT2_dVg
= -m
->cox
/ (t
->vtm
* t
->cdep0
)
2844 double T2
= 1.0 - T10
* dT2_dVg
;
2845 double dT2_dVd
= -dT2_dVg
* (dVth_dVd
- 2.0 * t
->vtm
* ExpArg
* dn_dVd
)
2846 + (T2
- 1.0) / n
* dn_dVd
;
2847 double dT2_dVb
= -dT2_dVg
* (dVth_dVb
- 2.0 * t
->vtm
* ExpArg
* dn_dVb
)
2848 + (T2
- 1.0) / n
* dn_dVb
;
2851 double T3
= T2
* T2
;
2852 dVgsteff_dVg
= (T2
* dT1_dVg
- T1
* dT2_dVg
) / T3
* dVgs_eff_dVg
;
2853 dVgsteff_dVd
= (T2
* dT1_dVd
- T1
* dT2_dVd
) / T3
;
2854 dVgsteff_dVb
= (T2
* dT1_dVb
- T1
* dT2_dVb
) / T3
;
2855 trace4("<", d
->vgst
, dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
);
2857 Vgst2Vtm
= d
->vgst
+ 2.0 * t
->vtm
;
2858 trace3("", d
->vgst
, t
->vtm
, Vgst2Vtm
);
2860 trace1("", d
->vgst
);
2861 trace4("", dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
, Vgst2Vtm
);
2862 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2863 /* Calculate Effective Channel Geometry */
2864 double Weff
, dWeff_dVg
, dWeff_dVb
;
2866 double T9
= sqrtPhis
- t
->sqrtPhi
;
2867 Weff
= s
->weff
- 2.0 * (s
->dwg
* d
->vgst
+ s
->dwb
* T9
);
2868 dWeff_dVg
= -2.0 * s
->dwg
;
2869 dWeff_dVb
= -2.0 * s
->dwb
* dsqrtPhis_dVb
;
2871 if (Weff
< 2.0e-8) {
2872 /* to avoid the discontinuity problem due to Weff*/
2873 double T0
= 1.0 / (6.0e-8 - 2.0 * Weff
);
2874 Weff
= 2.0e-8 * (4.0e-8 - Weff
) * T0
;
2878 trace3("Weff fix", Weff
, dWeff_dVg
, dWeff_dVb
);
2881 trace3("", Weff
, dWeff_dVg
, dWeff_dVb
);
2882 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2883 double Rds
, dRds_dVg
, dRds_dVb
;
2885 double T9
= sqrtPhis
- t
->sqrtPhi
;
2886 double T0
= s
->prwg
* d
->vgst
+ s
->prwb
* T9
;
2888 Rds
= t
->rds0
* (1.0 + T0
);
2889 dRds_dVg
= t
->rds0
* s
->prwg
;
2890 dRds_dVb
= t
->rds0
* s
->prwb
* dsqrtPhis_dVb
;
2892 /* to avoid the discontinuity problem due to prwg and prwb*/
2893 double T1
= 1.0 / (17.0 + 20.0 * T0
);
2894 Rds
= t
->rds0
* (0.8 + T0
) * T1
;
2896 dRds_dVg
= t
->rds0
* s
->prwg
* T1
;
2897 dRds_dVb
= t
->rds0
* s
->prwb
* dsqrtPhis_dVb
* T1
;
2898 trace3("Rds fix", T9
, T0
, T1
);
2899 trace3("Rds fix", Rds
, dRds_dVg
, dRds_dVb
);
2902 trace3("", Rds
, dRds_dVg
, dRds_dVb
);
2903 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2904 /* Calculate Abulk */
2905 double Abulk0
, dAbulk0_dVb
, dAbulk_dVg
, Abulk
, dAbulk_dVb
;
2907 double T1
= 0.5 * t
->k1
/ sqrtPhis
;
2908 double dT1_dVb
= -T1
/ sqrtPhis
* dsqrtPhis_dVb
;
2910 double T9
= sqrt(s
->xj
* Xdep
);
2911 double tmp1
= s
->leff
+ 2.0 * T9
;
2912 double T5
= s
->leff
/ tmp1
;
2913 double tmp2
= s
->a0
* T5
;
2914 double tmp3
= s
->weff
+ s
->b1
;
2915 double tmp4
= s
->b0
/ tmp3
;
2916 double T2
= tmp2
+ tmp4
;
2917 double dT2_dVb
= -T9
/ tmp1
/ Xdep
* dXdep_dVb
;
2918 double T6
= T5
* T5
;
2919 double T7
= T5
* T6
;
2921 Abulk0
= 1.0 + T1
* T2
;
2922 dAbulk0_dVb
= T1
* tmp2
* dT2_dVb
+ T2
* dT1_dVb
;
2924 double T8
= s
->ags
* s
->a0
* T7
;
2925 dAbulk_dVg
= -T1
* T8
;
2926 Abulk
= Abulk0
+ dAbulk_dVg
* d
->vgst
;
2927 dAbulk_dVb
= dAbulk0_dVb
- T8
* d
->vgst
* (dT1_dVb
+ 3.0 * T1
* dT2_dVb
);
2929 trace2("1", Abulk0
, dAbulk0_dVb
);
2930 trace3("1", dAbulk_dVg
, Abulk
, dAbulk_dVb
);
2933 /* added to avoid the problems caused by Abulk0 */
2934 double t9
= 1.0 / (3.0 - 20.0 * Abulk0
);
2935 Abulk0
= (0.2 - Abulk0
) * t9
;
2936 dAbulk0_dVb
*= t9
* t9
;
2937 trace2("2", Abulk0
, dAbulk0_dVb
);
2940 /* added to avoid the problems caused by Abulk */
2941 double t9
= 1.0 / (3.0 - 20.0 * Abulk
);
2942 Abulk
= (0.2 - Abulk
) * t9
;
2943 dAbulk_dVb
*= t9
* t9
;
2944 trace3("2", dAbulk_dVg
, Abulk
, dAbulk_dVb
);
2949 double t2
= s
->keta
* Vbseff
;
2951 T0
= 1.0 / (1.0 + t2
);
2952 dT0_dVb
= -s
->keta
* T0
* T0
;
2953 trace3("", t2
, T0
, dT0_dVb
);
2955 /* added to avoid the problems caused by Keta */
2956 double t1
= 1.0 / (0.8 + T2
);
2957 T0
= (17.0 + 20.0 * T2
) * t1
;
2958 dT0_dVb
= -s
->keta
* t1
* t1
;
2959 trace3("keta fix", T2
, T0
, dT0_dVb
);
2963 dAbulk_dVb
= dAbulk_dVb
* T0
+ Abulk
* dT0_dVb
;
2964 dAbulk0_dVb
= dAbulk0_dVb
* T0
+ Abulk0
* dT0_dVb
;
2968 trace2("", Abulk0
, dAbulk0_dVb
);
2969 trace3("", dAbulk_dVg
, Abulk
, dAbulk_dVb
);
2970 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2971 /* Mobility calculation */
2972 double ueff
, dueff_dVg
, dueff_dVd
, dueff_dVb
;
2974 double Denomi
, dDenomi_dVg
, dDenomi_dVd
, dDenomi_dVb
;
2977 if (m
->mobMod
== 1) {
2978 double T0
= d
->vgst
+ d
->von
+ d
->von
;
2979 double T2
= t
->ua
+ t
->uc
* Vbseff
;
2980 double T3
= T0
/ m
->tox
;
2981 T5
= T3
* (T2
+ t
->ub
* T3
);
2982 dDenomi_dVg
= (T2
+ 2.0 * t
->ub
* T3
) / m
->tox
;
2983 dDenomi_dVd
= dDenomi_dVg
* 2.0 * dVth_dVd
;
2984 dDenomi_dVb
= dDenomi_dVg
* 2.0 * dVth_dVb
+ t
->uc
* T3
;
2985 }else if (m
->mobMod
== 2) {
2986 T5
= d
->vgst
/ m
->tox
2987 * (t
->ua
+ t
->uc
* Vbseff
+ t
->ub
* d
->vgst
/ m
->tox
);
2988 dDenomi_dVg
= (t
->ua
+ t
->uc
* Vbseff
+ 2.0 * t
->ub
* d
->vgst
/ m
->tox
)
2991 dDenomi_dVb
= d
->vgst
* t
->uc
/ m
->tox
;
2993 double T0
= d
->vgst
+ d
->von
+ d
->von
;
2994 double T2
= 1.0 + t
->uc
* Vbseff
;
2995 double T3
= T0
/ m
->tox
;
2996 double T4
= T3
* (t
->ua
+ t
->ub
* T3
);
2998 dDenomi_dVg
= (t
->ua
+ 2.0 * t
->ub
* T3
) * T2
/ m
->tox
;
2999 dDenomi_dVd
= dDenomi_dVg
* 2.0 * dVth_dVd
;
3000 dDenomi_dVb
= dDenomi_dVg
* 2.0 * dVth_dVb
+ t
->uc
* T4
;
3005 /* Added to avoid the discontinuity problem caused by ua and ub*/
3006 double t9
= 1.0 / (7.0 + 10.0 * T5
);
3007 Denomi
= (0.6 + T5
) * t9
;
3014 ueff
= t
->u0temp
/ Denomi
;
3015 double t9
= -ueff
/ Denomi
;
3016 dueff_dVg
= t9
* dDenomi_dVg
;
3017 dueff_dVd
= t9
* dDenomi_dVd
;
3018 dueff_dVb
= t9
* dDenomi_dVb
;
3020 trace4("", ueff
, dueff_dVg
, dueff_dVd
, dueff_dVb
);
3021 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3022 double Esat
, EsatL
, dEsatL_dVg
, dEsatL_dVd
, dEsatL_dVb
;
3024 Esat
= 2.0 * t
->vsattemp
/ ueff
;
3025 EsatL
= Esat
* s
->leff
;
3026 double T0
= -EsatL
/ueff
;
3027 dEsatL_dVg
= T0
* dueff_dVg
;
3028 dEsatL_dVd
= T0
* dueff_dVd
;
3029 dEsatL_dVb
= T0
* dueff_dVb
;
3031 trace2("", Esat
, EsatL
);
3032 trace3("", dEsatL_dVg
, dEsatL_dVd
, dEsatL_dVb
);
3033 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3034 double Vdsat
, dVdsat_dVg
, dVdsat_dVd
, dVdsat_dVb
; // d->vdsat
3035 double Vasat
, dVasat_dVg
, dVasat_dVb
, dVasat_dVd
;
3039 double WVCox
= Weff
* t
->vsattemp
* m
->cox
;
3040 WVCoxRds
= WVCox
* Rds
;
3042 trace1("", WVCoxRds
);
3044 double Lambda
, dLambda_dVg
;
3049 }else if (s
->a1
> 0.0) {
3050 /* avoid discontinuity problem caused by s->a1 and s->a2 (Lambda) */
3051 double T0
= 1.0 - s
->a2
;
3052 double T1
= T0
- s
->a1
* d
->vgst
- 0.0001;
3053 double T2
= sqrt(T1
* T1
+ 0.0004 * T0
);
3054 Lambda
= s
->a2
+ T0
- 0.5 * (T1
+ T2
);
3055 dLambda_dVg
= 0.5 * s
->a1
* (1.0 + T1
/ T2
);
3057 double T1
= s
->a2
+ s
->a1
* d
->vgst
- 0.0001;
3058 double T2
= sqrt(T1
* T1
+ 0.0004 * s
->a2
);
3059 Lambda
= 0.5 * (T1
+ T2
);
3060 dLambda_dVg
= 0.5 * s
->a1
* (1.0 + T1
/ T2
);
3063 trace2("", Lambda
, dLambda_dVg
);
3067 tmp2
= dRds_dVg
/ Rds
+ dWeff_dVg
/ Weff
;
3068 tmp3
= dRds_dVb
/ Rds
+ dWeff_dVb
/ Weff
;
3070 tmp2
= dWeff_dVg
/ Weff
;
3071 tmp3
= dWeff_dVb
/ Weff
;
3073 trace2("", tmp2
, tmp3
);
3075 //double Vdsat, dVdsat_dVg, dVdsat_dVd, dVdsat_dVb; // d->vdsat
3078 if ((Rds
== 0.0) && (Lambda
== 1.0)) {
3079 double T0
= 1.0 / (Abulk
* EsatL
+ Vgst2Vtm
);
3081 double T1
= T0
* T0
;
3082 double T2
= Vgst2Vtm
* T0
;
3083 double T3
= EsatL
* Vgst2Vtm
;
3085 double dT0_dVg
= -(Abulk
* dEsatL_dVg
+ EsatL
* dAbulk_dVg
+ 1.0)*T1
;
3086 double dT0_dVd
= -(Abulk
* dEsatL_dVd
) * T1
;
3087 double dT0_dVb
= -(Abulk
* dEsatL_dVb
+ dAbulk_dVb
* EsatL
) * T1
;
3088 dVdsat_dVg
= T3
* dT0_dVg
+ T2
* dEsatL_dVg
+ EsatL
* T0
;
3089 dVdsat_dVd
= T3
* dT0_dVd
+ T2
* dEsatL_dVd
;
3090 dVdsat_dVb
= T3
* dT0_dVb
+ T2
* dEsatL_dVb
;
3092 tmp1
= dLambda_dVg
/ (Lambda
* Lambda
);
3093 double T9
= Abulk
* WVCoxRds
;
3094 double T8
= Abulk
* T9
;
3095 double T7
= Vgst2Vtm
* T9
;
3096 double T6
= Vgst2Vtm
* WVCoxRds
;
3097 double T0
= 2.0 * Abulk
* (T9
- 1.0 + 1.0 / Lambda
);
3098 double dT0_dVg
= 2.0 * (T8
* tmp2
- Abulk
* tmp1
3099 + (2.0 * T9
+ 1.0 / Lambda
- 1.0) * dAbulk_dVg
);
3100 double dT0_dVb
= 2.0 * (T8
* (2.0 / Abulk
* dAbulk_dVb
+ tmp3
)
3101 + (1.0 / Lambda
- 1.0) * dAbulk_dVb
);
3102 //double dT0_dVd = 0.0;
3104 double T1
= Vgst2Vtm
* (2.0 / Lambda
- 1.0) + Abulk
* EsatL
+ 3.0*T7
;
3105 double dT1_dVg
= (2.0 / Lambda
- 1.0) - 2.0 * Vgst2Vtm
* tmp1
3106 + Abulk
* dEsatL_dVg
+ EsatL
* dAbulk_dVg
3107 + 3.0 * (T9
+ T7
* tmp2
+ T6
* dAbulk_dVg
);
3108 double dT1_dVb
= Abulk
* dEsatL_dVb
+ EsatL
* dAbulk_dVb
3109 + 3.0 * (T6
* dAbulk_dVb
+ T7
* tmp3
);
3110 double dT1_dVd
= Abulk
* dEsatL_dVd
;
3112 double T2
= Vgst2Vtm
* (EsatL
+ 2.0 * T6
);
3113 double dT2_dVg
= EsatL
+ Vgst2Vtm
* dEsatL_dVg
3114 + T6
* (4.0 + 2.0 * Vgst2Vtm
* tmp2
);
3115 double dT2_dVb
= Vgst2Vtm
* (dEsatL_dVb
+ 2.0 * T6
* tmp3
);
3116 double dT2_dVd
= Vgst2Vtm
* dEsatL_dVd
;
3118 double T3
= sqrt(T1
* T1
- 2.0 * T0
* T2
);
3119 Vdsat
= (T1
- T3
) / T0
;
3120 dVdsat_dVg
= (dT1_dVg
- (T1
* dT1_dVg
- dT0_dVg
* T2
3121 - T0
* dT2_dVg
) / T3
- Vdsat
* dT0_dVg
) / T0
;
3122 dVdsat_dVb
= (dT1_dVb
- (T1
* dT1_dVb
- dT0_dVb
* T2
3123 - T0
* dT2_dVb
) / T3
- Vdsat
* dT0_dVb
) / T0
;
3124 dVdsat_dVd
= (dT1_dVd
- (T1
* dT1_dVd
- T0
* dT2_dVd
) / T3
) / T0
;
3127 d
->saturated
= (d
->vds
>= d
->vdsat
);
3130 trace4("d->vdsat", Vdsat
, dVdsat_dVg
, dVdsat_dVd
, dVdsat_dVb
);
3132 // double Vasat, dVasat_dVg, dVasat_dVb, dVasat_dVd;
3134 double tmp4
= 1.0 - 0.5 * Abulk
* Vdsat
/ Vgst2Vtm
;
3135 double T9
= WVCoxRds
* d
->vgst
;
3136 double T8
= T9
/ Vgst2Vtm
;
3137 double T0
= EsatL
+ Vdsat
+ 2.0 * T9
* tmp4
;
3138 double T7
= 2.0 * WVCoxRds
* tmp4
;
3139 double dT0_dVg
= dEsatL_dVg
+ dVdsat_dVg
+ T7
* (1.0 + tmp2
* d
->vgst
)
3140 - T8
* (Abulk
* dVdsat_dVg
- Abulk
* Vdsat
/ Vgst2Vtm
3141 + Vdsat
* dAbulk_dVg
);
3142 double dT0_dVb
= dEsatL_dVb
+ dVdsat_dVb
+ T7
* tmp3
* d
->vgst
3143 - T8
* (dAbulk_dVb
* Vdsat
+ Abulk
* dVdsat_dVb
);
3144 double dT0_dVd
= dEsatL_dVd
+ dVdsat_dVd
- T8
* Abulk
* dVdsat_dVd
;
3145 T9
= WVCoxRds
* Abulk
;
3146 double T1
= 2.0 / Lambda
- 1.0 + T9
;
3147 double dT1_dVg
= -2.0 * tmp1
+ WVCoxRds
* (Abulk
* tmp2
+ dAbulk_dVg
);
3148 double dT1_dVb
= dAbulk_dVb
* WVCoxRds
+ T9
* tmp3
;
3150 dVasat_dVg
= (dT0_dVg
- Vasat
* dT1_dVg
) / T1
;
3151 dVasat_dVb
= (dT0_dVb
- Vasat
* dT1_dVb
) / T1
;
3152 dVasat_dVd
= dT0_dVd
/ T1
;
3154 trace4("", Vasat
, dVasat_dVg
, dVasat_dVb
, dVasat_dVd
);
3156 trace1("", d
->vdsat
);
3157 trace4("", Vdsat
, dVdsat_dVg
, dVdsat_dVd
, dVdsat_dVb
);
3158 trace4("", Vasat
, dVasat_dVg
, dVasat_dVb
, dVasat_dVd
);
3159 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3160 /* Effective Vds (Vdseff) Calculation */
3161 double Vdseff
, diffVds
, dVdseff_dVg
, dVdseff_dVd
, dVdseff_dVb
;
3163 double T1
= Vdsat
- d
->vds
- s
->delta
;
3164 double dT1_dVg
= dVdsat_dVg
;
3165 double dT1_dVd
= dVdsat_dVd
- 1.0;
3166 double dT1_dVb
= dVdsat_dVb
;
3167 trace4("", T1
, dT1_dVg
, dT1_dVd
, dT1_dVb
);
3169 double T2
= sqrt(T1
* T1
+ 4.0 * s
->delta
* Vdsat
);
3170 double T0
= T1
/ T2
;
3171 double T3
= 2.0 * s
->delta
/ T2
;
3172 trace3("", T2
, T0
, T3
);
3173 double dT2_dVg
= T0
* dT1_dVg
+ T3
* dVdsat_dVg
;
3174 double dT2_dVd
= T0
* dT1_dVd
+ T3
* dVdsat_dVd
;
3175 double dT2_dVb
= T0
* dT1_dVb
+ T3
* dVdsat_dVb
;
3176 trace3("", dT2_dVg
, dT2_dVd
, dT2_dVb
);
3178 Vdseff
= Vdsat
- 0.5 * (T1
+ T2
);
3179 dVdseff_dVg
= dVdsat_dVg
- 0.5 * (dT1_dVg
+ dT2_dVg
);
3180 dVdseff_dVd
= dVdsat_dVd
- 0.5 * (dT1_dVd
+ dT2_dVd
);
3181 dVdseff_dVb
= dVdsat_dVb
- 0.5 * (dT1_dVb
+ dT2_dVb
);
3182 trace4("raw", Vdseff
, dVdseff_dVg
, dVdseff_dVd
, dVdseff_dVb
);
3184 fixzero(&Vdseff
, Vdsat
);
3185 fixzero(&dVdseff_dVg
, dVdsat_dVg
);
3186 fixzero(&dVdseff_dVd
, dVdsat_dVd
);
3187 fixzero(&dVdseff_dVb
, dVdsat_dVb
);
3188 /* Added to eliminate non-zero Vdseff at Vds=0.0 */
3189 if (d
->vds
== 0.0) {
3190 assert(Vdseff
== 0.0);
3191 assert(dVdseff_dVg
== 0.0);
3192 assert(dVdseff_dVb
== 0.0);
3194 if (Vdseff
> d
->vds
) { // From Spice, to fix numeric problems.
3195 trace2("numeric problems", Vdseff
, d
->vds
);
3198 trace4("fixed", Vdseff
, dVdseff_dVg
, dVdseff_dVd
, dVdseff_dVb
);
3200 diffVds
= d
->vds
- Vdseff
;
3201 trace2("", Vdseff
, diffVds
);
3203 trace2("", Vdseff
, diffVds
);
3204 trace3("", dVdseff_dVg
, dVdseff_dVd
, dVdseff_dVb
);
3205 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3207 double Idsa
, dIdsa_dVg
, dIdsa_dVd
, dIdsa_dVb
;
3209 double Va
, dVa_dVg
, dVa_dVd
, dVa_dVb
;
3211 double VACLM
, dVACLM_dVg
, dVACLM_dVb
, dVACLM_dVd
;
3212 if ((s
->pclm
> 0.0) && (diffVds
> 1.0e-10)) {
3213 double T0
= 1.0 / (s
->pclm
* Abulk
* s
->litl
);
3214 double dT0_dVb
= -T0
/ Abulk
* dAbulk_dVb
;
3215 double dT0_dVg
= -T0
/ Abulk
* dAbulk_dVg
;
3216 double T2
= d
->vgst
/ EsatL
;
3217 double T1
= s
->leff
* (Abulk
+ T2
);
3218 double dT1_dVg
= s
->leff
* ((1.0-T2
*dEsatL_dVg
)/EsatL
+ dAbulk_dVg
);
3219 double dT1_dVb
= s
->leff
* (dAbulk_dVb
- T2
* dEsatL_dVb
/ EsatL
);
3220 double dT1_dVd
= -T2
* dEsatL_dVd
/ Esat
;
3221 double T9
= T0
* T1
;
3222 VACLM
= T9
* diffVds
;
3223 dVACLM_dVg
= T0
* dT1_dVg
* diffVds
- T9
* dVdseff_dVg
3224 + T1
* diffVds
* dT0_dVg
;
3225 dVACLM_dVb
= (dT0_dVb
*T1
+ T0
*dT1_dVb
) * diffVds
- T9
* dVdseff_dVb
;
3226 dVACLM_dVd
= T0
* dT1_dVd
* diffVds
+ T9
* (1.0 - dVdseff_dVd
);
3229 dVACLM_dVd
= dVACLM_dVg
= dVACLM_dVb
= 0.0;
3231 trace4("", VACLM
, dVACLM_dVg
, dVACLM_dVb
, dVACLM_dVd
);
3233 double VADIBL
, dVADIBL_dVg
, dVADIBL_dVb
, dVADIBL_dVd
;
3234 if (t
->thetaRout
> 0.0) {
3235 double T8
= Abulk
* Vdsat
;
3236 double T0
= Vgst2Vtm
* T8
;
3237 double dT0_dVg
= Vgst2Vtm
* Abulk
* dVdsat_dVg
+ T8
3238 + Vgst2Vtm
* Vdsat
* dAbulk_dVg
;
3239 double dT0_dVb
= Vgst2Vtm
* (dAbulk_dVb
*Vdsat
+ Abulk
*dVdsat_dVb
);
3240 double dT0_dVd
= Vgst2Vtm
* Abulk
* dVdsat_dVd
;
3241 double T1
= Vgst2Vtm
+ T8
;
3242 double dT1_dVg
= 1.0 + Abulk
* dVdsat_dVg
+ Vdsat
* dAbulk_dVg
;
3243 double dT1_dVb
= Abulk
* dVdsat_dVb
+ dAbulk_dVb
* Vdsat
;
3244 double dT1_dVd
= Abulk
* dVdsat_dVd
;
3245 double T9
= T1
* T1
;
3246 double T2
= t
->thetaRout
;
3247 VADIBL
= (Vgst2Vtm
- T0
/ T1
) / T2
;
3248 dVADIBL_dVg
= (1.0 - dT0_dVg
/ T1
+ T0
* dT1_dVg
/ T9
) / T2
;
3249 dVADIBL_dVb
= (-dT0_dVb
/ T1
+ T0
* dT1_dVb
/ T9
) / T2
;
3250 dVADIBL_dVd
= (-dT0_dVd
/ T1
+ T0
* dT1_dVd
/ T9
) / T2
;
3252 double T7
= s
->pdiblb
* Vbseff
;
3254 double T3
= 1.0 / (1.0 + T7
);
3257 dVADIBL_dVb
= (dVADIBL_dVb
- VADIBL
* s
->pdiblb
) * T3
;
3260 /* Added to avoid the discontinuity problem caused by pdiblcb */
3261 double T4
= 1.0 / (0.8 + T7
);
3262 double T3
= (17.0 + 20.0 * T7
) * T4
;
3264 dVADIBL_dVb
= dVADIBL_dVb
* T3
- VADIBL
* s
->pdiblb
* T4
* T4
;
3270 dVADIBL_dVd
= dVADIBL_dVg
= dVADIBL_dVb
= 0.0;
3272 trace4("", VADIBL
, dVADIBL_dVg
, dVADIBL_dVb
, dVADIBL_dVd
);
3274 double T8
= s
->pvag
/ EsatL
;
3275 double T9
= T8
* d
->vgst
;
3276 double T0
, dT0_dVg
, dT0_dVb
, dT0_dVd
;
3279 dT0_dVg
= T8
* (1.0 - d
->vgst
* dEsatL_dVg
/ EsatL
);
3280 dT0_dVb
= -T9
* dEsatL_dVb
/ EsatL
;
3281 dT0_dVd
= -T9
* dEsatL_dVd
/ EsatL
;
3283 /* Added to avoid the discontinuity problems caused by pvag */
3284 double T1
= 1.0 / (17.0 + 20.0 * T9
);
3285 T0
= (0.8 + T9
) * T1
;
3287 dT0_dVg
= T8
* (1.0 - d
->vgst
* dEsatL_dVg
/ EsatL
) * T1
;
3289 dT0_dVb
= -T9
* dEsatL_dVb
;
3290 dT0_dVd
= -T9
* dEsatL_dVd
;
3292 double tmp1
= VACLM
* VACLM
;
3293 double tmp2
= VADIBL
* VADIBL
;
3294 double tmp3
= VACLM
+ VADIBL
;
3296 double T1
= VACLM
* VADIBL
/ tmp3
;
3298 double dT1_dVg
= (tmp1
* dVADIBL_dVg
+ tmp2
* dVACLM_dVg
) / tmp3
;
3299 double dT1_dVd
= (tmp1
* dVADIBL_dVd
+ tmp2
* dVACLM_dVd
) / tmp3
;
3300 double dT1_dVb
= (tmp1
* dVADIBL_dVb
+ tmp2
* dVACLM_dVb
) / tmp3
;
3302 Va
= Vasat
+ T0
* T1
;
3303 dVa_dVg
= dVasat_dVg
+ T1
* dT0_dVg
+ T0
* dT1_dVg
;
3304 dVa_dVd
= dVasat_dVd
+ T1
* dT0_dVd
+ T0
* dT1_dVd
;
3305 dVa_dVb
= dVasat_dVb
+ T1
* dT0_dVb
+ T0
* dT1_dVb
;
3307 trace4("", Va
, dVa_dVg
, dVa_dVd
, dVa_dVb
);
3309 double Idl
, dIdl_dVg
, dIdl_dVd
, dIdl_dVb
;
3311 double gche
, dgche_dVg
, dgche_dVd
, dgche_dVb
;
3313 double beta
, dbeta_dVg
, dbeta_dVd
, dbeta_dVb
;
3315 double CoxWovL
= m
->cox
* Weff
/ s
->leff
;
3316 beta
= ueff
* CoxWovL
;
3317 dbeta_dVg
= CoxWovL
* dueff_dVg
+ beta
* dWeff_dVg
/ Weff
;
3318 dbeta_dVd
= CoxWovL
* dueff_dVd
;
3319 dbeta_dVb
= CoxWovL
* dueff_dVb
+ beta
* dWeff_dVb
/ Weff
;
3321 trace4("", beta
, dbeta_dVg
, dbeta_dVd
, dbeta_dVb
);
3323 double fgche1
, dfgche1_dVg
, dfgche1_dVd
, dfgche1_dVb
;
3325 double T0
= 1.0 - 0.5 * Abulk
* Vdseff
/ Vgst2Vtm
;
3326 double dT0_dVg
= -0.5 * (Abulk
* dVdseff_dVg
3327 - Abulk
* Vdseff
/ Vgst2Vtm
+ Vdseff
* dAbulk_dVg
) / Vgst2Vtm
;
3328 double dT0_dVd
= -0.5 * Abulk
* dVdseff_dVd
/ Vgst2Vtm
;
3329 double dT0_dVb
= -0.5 * (Abulk
*dVdseff_dVb
+ dAbulk_dVb
*Vdseff
)
3331 fgche1
= d
->vgst
* T0
;
3332 dfgche1_dVg
= d
->vgst
* dT0_dVg
+ T0
;
3333 dfgche1_dVd
= d
->vgst
* dT0_dVd
;
3334 dfgche1_dVb
= d
->vgst
* dT0_dVb
;
3336 trace4("", fgche1
, dfgche1_dVg
, dfgche1_dVd
, dfgche1_dVb
);
3338 double fgche2
, dfgche2_dVg
, dfgche2_dVd
, dfgche2_dVb
;
3340 double T9
= Vdseff
/ EsatL
;
3342 dfgche2_dVg
= (dVdseff_dVg
- T9
* dEsatL_dVg
) / EsatL
;
3343 dfgche2_dVd
= (dVdseff_dVd
- T9
* dEsatL_dVd
) / EsatL
;
3344 dfgche2_dVb
= (dVdseff_dVb
- T9
* dEsatL_dVb
) / EsatL
;
3346 trace4("", fgche2
, dfgche2_dVg
, dfgche2_dVd
, dfgche2_dVb
);
3348 gche
= beta
* fgche1
/ fgche2
;
3349 dgche_dVg
= (beta
* dfgche1_dVg
+ fgche1
* dbeta_dVg
3350 - gche
* dfgche2_dVg
) / fgche2
;
3351 dgche_dVd
= (beta
* dfgche1_dVd
+ fgche1
* dbeta_dVd
3352 - gche
* dfgche2_dVd
) / fgche2
;
3353 dgche_dVb
= (beta
* dfgche1_dVb
+ fgche1
* dbeta_dVb
3354 - gche
* dfgche2_dVb
) / fgche2
;
3356 trace4("", gche
, dgche_dVg
, dgche_dVd
, dgche_dVb
);
3358 double T0
= 1.0 + gche
* Rds
;
3359 double T9
= Vdseff
/ T0
;
3361 dIdl_dVg
= (gche
* dVdseff_dVg
+ T9
* dgche_dVg
) / T0
3362 - Idl
* gche
/ T0
* dRds_dVg
;
3363 dIdl_dVd
= (gche
* dVdseff_dVd
+ T9
* dgche_dVd
) / T0
;
3364 dIdl_dVb
= (gche
*dVdseff_dVb
+ T9
*dgche_dVb
- Idl
*dRds_dVb
*gche
) / T0
;
3366 trace4("", Idl
, dIdl_dVg
, dIdl_dVd
, dIdl_dVb
);
3368 double T9
= diffVds
/ Va
;
3369 double T0
= 1.0 + T9
;
3371 dIdsa_dVg
= T0
* dIdl_dVg
- Idl
* (dVdseff_dVg
+ T9
* dVa_dVg
) / Va
;
3372 dIdsa_dVd
= T0
* dIdl_dVd
+ Idl
* (1.0 - dVdseff_dVd
- T9
*dVa_dVd
) / Va
;
3373 dIdsa_dVb
= T0
* dIdl_dVb
- Idl
* (dVdseff_dVb
+ T9
* dVa_dVb
) / Va
;
3375 trace4("", Idsa
, dIdsa_dVg
, dIdsa_dVd
, dIdsa_dVb
);
3376 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3377 // d->ids, d->gds, d->gmf, d->gmbf
3379 double VASCBE
, dVASCBE_dVg
, dVASCBE_dVd
, dVASCBE_dVb
;
3380 if (s
->pscbe2
> 0.0) {
3381 if (diffVds
> s
->pscbe1
* s
->litl
/ EXP_THRESHOLD
) {
3382 double T0
= s
->pscbe1
* s
->litl
/ diffVds
;
3383 VASCBE
= s
->leff
* exp(T0
) / s
->pscbe2
;
3384 double T1
= T0
* VASCBE
/ diffVds
;
3385 dVASCBE_dVg
= T1
* dVdseff_dVg
;
3386 dVASCBE_dVd
= -T1
* (1.0 - dVdseff_dVd
);
3387 dVASCBE_dVb
= T1
* dVdseff_dVb
;
3389 VASCBE
= MAX_EXP
* s
->leff
/s
->pscbe2
;
3390 dVASCBE_dVg
= dVASCBE_dVd
= dVASCBE_dVb
= 0.0;
3394 dVASCBE_dVg
= dVASCBE_dVd
= dVASCBE_dVb
= 0.0;
3396 double T9
= diffVds
/ VASCBE
;
3397 double T0
= 1.0 + T9
;
3398 double Ids
= Idsa
* T0
;
3399 double Gm
= T0
*dIdsa_dVg
- Idsa
*(dVdseff_dVg
+ T9
*dVASCBE_dVg
) / VASCBE
;
3400 double Gds
= T0
* dIdsa_dVd
3401 + Idsa
* (1.0 - dVdseff_dVd
- T9
* dVASCBE_dVd
) / VASCBE
;
3402 double Gmb
= T0
* dIdsa_dVb
3403 - Idsa
* (dVdseff_dVb
+ T9
* dVASCBE_dVb
) / VASCBE
;
3404 trace3("", T0
, dIdsa_dVb
, (T0
* dIdsa_dVb
));
3405 trace4("", dVdseff_dVb
, T9
, dVASCBE_dVb
, (dVdseff_dVb
+ T9
*dVASCBE_dVb
));
3406 trace3("", Idsa
, VASCBE
, (Idsa
*(dVdseff_dVb
+T9
*dVASCBE_dVb
)/VASCBE
));
3408 Gds
+= Gm
* dVgsteff_dVd
;
3409 Gmb
+= Gm
* dVgsteff_dVb
;
3412 trace4("", Ids
, Gm
, Gds
, Gmb
);
3413 trace0("=========================");
3420 d
->gmf
= d
->gmbf
= 0;
3425 d
->gmr
= d
->gmbr
= 0.;
3428 trace4("", d
->ids
, d
->gds
, d
->gmf
, d
->gmbf
);
3429 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3430 // d->isub, d->gbbs, d->gbgs, d->gbds
3432 /* calculate substrate current Isub */
3433 double Isub
, Gbd
, Gbb
, Gbg
;
3434 if ((s
->alpha0
<= 0.0) || (s
->beta0
<= 0.0)) {
3435 Isub
= Gbd
= Gbb
= Gbg
= 0.0;
3436 trace4("no-isub", Isub
, Gbd
, Gbb
, Gbg
);
3438 double T2
= s
->alpha0
/ s
->leff
;
3439 double T1
, dT1_dVg
, dT1_dVd
, dT1_dVb
;
3440 if (diffVds
> s
->beta0
/ EXP_THRESHOLD
) {
3441 double T0
= -s
->beta0
/ diffVds
;
3442 T1
= T2
* diffVds
* exp(T0
);
3443 double T3
= T1
/ diffVds
* (T0
- 1.0);
3444 trace3("", T0
, T2
, T3
);
3445 dT1_dVg
= T3
* dVdseff_dVg
;
3446 dT1_dVd
= T3
* (dVdseff_dVd
- 1.0);
3447 dT1_dVb
= T3
* dVdseff_dVb
;
3448 trace4("vds > ?", T1
, dT1_dVg
, dT1_dVd
, dT1_dVb
);
3450 double T3
= T2
* MIN_EXP
;
3453 dT1_dVg
= -T3
* dVdseff_dVg
;
3454 dT1_dVd
= T3
* (1.0 - dVdseff_dVd
);
3455 dT1_dVb
= -T3
* dVdseff_dVb
;
3456 trace4("vds < ?", T1
, dT1_dVg
, dT1_dVd
, dT1_dVb
);
3459 Gbg
= T1
* dIdsa_dVg
+ Idsa
* dT1_dVg
;
3460 Gbd
= T1
* dIdsa_dVd
+ Idsa
* dT1_dVd
;
3461 Gbb
= T1
* dIdsa_dVb
+ Idsa
* dT1_dVb
;
3462 trace4("raw", Isub
, Gbd
, Gbb
, Gbg
);
3464 Gbd
+= Gbg
* dVgsteff_dVd
;
3465 Gbb
+= Gbg
* dVgsteff_dVb
;
3466 Gbg
*= dVgsteff_dVg
;
3467 Gbb
*= dVbseff_dVb
; /* bug fixing */
3469 trace4("", Isub
, Gbd
, Gbb
, Gbg
);
3475 d
->isb
= d
->gsbsd
= d
->gsbgd
= d
->gsbbd
= 0.;
3477 d
->idb
= d
->gdbds
= d
->gdbgs
= d
->gdbbs
= 0.;
3483 //double d__csub = Isub - (Gbb * Vbseff + Gbd * d->vds + Gbg * d->vgs);
3485 //trace4("", d->isb, d->gbbs, d->gbgs, d->gbds);
3486 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3487 /* Calculate Qinv for Noise analysis */
3489 //double T1 = d->vgst * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm);
3490 //double d__qinv = -m->cox * Weff * s->leff * T1;
3492 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3493 // ends line 2020 (finished)
3494 // d->qgate, d->qdrn, d->qbulk
3495 // d->cggb, d->cgsb, d->cgdb
3496 // d->cdgb, d->cdsb, d->cddb
3497 // d->cbgb, d->cbsb, d->cbdb
3499 const bool ChargeComputationNeeded
= true;
3500 trace2("", m
->xpart
, m
->capMod
);
3501 if ((m
->xpart
< 0) || (!ChargeComputationNeeded
)) {
3502 d
->qgate
= d
->qdrn
= d
->qbulk
= 0.0;
3503 d
->cggb
= d
->cgsb
= d
->cgdb
= 0.0;
3504 d
->cdgb
= d
->cdsb
= d
->cddb
= 0.0;
3505 d
->cbgb
= d
->cbsb
= d
->cbdb
= 0.0;
3506 trace0("xpart < 0 || no charge computation");
3507 }else if (m
->capMod
== 0) {
3508 // block ends 1710 this 1454
3509 trace0("begin capMod == 0 (mos7)");
3510 if (Vbseff
< 0.0) { // redefinition
3514 Vbseff
= t
->phi
- Phis
;
3515 dVbseff_dVb
= -dPhis_dVb
;
3517 trace1("old value replaced", dVth_dVb
);
3518 double Vfb
= s
->vfbcv
; // possible improper redefinition later
3519 double Vth
= Vfb
+ t
->phi
+ t
->k1
* sqrtPhis
;
3520 dVth_dVb
= t
->k1
* dsqrtPhis_dVb
; // redefinition
3521 double Vgst
= Vgs_eff
- Vth
;
3522 //double dVgst_dVb = -dVth_dVb;
3523 //double dVgst_dVg = dVgs_eff_dVg;
3524 double CoxWL
= m
->cox
* s
->weffCV
* s
->leffCV
;
3525 double Arg1
= Vgs_eff
- Vbseff
- Vfb
;
3526 trace3("", Vfb
, Vth
, dVth_dVb
);
3527 trace3("", Vgst
, CoxWL
, Arg1
);
3529 // ends 1618 this 1328
3531 trace0("Arg1 <= 0.0");
3533 d
->qgate
= CoxWL
* Arg1
;
3534 d
->cggb
= CoxWL
* dVgs_eff_dVg
;
3536 d
->cgsb
= CoxWL
* (dVbseff_dVb
- dVgs_eff_dVg
);
3538 d
->qbulk
= -d
->qgate
;
3539 d
->cbgb
= -CoxWL
* dVgs_eff_dVg
;
3547 }else if (Vgst
<= 0.0) {
3548 trace0("Vgst <= 0.0");
3549 double T1
= 0.5 * t
->k1
;
3550 double T2
= sqrt(T1
* T1
+ Arg1
);
3551 double T0
= CoxWL
* T1
/ T2
;
3553 d
->qgate
= CoxWL
* t
->k1
* (T2
- T1
);
3554 d
->cggb
= T0
* dVgs_eff_dVg
;
3556 d
->cgsb
= T0
* (dVbseff_dVb
- dVgs_eff_dVg
);
3558 d
->qbulk
= -d
->qgate
;
3568 trace0("!(Arg1 <= 0.0 || Vgst <= 0.0)");
3569 double One_Third_CoxWL
= CoxWL
/ 3.0;
3570 double Two_Third_CoxWL
= 2.0 * One_Third_CoxWL
;
3571 // redefine Vdsat, dVdsat_dVg, dVdsat_dVb
3573 double AbulkCV
= Abulk0
* s
->abulkCVfactor
;
3574 double dAbulkCV_dVb
= s
->abulkCVfactor
* dAbulk0_dVb
;
3575 Vdsat
= Vgst
/ AbulkCV
;
3576 dVdsat_dVg
= dVgs_eff_dVg
/ AbulkCV
;
3577 dVdsat_dVb
= - (Vdsat
* dAbulkCV_dVb
+ dVth_dVb
)/ AbulkCV
;
3579 if (m
->xpart
> 0.5) {
3580 /* 0/100 Charge petition model */
3581 if (d
->vds
>= Vdsat
) {
3582 /* saturation region */
3583 double T1
= Vdsat
/ 3.0;
3584 double T2
= -One_Third_CoxWL
* dVdsat_dVb
;
3585 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- T1
);
3586 d
->cggb
= One_Third_CoxWL
* (3.0 - dVdsat_dVg
) * dVgs_eff_dVg
;
3587 d
->cgsb
= -(d
->cggb
+ T2
);
3590 double T2a
= -Two_Third_CoxWL
* Vgst
;
3591 double T3
= -(T2
+ Two_Third_CoxWL
* dVth_dVb
);
3592 d
->qbulk
= -(d
->qgate
+ T2a
);
3593 d
->cbgb
= -(d
->cggb
- Two_Third_CoxWL
* dVgs_eff_dVg
);
3594 d
->cbsb
= -(d
->cbgb
+ T3
);
3603 double Alphaz
= Vgst
/ Vdsat
;
3604 double T1
= 2.0 * Vdsat
- d
->vds
;
3605 double T2
= d
->vds
/ (3.0 * T1
);
3606 double T3
= T2
* d
->vds
;
3607 double T9
= 0.25 * CoxWL
;
3608 double T4
= T9
* Alphaz
;
3609 double T7
= 2.0 * d
->vds
- T1
- 3.0 * T3
;
3610 double T8
= T3
- T1
- 2.0 * d
->vds
;
3611 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- 0.5 * (d
->vds
-T3
));
3612 double T10
= T4
* T8
;
3614 d
->qbulk
= -(d
->qgate
+ d
->qdrn
+ T10
);
3616 double T5
= T3
/ T1
;
3617 d
->cggb
= CoxWL
* (1.0 - T5
* dVdsat_dVg
) * dVgs_eff_dVg
;
3618 double T11
= -CoxWL
* T5
* dVdsat_dVb
;
3619 d
->cgdb
= CoxWL
* (T2
- 0.5 + 0.5 * T5
);
3620 d
->cgsb
= -(d
->cggb
+ T11
+ d
->cgdb
);
3622 double T6
= 1.0 / Vdsat
;
3623 double dAlphaz_dVg
= T6
* (1.0 - Alphaz
* dVdsat_dVg
);
3624 double dAlphaz_dVb
= -T6
* (dVth_dVb
+ Alphaz
* dVdsat_dVb
);
3627 T9
= 2.0 * T4
* (1.0 - 3.0 * T5
);
3628 d
->cdgb
= (T7
* dAlphaz_dVg
- T9
* dVdsat_dVg
) * dVgs_eff_dVg
;
3629 double T12
= T7
* dAlphaz_dVb
- T9
* dVdsat_dVb
;
3630 d
->cddb
= T4
* (3.0 - 6.0 * T2
- 3.0 * T5
);
3631 d
->cdsb
= -(d
->cdgb
+ T12
+ d
->cddb
);
3633 T9
= 2.0 * T4
* (1.0 + T5
);
3634 T10
= (T8
* dAlphaz_dVg
- T9
* dVdsat_dVg
) * dVgs_eff_dVg
;
3635 T11
= T8
* dAlphaz_dVb
- T9
* dVdsat_dVb
;
3636 T12
= T4
* (2.0 * T2
+ T5
- 1.0);
3637 double T0
= -(T10
+ T11
+ T12
);
3638 d
->cbgb
= -(d
->cggb
+ d
->cdgb
+ T10
);
3639 d
->cbdb
= -(d
->cgdb
+ d
->cddb
+ T12
);
3640 d
->cbsb
= -(d
->cgsb
+ d
->cdsb
+ T0
);
3642 }else if (m
->xpart
< 0.5) {
3643 /* 40/60 Charge petition model */
3644 if (d
->vds
>= Vdsat
) {
3645 /* saturation region */
3646 double T1
= Vdsat
/ 3.0;
3647 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- T1
);
3648 double T2
= -Two_Third_CoxWL
* Vgst
;
3649 d
->qbulk
= -(d
->qgate
+ T2
);
3652 d
->cggb
= One_Third_CoxWL
* (3.0 - dVdsat_dVg
) * dVgs_eff_dVg
;
3653 T2
= -One_Third_CoxWL
* dVdsat_dVb
;
3654 d
->cgsb
= -(d
->cggb
+ T2
);
3657 double T3
= 0.4 * Two_Third_CoxWL
;
3658 d
->cdgb
= -T3
* dVgs_eff_dVg
;
3660 double T4
= T3
* dVth_dVb
;
3661 d
->cdsb
= -(T4
+ d
->cdgb
);
3663 d
->cbgb
= -(d
->cggb
- Two_Third_CoxWL
* dVgs_eff_dVg
);
3664 T3
= -(T2
+ Two_Third_CoxWL
* dVth_dVb
);
3665 d
->cbsb
= -(d
->cbgb
+ T3
);
3669 double T1
= 2.0 * Vdsat
- d
->vds
;
3670 double T2
= d
->vds
/ (3.0 * T1
);
3671 double T3
= T2
* d
->vds
;
3672 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- 0.5 * (d
->vds
- T3
));
3673 double T5
= T3
/ T1
;
3674 d
->cggb
= CoxWL
* (1.0 - T5
* dVdsat_dVg
) * dVgs_eff_dVg
;
3675 double tmp
= -CoxWL
* T5
* dVdsat_dVb
;
3676 d
->cgdb
= CoxWL
* (T2
- 0.5 + 0.5 * T5
);
3677 d
->cgsb
= -(d
->cggb
+ d
->cgdb
+ tmp
);
3679 double T6
= 1.0 / Vdsat
;
3680 double Alphaz
= T6
* Vgst
;
3681 double dAlphaz_dVg
= T6
* (1.0 - Alphaz
* dVdsat_dVg
);
3682 double dAlphaz_dVb
= -T6
* (dVth_dVb
+ Alphaz
* dVdsat_dVb
);
3683 T6
= 8.0 * Vdsat
* Vdsat
- 6.0 * Vdsat
* d
->vds
3684 + 1.2 * d
->vds
* d
->vds
;
3685 double T8
= T2
/ T1
;
3686 double T7
= d
->vds
- T1
- T8
* T6
;
3687 double T9
= 0.25 * CoxWL
;
3688 double T4
= T9
* Alphaz
;
3692 double tmp1
= T4
* (2.0 - 4.0 * tmp
* T6
3693 + T8
* (16.0 * Vdsat
- 6.0 * d
->vds
));
3694 d
->cdgb
= (T7
* dAlphaz_dVg
- tmp1
* dVdsat_dVg
) * dVgs_eff_dVg
;
3695 double T10
= T7
* dAlphaz_dVb
- tmp1
* dVdsat_dVb
;
3696 d
->cddb
= T4
* (2.0 - (1.0 / (3.0 * T1
* T1
) + 2.0 * tmp
) * T6
3697 + T8
* (6.0 * Vdsat
- 2.4 * d
->vds
));
3698 d
->cdsb
= -(d
->cdgb
+ T10
+ d
->cddb
);
3700 T7
= 2.0 * (T1
+ T3
);
3701 d
->qbulk
= -(d
->qgate
- T4
* T7
);
3703 double T0
= 4.0 * T4
* (1.0 - T5
);
3704 double T12
= (-T7
* dAlphaz_dVg
- d
->cdgb
- T0
* dVdsat_dVg
)
3706 double T11
= -T7
* dAlphaz_dVb
- T10
- T0
* dVdsat_dVb
;
3707 T10
= -4.0 * T4
* (T2
- 0.5 + 0.5 * T5
) - d
->cddb
;
3708 tmp
= -(T10
+ T11
+ T12
);
3709 d
->cbgb
= -(d
->cggb
+ d
->cdgb
+ T12
);
3710 d
->cbdb
= -(d
->cgdb
+ d
->cddb
+ T11
);
3711 d
->cbsb
= -(d
->cgsb
+ d
->cdsb
+ tmp
);
3712 trace3("0,40/60,lin", T10
, T11
, T12
);
3713 trace3("0,40/60,lin", d
->cbgb
, d
->cbdb
, d
->cbsb
);
3716 /* 50/50 partitioning */
3717 if (d
->vds
>= Vdsat
) {
3718 /* saturation region */
3719 double T1
= Vdsat
/ 3.0;
3720 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- T1
);
3721 double T2
= -Two_Third_CoxWL
* Vgst
;
3722 d
->qbulk
= -(d
->qgate
+ T2
);
3725 T2
= -One_Third_CoxWL
* dVdsat_dVb
;
3726 d
->cggb
= One_Third_CoxWL
* (3.0 - dVdsat_dVg
) * dVgs_eff_dVg
;
3727 d
->cgsb
= -(d
->cggb
+ T2
);
3730 double T4
= One_Third_CoxWL
* dVth_dVb
;
3731 d
->cdgb
= -One_Third_CoxWL
* dVgs_eff_dVg
;
3733 d
->cdsb
= -(T4
+ d
->cdgb
);
3735 double T3
= -(T2
+ Two_Third_CoxWL
* dVth_dVb
);
3736 d
->cbgb
= -(d
->cggb
- Two_Third_CoxWL
* dVgs_eff_dVg
);
3737 d
->cbsb
= -(d
->cbgb
+ T3
);
3741 double T1
= 2.0 * Vdsat
- d
->vds
;
3742 double T2
= d
->vds
/ (3.0 * T1
);
3743 double T3
= T2
* d
->vds
;
3744 double T5
= T3
/ T1
;
3745 double tmp
= -CoxWL
* T5
* dVdsat_dVb
;
3746 d
->qgate
= CoxWL
* (Vgs_eff
- Vfb
- t
->phi
- 0.5 * (d
->vds
-T3
));
3747 d
->cggb
= CoxWL
* (1.0 - T5
* dVdsat_dVg
) * dVgs_eff_dVg
;
3748 d
->cgdb
= CoxWL
* (T2
- 0.5 + 0.5 * T5
);
3749 d
->cgsb
= -(d
->cggb
+ d
->cgdb
+ tmp
);
3751 double T6
= 1.0 / Vdsat
;
3752 double Alphaz
= T6
* Vgst
;
3753 double dAlphaz_dVg
= T6
* (1.0 - Alphaz
* dVdsat_dVg
);
3754 double dAlphaz_dVb
= -T6
* (dVth_dVb
+ Alphaz
* dVdsat_dVb
);
3756 double T9
= 0.25 * CoxWL
;
3757 double T4
= T9
* Alphaz
;
3758 double T7
= T1
+ T3
;
3760 d
->qbulk
= - (d
->qgate
+ d
->qdrn
+ d
->qdrn
);
3763 double T0
= T4
* (2.0 * T5
- 2.0);
3764 double T12
= T0
* dVdsat_dVb
- T7
* dAlphaz_dVb
;
3765 d
->cdgb
= (T0
* dVdsat_dVg
- T7
* dAlphaz_dVg
) * dVgs_eff_dVg
;
3766 d
->cddb
= T4
* (1.0 - 2.0 * T2
- T5
);
3767 d
->cdsb
= -(d
->cdgb
+ T12
+ d
->cddb
);
3769 d
->cbgb
= -(d
->cggb
+ 2.0 * d
->cdgb
);
3770 d
->cbdb
= -(d
->cgdb
+ 2.0 * d
->cddb
);
3771 d
->cbsb
= -(d
->cgsb
+ 2.0 * d
->cdsb
);
3774 } // begins 1328 this 1618
3775 trace0("end capMod == 0");
3776 // end of else if (m->capMod == 0) line 1454 this 1709
3778 trace0("begin capMod != 0 (mos7)");
3779 assert(m
->capMod
!= 0);
3781 double VbseffCV
, dVbseffCV_dVb
;
3784 dVbseffCV_dVb
= 1.0;
3786 VbseffCV
= t
->phi
- Phis
;
3787 dVbseffCV_dVb
= -dPhis_dVb
;
3789 trace2("", VbseffCV
, dVbseffCV_dVb
);
3791 //double Vth = d->von; // possibly wrong value -- scope problem
3792 double Vfb
= d
->von
- t
->phi
- t
->k1
* sqrtPhis
;
3793 double dVfb_dVb
= 0.;//////dVth_dVb - t->k1 * dsqrtPhis_dVb;
3794 double dVfb_dVd
= 0.;//////dVth_dVd;
3796 //double Vgst = Vgs_eff - d->von;
3798 //trace3("", d->vgst, Vgst, VgstNVt);
3799 trace2("", n
, t
->vtm
);
3803 if ((VgstNVt
> -EXP_THRESHOLD
) && (VgstNVt
< EXP_THRESHOLD
)) {
3804 trace0("VgstNVt in range");
3805 assert(ExpVgst
!= NOT_VALID
);
3807 ExpVgst
= exp(VgstNVt
); ////// test
3808 trace1("", ExpVgst
);
3809 Vgsteff
= n
* t
->vtm
* log(1.0 + ExpVgst
);
3810 dVgsteff_dVg
= ExpVgst
/ (1.0 + ExpVgst
);
3811 dVgsteff_dVd
= -dVgsteff_dVg
3812 * (dVth_dVd
+ (Vgs_eff
- d
->von
) / n
* dn_dVd
)
3813 + Vgsteff
/ n
* dn_dVd
;
3814 dVgsteff_dVb
= -dVgsteff_dVg
3815 * (dVth_dVb
+ (Vgs_eff
- d
->von
) / n
* dn_dVb
)
3816 + Vgsteff
/ n
* dn_dVb
;
3817 dVgsteff_dVg
*= dVgs_eff_dVg
;
3822 trace4("", Vgsteff
, dVgsteff_dVg
, dVgsteff_dVd
, dVgsteff_dVb
);
3824 double CoxWL
= m
->cox
* s
->weffCV
* s
->leffCV
;
3827 if (m
->capMod
== 1) {
3828 double Cgg
, Cgd
, Cgb
;
3830 double Arg1
= Vgs_eff
- VbseffCV
- Vfb
- Vgsteff
;
3832 d
->qgate
= CoxWL
* Arg1
;
3833 Cgg
= CoxWL
* (dVgs_eff_dVg
- dVgsteff_dVg
);
3834 Cgd
= -CoxWL
* (dVfb_dVd
+ dVgsteff_dVd
);
3835 Cgb
= -CoxWL
* (dVfb_dVb
+ dVbseffCV_dVb
+ dVgsteff_dVb
);
3837 double T0
= 0.5 * t
->k1
;
3838 double T1
= sqrt(T0
* T0
+ Arg1
);
3839 double T2
= CoxWL
* T0
/ T1
;
3840 d
->qgate
= CoxWL
* t
->k1
* (T1
- T0
);
3841 Cgg
= T2
* (dVgs_eff_dVg
- dVgsteff_dVg
);
3842 Cgd
= -T2
* (dVfb_dVd
+ dVgsteff_dVd
);
3843 Cgb
= -T2
* (dVfb_dVb
+ dVbseffCV_dVb
+ dVgsteff_dVb
);
3846 d
->qbulk
= -d
->qgate
;
3851 double AbulkCV
= Abulk0
* s
->abulkCVfactor
;
3852 double dAbulkCV_dVb
= s
->abulkCVfactor
* dAbulk0_dVb
;
3854 double Csg
, Csb
, Csd
;
3856 double VdsatCV
= Vgsteff
/ AbulkCV
;
3857 if (VdsatCV
< d
->vds
) {
3858 double One_Third_CoxWL
= CoxWL
/ 3.0;
3859 double Two_Third_CoxWL
= 2.0 * One_Third_CoxWL
;
3860 double dVdsatCV_dVg
= 1.0 / AbulkCV
;
3861 double dVdsatCV_dVb
= -VdsatCV
* dAbulkCV_dVb
/ AbulkCV
;
3863 double T0
= Vgsteff
- VdsatCV
/ 3.0;
3864 double dT0_dVg
= 1.0 - dVdsatCV_dVg
/ 3.0;
3865 double dT0_dVb
= -dVdsatCV_dVb
/ 3.0;
3866 d
->qgate
+= CoxWL
* T0
;
3867 double Cgg1
= CoxWL
* dT0_dVg
;
3868 double Cgb1
= CoxWL
* dT0_dVb
+ Cgg1
* dVgsteff_dVb
;
3869 double Cgd1
= Cgg1
* dVgsteff_dVd
;
3870 Cgg1
*= dVgsteff_dVg
;
3876 double T0
= VdsatCV
- Vgsteff
;
3877 double dT0_dVg
= dVdsatCV_dVg
- 1.0;
3878 double dT0_dVb
= dVdsatCV_dVb
;
3879 d
->qbulk
+= One_Third_CoxWL
* T0
;
3880 double Cbg1
= One_Third_CoxWL
* dT0_dVg
;
3881 double Cbb1
= One_Third_CoxWL
* dT0_dVb
+ Cbg1
* dVgsteff_dVb
;
3882 double Cbd1
= Cbg1
* dVgsteff_dVd
;
3883 Cbg1
*= dVgsteff_dVg
;
3889 if (m
->xpart
> 0.5) {
3890 T0
= -Two_Third_CoxWL
;
3891 }else if (m
->xpart
< 0.5) {
3894 T0
= -One_Third_CoxWL
;
3896 qsrc
= T0
* Vgsteff
;
3897 Csg
= T0
* dVgsteff_dVg
;
3898 Csb
= T0
* dVgsteff_dVb
;
3899 Csd
= T0
* dVgsteff_dVd
;
3904 double T0
= AbulkCV
* d
->vds
;
3905 double T1
= 12.0 * (Vgsteff
- 0.5 * T0
+ 1.e
-20);
3906 double Cgg1
, Cgb1
, Cgd1
, Cbg1
, Cbb1
, Cbd1
;
3908 double T2
= d
->vds
/ T1
;
3909 double T3
= T0
* T2
;
3910 double dT3_dVg
= -12.0 * T2
* T2
* AbulkCV
;
3911 double dT3_dVd
= 6.0 * T0
* (4.0*Vgsteff
- T0
) / T1
/ T1
- 0.5;
3912 double dT3_dVb
= 12.0 * T2
* T2
* dAbulkCV_dVb
* Vgsteff
;
3914 d
->qgate
+= CoxWL
* (Vgsteff
- 0.5 * d
->vds
+ T3
);
3915 Cgg1
= CoxWL
* (1.0 + dT3_dVg
);
3916 Cgb1
= CoxWL
* dT3_dVb
+ Cgg1
* dVgsteff_dVb
;
3917 Cgd1
= CoxWL
* dT3_dVd
+ Cgg1
* dVgsteff_dVd
;
3918 Cgg1
*= dVgsteff_dVg
;
3923 d
->qbulk
+= CoxWL
* (1.0 - AbulkCV
) * (0.5 * d
->vds
- T3
);
3924 Cbg1
= -CoxWL
* ((1.0 - AbulkCV
) * dT3_dVg
);
3925 Cbb1
= -CoxWL
* ((1.0 - AbulkCV
) * dT3_dVb
3926 + (0.5 * d
->vds
- T3
) * dAbulkCV_dVb
)
3927 + Cbg1
* dVgsteff_dVb
;
3928 Cbd1
= -CoxWL
* (1.0 - AbulkCV
) * dT3_dVd
3929 + Cbg1
* dVgsteff_dVd
;
3930 Cbg1
*= dVgsteff_dVg
;
3935 if (m
->xpart
> 0.5) {
3936 /* 0/100 Charge petition model */
3938 qsrc
= -CoxWL
* (0.5 * Vgsteff
+ 0.25 * T0
- T0
* T0
/ T1
);
3939 Csg
= -CoxWL
* (0.5 + 24.0 * T0
* d
->vds
/ T1
/ T1
* AbulkCV
);
3940 Csb
= -CoxWL
* (0.25 * d
->vds
* dAbulkCV_dVb
3941 - 12.0 * T0
* d
->vds
/ T1
/ T1
* (4.0 * Vgsteff
- T0
)
3942 * dAbulkCV_dVb
) + Csg
* dVgsteff_dVb
;
3943 Csd
= -CoxWL
* (0.25 * AbulkCV
- 12.0 * AbulkCV
* T0
3944 / T1
/ T1
* (4.0 * Vgsteff
- T0
))
3945 + Csg
* dVgsteff_dVd
;
3946 Csg
*= dVgsteff_dVg
;
3947 }else if (m
->xpart
< 0.5) {
3948 /* 40/60 Charge petition model */
3950 double T2
= 0.5 * CoxWL
/ (T1
* T1
);
3951 double T3
= Vgsteff
* (2.0 * T0
* T0
/ 3.0
3952 + Vgsteff
* (Vgsteff
- 4.0 * T0
/ 3.0))
3953 - 2.0 * T0
* T0
* T0
/ 15.0;
3955 double T4
= 4.0 / 3.0 * Vgsteff
* (Vgsteff
-T0
) + 0.4 * T0
* T0
;
3956 Csg
= -2.0 * qsrc
/ T1
3957 - T2
* (Vgsteff
* (3.0 * Vgsteff
- 8.0 * T0
/ 3.0)
3958 + 2.0 * T0
* T0
/ 3.0);
3959 Csb
= (qsrc
/ T1
* d
->vds
+ T2
* T4
* d
->vds
) * dAbulkCV_dVb
3960 + Csg
* dVgsteff_dVb
;
3961 Csd
= (qsrc
/ T1
+ T2
* T4
) * AbulkCV
+ Csg
* dVgsteff_dVd
;
3962 Csg
*= dVgsteff_dVg
;
3964 /* 50/50 Charge petition model */
3965 qsrc
= -0.5 * (d
->qgate
+ d
->qbulk
);
3966 Csg
= -0.5 * (Cgg1
+ Cbg1
);
3967 Csb
= -0.5 * (Cgb1
+ Cbb1
);
3968 Csd
= -0.5 * (Cgd1
+ Cbd1
);
3975 d
->qdrn
= -(d
->qgate
+ d
->qbulk
+ qsrc
);
3977 d
->cgsb
= -(Cgg
+ Cgd
+ Cgb
);
3979 d
->cdgb
= -(Cgg
+ Cbg
+ Csg
);
3980 d
->cdsb
= (Cgg
+ Cgd
+ Cgb
+ Cbg
+ Cbd
+ Cbb
+ Csg
+ Csd
+ Csb
);
3981 d
->cddb
= -(Cgd
+ Cbd
+ Csd
);
3983 d
->cbsb
= -(Cbg
+ Cbd
+ Cbb
);
3985 trace0("end capMod == 1");
3986 }else if (m
->capMod
== 2) {
3987 trace0("begin capMod == 2");
3988 double Qac0
, dQac0_dVg
, dQac0_dVd
, dQac0_dVb
;
3989 double Qsub0
, dQsub0_dVg
, dQsub0_dVd
, dQsub0_dVb
;
3991 double Vfbeff
, dVfbeff_dVd
, dVfbeff_dVg
, dVfbeff_dVb
;
3993 const double DELTA_3
= 0.02;
3994 double V3
= Vfb
- Vgs_eff
+ VbseffCV
- DELTA_3
;
3997 T0
= sqrt(V3
* V3
- 4.0 * DELTA_3
* Vfb
);
4000 T0
= sqrt(V3
* V3
+ 4.0 * DELTA_3
* Vfb
);
4003 double T1
= 0.5 * (1.0 + V3
/ T0
);
4004 Vfbeff
= Vfb
- 0.5 * (V3
+ T0
);
4005 dVfbeff_dVd
= (1.0 - T1
- T2
) * dVfb_dVd
;
4006 dVfbeff_dVg
= T1
* dVgs_eff_dVg
;
4007 dVfbeff_dVb
= (1.0 - T1
- T2
) * dVfb_dVb
- T1
* dVbseffCV_dVb
;
4009 trace3("", Vfbeff
, dVfbeff_dVg
, dVfbeff_dVb
);
4010 trace1("", dVfbeff_dVd
);
4012 //double Qac0, dQac0_dVg, dQac0_dVd, dQac0_dVb;
4014 Qac0
= CoxWL
* (Vfbeff
- Vfb
);
4015 dQac0_dVg
= CoxWL
* dVfbeff_dVg
;
4016 dQac0_dVd
= CoxWL
* (dVfbeff_dVd
- dVfb_dVd
);
4017 dQac0_dVb
= CoxWL
* (dVfbeff_dVb
- dVfb_dVb
);
4020 //double Qsub0, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
4022 double T0
= 0.5 * t
->k1
;
4023 double T3
= Vgs_eff
- Vfbeff
- VbseffCV
- Vgsteff
;
4028 }else if (T3
< 0.0) {
4029 T1
= T0
+ T3
/ t
->k1
;
4032 T1
= sqrt(T0
* T0
+ T3
);
4033 T2
= CoxWL
* T0
/ T1
;
4035 Qsub0
= CoxWL
* t
->k1
* (T1
- T0
);
4036 dQsub0_dVg
= T2
* (dVgs_eff_dVg
- dVfbeff_dVg
- dVgsteff_dVg
);
4037 dQsub0_dVd
= -T2
* (dVfbeff_dVd
+ dVgsteff_dVd
);
4038 dQsub0_dVb
= -T2
* (dVfbeff_dVb
+dVbseffCV_dVb
+dVgsteff_dVb
);
4041 trace3("", Qac0
, dQac0_dVg
, dQac0_dVb
);
4042 trace1("", dQac0_dVd
);
4043 trace4("", Qsub0
, dQsub0_dVg
, dQsub0_dVd
, dQsub0_dVb
);
4045 double AbulkCV
= Abulk0
* s
->abulkCVfactor
;
4046 double dAbulkCV_dVb
= s
->abulkCVfactor
* dAbulk0_dVb
;
4047 trace2("", AbulkCV
, dAbulkCV_dVb
);
4049 double VdseffCV
, dVdseffCV_dVg
, dVdseffCV_dVd
, dVdseffCV_dVb
;
4051 const double DELTA_4
= 0.02;
4052 double VdsatCV
= Vgsteff
/ AbulkCV
;
4053 double V4
= VdsatCV
- d
->vds
- DELTA_4
;
4054 double T0
= sqrt(V4
* V4
+ 4.0 * DELTA_4
* VdsatCV
);
4055 VdseffCV
= VdsatCV
- 0.5 * (V4
+ T0
);
4056 double T1
= 0.5 * (1.0 + V4
/ T0
);
4057 double T2
= DELTA_4
/ T0
;
4058 double T3
= (1.0 - T1
- T2
) / AbulkCV
;
4061 dVdseffCV_dVb
= -T3
* VdsatCV
* dAbulkCV_dVb
;
4063 trace4("", VdseffCV
, dVdseffCV_dVg
, dVdseffCV_dVd
, dVdseffCV_dVb
);
4065 double T0
= AbulkCV
* VdseffCV
;
4066 double T1
= 12.0 * (Vgsteff
- 0.5 * T0
+ 1e-20);
4069 double Cgg1
, Cgd1
, Cgb1
, Cbg1
, Cbd1
, Cbb1
;
4070 // also 1st estimate of d->qgate, d->qbulk
4072 double T2
= VdseffCV
/ T1
;
4073 double T3
= T0
* T2
;
4074 double T4
= (1.0 - 12.0 * T2
* T2
* AbulkCV
);
4075 double T5
= (6.0 * T0
* (4.0 * Vgsteff
- T0
) / (T1
* T1
) - 0.5);
4076 double T6
= 12.0 * T2
* T2
* Vgsteff
;
4077 d
->qgate
= CoxWL
* (Vgsteff
- 0.5 * VdseffCV
+ T3
);
4078 Cgg1
= CoxWL
* (T4
+ T5
* dVdseffCV_dVg
);
4079 Cgd1
= CoxWL
* T5
* dVdseffCV_dVd
+ Cgg1
* dVgsteff_dVd
;
4080 Cgb1
= CoxWL
* (T5
* dVdseffCV_dVb
+ T6
* dAbulkCV_dVb
)
4081 + Cgg1
* dVgsteff_dVb
;
4082 Cgg1
*= dVgsteff_dVg
;
4084 double T7
= 1.0 - AbulkCV
;
4085 d
->qbulk
= CoxWL
* T7
* (0.5 * VdseffCV
- T3
);
4086 T4
= -T7
* (T4
- 1.0);
4088 T6
= -(T7
* T6
+ (0.5 * VdseffCV
- T3
));
4089 Cbg1
= CoxWL
* (T4
+ T5
* dVdseffCV_dVg
);
4090 Cbd1
= CoxWL
* T5
* dVdseffCV_dVd
+ Cbg1
* dVgsteff_dVd
;
4091 Cbb1
= CoxWL
* (T5
* dVdseffCV_dVb
+ T6
* dAbulkCV_dVb
)
4092 + Cbg1
* dVgsteff_dVb
;
4093 Cbg1
*= dVgsteff_dVg
;
4095 trace3("", Cgg1
, Cgd1
, Cgb1
);
4096 trace3("", Cbg1
, Cbd1
, Cbb1
);
4097 trace2("2-1", d
->qgate
, d
->qbulk
);
4099 double Csg
, Csd
, Csb
;
4100 trace1("", m
->xpart
);
4101 if (m
->xpart
> 0.5) {
4102 trace0("0/100 Charge petition model");
4104 qsrc
= -CoxWL
* (0.5 * Vgsteff
+ 0.25 * T0
- T0
* T0
/ T1
);
4105 double T7
= (4.0 * Vgsteff
- T0
) / (T1
* T1
);
4106 double T4
= -(0.5 + 24.0 * T0
* T0
/ (T1
* T1
));
4107 double T5
= -(0.25 * AbulkCV
- 12.0 * AbulkCV
* T0
* T7
);
4108 double T6
= -(0.25 * VdseffCV
- 12.0 * T0
* VdseffCV
* T7
);
4109 Csg
= CoxWL
* (T4
+ T5
* dVdseffCV_dVg
);
4110 Csd
= CoxWL
* T5
* dVdseffCV_dVd
+ Csg
* dVgsteff_dVd
;
4111 Csb
= CoxWL
* (T5
* dVdseffCV_dVb
+ T6
* dAbulkCV_dVb
)
4112 + Csg
* dVgsteff_dVb
;
4113 Csg
*= dVgsteff_dVg
;
4114 }else if (m
->xpart
< 0.5) {
4115 trace0("40/60 Charge petition model");
4117 double T2
= 0.5 * CoxWL
/ (T1
* T1
);
4118 double T3
= Vgsteff
* (2.0 * T0
* T0
/ 3.0 + Vgsteff
4119 * (Vgsteff
- 4.0 * T0
/ 3.0))
4120 - 2.0 * T0
* T0
* T0
/ 15.0;
4122 double T7
= 4.0 / 3.0 * Vgsteff
* (Vgsteff
- T0
) + 0.4 * T0
* T0
;
4123 double T4
= -2.0 * qsrc
/ T1
4124 - T2
* (Vgsteff
* (3.0 * Vgsteff
- 8.0 * T0
/ 3.0)
4125 + 2.0 * T0
* T0
/ 3.0);
4126 double T5
= (qsrc
/ T1
+ T2
* T7
) * AbulkCV
;
4127 double T6
= (qsrc
/ T1
* VdseffCV
+ T2
* T7
* VdseffCV
);
4128 Csg
= (T4
+ T5
* dVdseffCV_dVg
);
4129 Csd
= T5
* dVdseffCV_dVd
+ Csg
* dVgsteff_dVd
;
4130 Csb
= (T5
* dVdseffCV_dVb
+ T6
* dAbulkCV_dVb
)
4131 + Csg
* dVgsteff_dVb
;
4132 Csg
*= dVgsteff_dVg
;
4134 trace0("50/50 Charge petition model");
4135 qsrc
= -0.5 * (d
->qgate
+ d
->qbulk
);
4136 Csg
= -0.5 * (Cgg1
+ Cbg1
);
4137 Csb
= -0.5 * (Cgb1
+ Cbb1
);
4138 Csd
= -0.5 * (Cgd1
+ Cbd1
);
4140 trace4("", Csg
, Csd
, Csb
, qsrc
);
4142 d
->qgate
+= Qac0
+ Qsub0
;
4143 d
->qbulk
-= (Qac0
+ Qsub0
);
4144 d
->qdrn
= -(d
->qgate
+ d
->qbulk
+ qsrc
);
4145 trace3("2-2", d
->qgate
, d
->qbulk
, d
->qdrn
);
4147 double Cgg
= dQac0_dVg
+ dQsub0_dVg
+ Cgg1
;
4148 double Cgd
= dQac0_dVd
+ dQsub0_dVd
+ Cgd1
;
4149 double Cgb
= dQac0_dVb
+ dQsub0_dVb
+ Cgb1
;
4150 trace3("", Cgg
, Cgd
, Cgb
);
4152 double Cbg
= Cbg1
- dQac0_dVg
- dQsub0_dVg
;
4153 double Cbd
= Cbd1
- dQac0_dVd
- dQsub0_dVd
;
4154 double Cbb
= Cbb1
- dQac0_dVb
- dQsub0_dVb
;
4155 trace3("", Cbg
, Cbd
, Cbb
);
4160 trace3("adjusted", Cgb
, Cbb
, Csb
);
4163 d
->cgsb
= -(Cgg
+ Cgd
+ Cgb
);
4165 d
->cdgb
= -(Cgg
+ Cbg
+ Csg
);
4166 d
->cdsb
= (Cgg
+ Cgd
+ Cgb
+ Cbg
+ Cbd
+ Cbb
+ Csg
+ Csd
+ Csb
);
4167 d
->cddb
= -(Cgd
+ Cbd
+ Csd
);
4169 d
->cbsb
= -(Cbg
+ Cbd
+ Cbb
);
4171 trace0("end capMod == 2");
4173 error(bDANGER
, "illegal capmod = %d\n", int(m
->capMod
));
4174 d
->qbulk
= d
->qgate
= NOT_VALID
;
4177 /* Non-quasi-static Model */
4181 double qcheq
= -d
->qbulk
- d
->qgate
;
4182 double T0
= s
->leffCV
* s
->leffCV
;
4183 tconst
= t
->u0temp
* s
->elm
/ CoxWL
/ T0
;
4186 }else if (qcheq
< 0.0) {
4190 double gtau_drift
= std::abs(tconst
* qcheq
);
4191 double gtau_diff
= 16.0 * t
->u0temp
* t
->vtm
/ T0
;
4192 d
->gtau
= gtau_drift
+ gtau_diff
;
4193 d
->cqgb
= -(d
->cggb
+ d
->cbgb
);
4194 d
->cqdb
= -(d
->cgdb
+ d
->cbdb
);
4195 d
->cqsb
= -(d
->cgsb
+ d
->cbsb
);
4196 d
->cqbb
= d
->cggb
+d
->cgdb
+d
->cgsb
+d
->cbgb
+d
->cbdb
+d
->cbsb
;
4198 d
->qbulk
= d
->qgate
= d
->qdrn
= qsrc
= 0.0;
4199 d
->cggb
= d
->cgsb
= d
->cgdb
= 0.0;
4200 d
->cdgb
= d
->cdsb
= d
->cddb
= 0.0;
4201 d
->cbgb
= d
->cbsb
= d
->cbdb
= 0.0;
4203 *(ckt
->CKTstate0
+ d
->qcheq
) = qcheq
;
4204 if (ckt
->CKTmode
& MODEINITTRAN
)
4205 *(ckt
->CKTstate1
+ d
->qcheq
) = *(ckt
->CKTstate0
+ d
->qcheq
);
4206 error
= NIintegrate(ckt
, &geq
, &ceq
, 0.0, d
->qcheq
);
4207 if (error
) return (error
);
4211 d
->cqgb
= d
->cqdb
= d
->cqsb
= d
->cqbb
= 0.0;
4216 trace3("", d
->qgate
, d
->qdrn
, d
->qbulk
);
4217 trace3("", d
->cggb
, d
->cgsb
, d
->cgdb
);
4218 trace3("", d
->cdgb
, d
->cdsb
, d
->cddb
);
4219 trace3("", d
->cbgb
, d
->cbsb
, d
->cbdb
);
4221 trace2("", d
->ids
, d
->gds
);
4222 trace4("", d
->gmf
, d
->gmr
, d
->gmbf
, d
->gmbr
);
4223 //trace4("", d->isub, d->gbbs, d->gbgs, d->gbds);
4224 trace4("", d
->qgate
, d
->cggb
, d
->cgsb
, d
->cgdb
);
4225 trace4("", d
->qdrn
, d
->cdgb
, d
->cdsb
, d
->cddb
);
4226 trace4("", d
->qbulk
, d
->cbgb
, d
->cbsb
, d
->cbdb
);
4227 trace1("", d
->gtau
);
4228 trace4("", d
->cqgb
, d
->cqsb
, d
->cqdb
, d
->cqbb
);
4229 // trace1("", d->tconst);
4230 //trace2("", d->cgb, d->qgb);
4231 //trace2("", d->qgd, d->cgd);
4232 trace2("", d
->qgs
, d
->cgs
);
4233 trace3("", d
->vgs
, d
->vds
, d
->vbs
);
4234 trace3("", d
->vdsat
, d
->vgst
, d
->von
);
4236 /*--------------------------------------------------------------------------*/
4237 /*--------------------------------------------------------------------------*/
4238 /*--------------------------------------------------------------------------*/
4239 /*--------------------------------------------------------------------------*/
4240 // vim:ts=8:sw=2:noet