interactive testing
[gnucap-felix.git] / src / d_mos7.cc
blob29e829de6171ecbf409a2872568dcc531931e753
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)
10 * any later version.
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
20 * 02110-1301, USA.
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 */
29 #include "l_compar.h"
30 #include "l_denoise.h"
31 #include "globals.h"
32 #include "e_elemnt.h"
33 #include "d_mos7.h"
34 /*--------------------------------------------------------------------------*/
35 const double NA(NOT_INPUT);
36 const double INF(BIGBIG);
37 /*--------------------------------------------------------------------------*/
38 int MODEL_BUILT_IN_MOS7::_count = 0;
39 /*--------------------------------------------------------------------------*/
40 const int LEVEL(7);
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)
51 assert(cc);
52 SDP_BUILT_IN_MOS_BASE::init(cc);
53 const COMMON_BUILT_IN_MOS* c = prechecked_cast<const COMMON_BUILT_IN_MOS*>(cc);
54 assert(c);
55 const MODEL_BUILT_IN_MOS7* m = prechecked_cast<const MODEL_BUILT_IN_MOS7*>(c->model());
56 assert(m);
57 const CARD_LIST* par_scope = m->scope();
58 assert(par_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);
64 dl = m->Lint + tmp1;
65 dlc = m->dlc + tmp1;
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);
71 dw = m->Wint + tmp2;
72 dwc = m->dwc + tmp2;
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?? */
80 double L = leff;
81 double W = weff;
82 if (m->binUnit == 1) {
83 L /= MICRON2METER;
84 W /= MICRON2METER;
86 // adjust: override
87 // adjust: raw
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);
126 if (dsub == NA) {
127 dsub = drout;
128 }else{
130 vth0 = m->vth0(L, W, NA, par_scope);
131 if (vth0 == NA) {
132 vth0 = NA;
133 }else{
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);
140 if (uc1 == NA) {
141 uc1 = ((m->mobMod==3) ? -0.056 : -0.056e-9);
142 }else{
144 uc = m->uc(L, W, ((m->mobMod==3) ? -0.0465 : -0.0465e-9), par_scope);
145 if (uc == NA) {
146 uc = ((m->mobMod==3) ? -0.0465 : -0.0465e-9);
147 }else{
149 u0 = m->u0(L, W, ((m->polarity == pN) ? 0.067 : 0.025), par_scope);
150 if (u0 == NA) {
151 u0 = ((m->polarity == pN) ? 0.067 : 0.025);
152 }else{
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);
183 if (cf == NA) {
184 cf = 2.0 * P_EPS_OX / M_PI * log(1.0 + 0.4e-6 / m->tox);
185 }else{
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);
195 // code_post
197 if (u0 > 1.0) {
198 u0 /= 1.0e4;
200 if (m->npeak.nom() == NA) {
201 if (m->gamma1.nom() != NA) {
202 double T0 = gamma1 * m->cox;
203 npeak = 3.021E22 * T0 * T0;
204 }else{
205 npeak = 1.7e17;
208 if (m->k1.nom() != NA && m->k2.nom() != NA) {
209 if (m->k1.nom() == NA) {
210 k1 = 0.53;
212 if (m->k2.nom() == NA) {
213 k2 = -0.0186;
215 }else{
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)
229 assert(d);
230 const COMMON_BUILT_IN_MOS* c = prechecked_cast<const COMMON_BUILT_IN_MOS*>(d->common());
231 assert(c);
232 const SDP_BUILT_IN_MOS7* s = prechecked_cast<const SDP_BUILT_IN_MOS7*>(c->sdp());
233 assert(s);
234 const MODEL_BUILT_IN_MOS7* m = prechecked_cast<const MODEL_BUILT_IN_MOS7*>(c->model());
235 assert(m);
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
243 // final adjust: raw
244 // final adjust: mid
245 // final adjust: calculated
246 tempratio = temp / m->tnom_k;
247 tempratio_1 = tempratio - 1;
248 vtm = temp * P_K_Q;
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;
259 }else{
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);
279 sqrtPhi = sqrt(phi);
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) {
286 k2 = s->k2;
287 k1 = s->k1;
288 }else{
289 double vbx = (m->vbx.nom() == NA)
290 ? -std::abs(phi - 7.7348e-4 * s->npeak * s->xt * s->xt)
291 : -std::abs(s->vbx);
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);
298 if (k2 < 0.) {
299 double T0 = 0.5 * k1 / k2;
300 vbsc = to_range(-30.0, (0.9 * (phi - T0 * T0)), -3.0);
301 }else{
302 vbsc = -30.0;
304 vbsc = std::min(vbsc, s->vbm);
305 if (s->vth0 == NA) {
306 vfb = -1.0;
307 vth0 = m->polarity * (vfb + phi + k1 * sqrtPhi);
308 }else{
309 vth0 = s->vth0;
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),
327 cdsc(2.4e-4),
328 cdscb(0.0),
329 cdscd(0.0),
330 cit(0.0),
331 nfactor(1),
332 xj(.15e-6),
333 vsat(8.0e4),
334 at(3.3e4),
335 a0(1.0),
336 ags(0.0),
337 a1(0.0),
338 a2(1.0),
339 keta(-0.047),
340 nsub(6.0e16),
341 npeak(NA),
342 ngate(0.0),
343 gamma1(NA),
344 gamma2(NA),
345 vbx(NA),
346 vbm(-3.0),
347 xt(1.55e-7),
348 k1(NA),
349 kt1(-0.11),
350 kt1l(0.0),
351 kt2(0.022),
352 k2(NA),
353 k3(80.0),
354 k3b(0.0),
355 w0(2.5e-6),
356 nlx(1.74e-7),
357 dvt0(2.2),
358 dvt1(0.53),
359 dvt2(-0.032),
360 dvt0w(0.0),
361 dvt1w(5.3e6),
362 dvt2w(-0.032),
363 drout(0.56),
364 dsub(NA),
365 vth0(NA),
366 ua1(4.31e-9),
367 ua(2.25e-9),
368 ub1(-7.61e-18),
369 ub(5.87e-19),
370 uc1(NA),
371 uc(NA),
372 u0(NA),
373 ute(-1.5),
374 voff(-0.08),
375 delta(0.01),
376 rdsw(0.0),
377 prwg(0.0),
378 prwb(0.0),
379 prt(0.0),
380 eta0(0.08),
381 etab(-0.07),
382 pclm(1.3),
383 pdibl1(.39),
384 pdibl2(0.0086),
385 pdiblb(0.0),
386 pscbe1(4.24e8),
387 pscbe2(1.0e-5),
388 pvag(0.0),
389 wr(1.0),
390 dwg(0.0),
391 dwb(0.0),
392 b0(0.0),
393 b1(0.0),
394 alpha0(0.0),
395 beta0(30.0),
396 elm(5.0),
397 vfbcv(-1.0),
398 cgsl(0.0),
399 cgdl(0.0),
400 ckappa(0.6),
401 cf(NA),
402 clc(0.1e-6),
403 cle(0.6),
404 capMod(2),
405 nqsMod(0),
406 mobMod(1),
407 noiMod(1),
408 paramChk(0),
409 binUnit(1),
410 version(3.1),
411 tox(150.0e-10),
412 xpart(0.0),
413 jctSidewallSatCurDensity(0.0),
414 mjswg(NA),
415 pbswg(NA),
416 unitLengthGateSidewallJctCap(NA),
417 jctEmissionCoeff(1.0),
418 jctTempExponent(3.0),
419 Lint(0.0),
420 Ll(0.0),
421 Lln(1.0),
422 Lw(0.0),
423 Lwn(1.0),
424 Lwl(0.0),
425 Wint(0.0),
426 Wl(0.0),
427 Wln(1.0),
428 Ww(0.0),
429 Wwn(1.0),
430 Wwl(0.0),
431 dwc(NA),
432 dlc(NA),
433 noia(NA),
434 noib(NA),
435 noic(NA),
436 em(4.1e7),
437 ef(1.0),
438 cox(NA),
439 factor1(NA),
440 vt_at_tnom(NA),
441 ni(NA)
443 if (ENV::run_mode != rPRE_MAIN) {
444 ++_count;
445 }else{
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),
459 cdsc(p.cdsc),
460 cdscb(p.cdscb),
461 cdscd(p.cdscd),
462 cit(p.cit),
463 nfactor(p.nfactor),
464 xj(p.xj),
465 vsat(p.vsat),
466 at(p.at),
467 a0(p.a0),
468 ags(p.ags),
469 a1(p.a1),
470 a2(p.a2),
471 keta(p.keta),
472 nsub(p.nsub),
473 npeak(p.npeak),
474 ngate(p.ngate),
475 gamma1(p.gamma1),
476 gamma2(p.gamma2),
477 vbx(p.vbx),
478 vbm(p.vbm),
479 xt(p.xt),
480 k1(p.k1),
481 kt1(p.kt1),
482 kt1l(p.kt1l),
483 kt2(p.kt2),
484 k2(p.k2),
485 k3(p.k3),
486 k3b(p.k3b),
487 w0(p.w0),
488 nlx(p.nlx),
489 dvt0(p.dvt0),
490 dvt1(p.dvt1),
491 dvt2(p.dvt2),
492 dvt0w(p.dvt0w),
493 dvt1w(p.dvt1w),
494 dvt2w(p.dvt2w),
495 drout(p.drout),
496 dsub(p.dsub),
497 vth0(p.vth0),
498 ua1(p.ua1),
499 ua(p.ua),
500 ub1(p.ub1),
501 ub(p.ub),
502 uc1(p.uc1),
503 uc(p.uc),
504 u0(p.u0),
505 ute(p.ute),
506 voff(p.voff),
507 delta(p.delta),
508 rdsw(p.rdsw),
509 prwg(p.prwg),
510 prwb(p.prwb),
511 prt(p.prt),
512 eta0(p.eta0),
513 etab(p.etab),
514 pclm(p.pclm),
515 pdibl1(p.pdibl1),
516 pdibl2(p.pdibl2),
517 pdiblb(p.pdiblb),
518 pscbe1(p.pscbe1),
519 pscbe2(p.pscbe2),
520 pvag(p.pvag),
521 wr(p.wr),
522 dwg(p.dwg),
523 dwb(p.dwb),
524 b0(p.b0),
525 b1(p.b1),
526 alpha0(p.alpha0),
527 beta0(p.beta0),
528 elm(p.elm),
529 vfbcv(p.vfbcv),
530 cgsl(p.cgsl),
531 cgdl(p.cgdl),
532 ckappa(p.ckappa),
533 cf(p.cf),
534 clc(p.clc),
535 cle(p.cle),
536 capMod(p.capMod),
537 nqsMod(p.nqsMod),
538 mobMod(p.mobMod),
539 noiMod(p.noiMod),
540 paramChk(p.paramChk),
541 binUnit(p.binUnit),
542 version(p.version),
543 tox(p.tox),
544 xpart(p.xpart),
545 jctSidewallSatCurDensity(p.jctSidewallSatCurDensity),
546 mjswg(p.mjswg),
547 pbswg(p.pbswg),
548 unitLengthGateSidewallJctCap(p.unitLengthGateSidewallJctCap),
549 jctEmissionCoeff(p.jctEmissionCoeff),
550 jctTempExponent(p.jctTempExponent),
551 Lint(p.Lint),
552 Ll(p.Ll),
553 Lln(p.Lln),
554 Lw(p.Lw),
555 Lwn(p.Lwn),
556 Lwl(p.Lwl),
557 Wint(p.Wint),
558 Wl(p.Wl),
559 Wln(p.Wln),
560 Ww(p.Ww),
561 Wwn(p.Wwn),
562 Wwl(p.Wwl),
563 dwc(p.dwc),
564 dlc(p.dlc),
565 noia(p.noia),
566 noib(p.noib),
567 noic(p.noic),
568 em(p.em),
569 ef(p.ef),
570 cox(p.cox),
571 factor1(p.factor1),
572 vt_at_tnom(p.vt_at_tnom),
573 ni(p.ni)
575 if (ENV::run_mode != rPRE_MAIN) {
576 ++_count;
577 }else{untested();//194
580 /*--------------------------------------------------------------------------*/
581 std::string MODEL_BUILT_IN_MOS7::dev_type()const
583 if (polarity == pN) {
584 return "nmos7";
585 }else if (polarity == pP) {
586 return "pmos7";
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 ")) {
595 polarity = pN;
596 }else if (Umatch(new_type, "pmos7 ")) {
597 polarity = pP;
598 }else{
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();
606 assert(par_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
647 if (mjsw == NA) {
648 mjsw = .33;
649 }else{
651 if (pb == NA) {
652 pb = 1.0;
653 }else{
655 //pb = std::max(pb, 0.1);
656 if (pbsw == NA) {
657 pbsw = pb;
658 }else{
660 //pbsw = std::max(pbsw, 0.1);
661 if (cgdo == NA) {
662 cgdo = (((dlc != NA) && (dlc > 0.0))
663 ? dlc * cox - cgdl.nom()
664 : 0.6 * xj.nom() * cox);
665 }else{
667 if (cgso == NA) {
668 cgso = (((dlc != NA) && (dlc > 0.0))
669 ? dlc * cox - cgsl.nom()
670 : 0.6 * xj.nom() * cox);
671 }else{
673 if (cgbo == NA) {
674 cgbo = ((dwc != NA)
675 ? 2.0 * dwc * cox
676 : 2.0 * Wint * cox);
677 }else{
679 cmodel = ((!cmodel)?1:cmodel);
680 needs_isub = (alpha0.nom()!=0.);
681 // final adjust: raw
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);
717 // final adjust: mid
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
742 assert(c);
743 if (COMMON_BUILT_IN_MOS* cc = dynamic_cast<COMMON_BUILT_IN_MOS*>(c)) {
744 if (cc->_sdp) {
745 cc->_sdp->init(cc);
746 return cc->_sdp;
747 }else{
748 delete cc->_sdp;
749 return new SDP_BUILT_IN_MOS7(c);
751 }else{
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
1838 if (j == 0) {
1839 return param_name(i);
1840 }else if (j == 1) {
1841 switch (MODEL_BUILT_IN_MOS7::param_count() - 1 - i) {
1842 case 0: return "";
1843 case 1: return "";
1844 case 2: return "";
1845 case 3: return "";
1846 case 4: return "";
1847 case 5: return "";
1848 case 6: return "";
1849 case 7: return "";
1850 case 8: return "";
1851 case 9: return "";
1852 case 10: return "";
1853 case 11: return "";
1854 case 12: return "";
1855 case 13: return "";
1856 case 14: return "";
1857 case 15: return "";
1858 case 16: return "";
1859 case 17: return "";
1860 case 18: return "";
1861 case 19: return "";
1862 case 20: return "";
1863 case 21: return "";
1864 case 22: return "";
1865 case 23: return "";
1866 case 24: return "";
1867 case 25: return "";
1868 case 26: return "";
1869 case 27: return "";
1870 case 28: return "";
1871 case 29: return "";
1872 case 30: return "";
1873 case 31: return "";
1874 case 32: return "";
1875 case 33: return "";
1876 case 34: return "";
1877 case 35: return "";
1878 case 36: return "";
1879 case 37: return "";
1880 case 38: return "";
1881 case 39: return "";
1882 case 40: return "";
1883 case 41: return "";
1884 case 42: return "";
1885 case 43: return "";
1886 case 44: return "";
1887 case 45: return "";
1888 case 46: return "";
1889 case 47: return "";
1890 case 48: return "";
1891 case 49: return "";
1892 case 50: return "";
1893 case 51: return "";
1894 case 52: return "";
1895 case 53: return "";
1896 case 54: return "";
1897 case 55: return "";
1898 case 56: return "";
1899 case 57: return "";
1900 case 58: return "";
1901 case 59: return "";
1902 case 60: return "";
1903 case 61: return "";
1904 case 62: return "";
1905 case 63: return "";
1906 case 64: return "";
1907 case 65: return "";
1908 case 66: return "";
1909 case 67: return "";
1910 case 68: return "";
1911 case 69: return "";
1912 case 70: return "";
1913 case 71: return "";
1914 case 72: return "";
1915 case 73: return "";
1916 case 74: return "";
1917 case 75: return "";
1918 case 76: return "";
1919 case 77: return "";
1920 case 78: return "";
1921 case 79: return "";
1922 case 80: return "";
1923 case 81: return "";
1924 case 82: return "";
1925 case 83: return "";
1926 case 84: return "";
1927 case 85: return "";
1928 case 86: return "";
1929 case 87: return "";
1930 case 88: return "";
1931 case 89: return "";
1932 case 90: return "";
1933 case 91: return "";
1934 case 92: return "";
1935 case 93: return "";
1936 case 94: return "";
1937 case 95: return "";
1938 case 96: return "";
1939 case 97: return "";
1940 case 98: return "";
1941 case 99: return "";
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) {
2198 return "";
2199 }else{
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) {
2207 case 0: return "7";
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
2566 assert(d);
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);
2573 assert(d);
2574 const COMMON_BUILT_IN_MOS* c = prechecked_cast<const COMMON_BUILT_IN_MOS*>(d->common());
2575 assert(c);
2576 const SDP_BUILT_IN_MOS7* s = prechecked_cast<const SDP_BUILT_IN_MOS7*>(c->sdp());
2577 assert(s);
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;
2608 if (Vbseff > 0.0) {
2609 d->sbfwd = true;
2610 double T0 = t->phi / (t->phi + Vbseff);
2611 Phis = t->phi * T0;
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");
2616 }else{
2617 d->sbfwd = false;
2618 Phis = t->phi - Vbseff;
2619 dPhis_dVb = -1.0;
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;
2636 double T1, T2;
2637 if (T0 >= - 0.5) {
2638 T1 = 1.0 + T0;
2639 T2 = s->dvt2;
2640 trace4("", T0, T1, T2, T3);
2641 }else{
2642 untested();
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);
2661 }else{
2662 double T1 = MIN_EXP;
2663 Theta0 = T1 * (1.0 + 2.0 * T1);
2664 dTheta0_dVb = 0.0;
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;
2673 double T2, dT2_dVb;
2675 double ltw, dltw_dVb;
2677 double t3 = sqrt(Xdep);
2678 double t0 = s->dvt2w * Vbseff;
2679 double t1, t2;
2680 if (t0 >= - 0.5) {
2681 t1 = 1.0 + t0;
2682 t2 = s->dvt2w;
2683 }else{
2684 untested();
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;
2701 }else{
2702 double T1 = MIN_EXP;
2703 T2 = T1 * (1.0 + 2.0 * T1);
2704 dT2_dVb = 0.0;
2706 T0 = s->dvt0w * T2;
2707 T2 = T0 * V0;
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);
2718 double T4;
2719 if (T3 < 1.0e-4) {
2720 untested();
2721 /* avoid discontinuity problems caused by etab */
2722 double T9 = 1.0 / (3.0 - 2.0e4 * T3);
2723 T3 = (2.0e-4 - T3) * T9;
2724 T4 = T9 * T9;
2725 trace3("", T9, T3, T4);
2726 }else{
2727 T4 = 1.0;
2728 trace1("", 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
2744 + T1 - DIBL_Sft;
2745 d->von = Vth;
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 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2754 /* Calculate n */
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);
2761 if (tmp4 >= -0.5) {
2762 n = 1.0 + 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);
2767 }else{
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;
2771 T0 *= 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);
2798 }else{
2799 Vgs_eff = d->vgs;
2800 dVgs_eff_dVg = 1.0;
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) {
2818 d->vgst = Vgst;
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);
2826 ExpVgst = exp(T0);
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);
2833 }else{
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)
2838 + T1 / n * dn_dVb;
2839 double dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd)
2840 + T1 / n * dn_dVd;
2842 double dT2_dVg = -m->cox / (t->vtm * t->cdep0)
2843 * exp(ExpArg);
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;
2850 d->vgst = T1 / T2;
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;
2875 T0 *= T0 * 4.0e-16;
2876 dWeff_dVg *= T0;
2877 dWeff_dVb *= 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;
2887 if (T0 >= -0.9) {
2888 Rds = t->rds0 * (1.0 + T0);
2889 dRds_dVg = t->rds0 * s->prwg;
2890 dRds_dVb = t->rds0 * s->prwb * dsqrtPhis_dVb;
2891 }else{
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;
2895 T1 *= 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);
2932 if (Abulk0 < 0.1) {
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);
2939 if (Abulk < 0.1) {
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);
2947 double T0, dT0_dVb;
2949 double t2 = s->keta * Vbseff;
2950 if (t2 >= -0.9) {
2951 T0 = 1.0 / (1.0 + t2);
2952 dT0_dVb = -s->keta * T0 * T0;
2953 trace3("", t2, T0, dT0_dVb);
2954 }else{
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);
2962 dAbulk_dVg *= T0;
2963 dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb;
2964 dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
2965 Abulk *= T0;
2966 Abulk0 *= T0;
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;
2976 double T5;
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)
2989 / m->tox;
2990 dDenomi_dVd = 0.0;
2991 dDenomi_dVb = d->vgst * t->uc / m->tox;
2992 }else{
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);
2997 T5 = T4 * T2;
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;
3002 if (T5 >= -0.8) {
3003 Denomi = 1.0 + T5;
3004 }else{
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;
3008 t9 *= t9;
3009 dDenomi_dVg *= t9;
3010 dDenomi_dVd *= t9;
3011 dDenomi_dVb *= 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;
3037 double WVCoxRds;
3039 double WVCox = Weff * t->vsattemp * m->cox;
3040 WVCoxRds = WVCox * Rds;
3042 trace1("", WVCoxRds);
3044 double Lambda, dLambda_dVg;
3046 if (s->a1 == 0.0) {
3047 Lambda = s->a2;
3048 dLambda_dVg = 0.0;
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);
3056 }else{
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);
3065 double tmp2, tmp3;
3066 if (Rds > 0) {
3067 tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
3068 tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
3069 }else{
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
3076 double tmp1;
3078 if ((Rds == 0.0) && (Lambda == 1.0)) {
3079 double T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm);
3080 tmp1 = 0.0;
3081 double T1 = T0 * T0;
3082 double T2 = Vgst2Vtm * T0;
3083 double T3 = EsatL * Vgst2Vtm;
3084 Vdsat = T3 * T0;
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;
3091 }else{
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;
3126 d->vdsat = Vdsat;
3127 d->saturated = (d->vds >= d->vdsat);
3129 trace1("", tmp1);
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;
3149 Vasat = T0 / T1;
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);
3196 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 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3206 /* Calculate Ids */
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);
3227 }else{
3228 VACLM = MAX_EXP;
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;
3253 if (T7 >= -0.9) {
3254 double T3 = 1.0 / (1.0 + T7);
3255 VADIBL *= T3;
3256 dVADIBL_dVg *= T3;
3257 dVADIBL_dVb = (dVADIBL_dVb - VADIBL * s->pdiblb) * T3;
3258 dVADIBL_dVd *= T3;
3259 }else{
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;
3263 dVADIBL_dVg *= T3;
3264 dVADIBL_dVb = dVADIBL_dVb * T3 - VADIBL * s->pdiblb * T4 * T4;
3265 dVADIBL_dVd *= T3;
3266 VADIBL *= T3;
3268 }else{
3269 VADIBL = MAX_EXP;
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;
3277 if (T9 > -0.9) {
3278 T0 = 1.0 + T9;
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;
3282 }else{
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;
3286 T1 *= T1;
3287 dT0_dVg = T8 * (1.0 - d->vgst * dEsatL_dVg / EsatL) * T1;
3288 T9 *= T1 / EsatL;
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;
3297 tmp3 *= 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)
3330 / Vgst2Vtm;
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;
3341 fgche2 = 1.0 + T9;
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;
3360 Idl = gche * T9;
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;
3370 Idsa = Idl * T0;
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;
3388 }else{
3389 VASCBE = MAX_EXP * s->leff/s->pscbe2;
3390 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
3392 }else{
3393 VASCBE = MAX_EXP;
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;
3410 Gm *= dVgsteff_dVg;
3411 Gmb *= dVbseff_dVb;
3412 trace4("", Ids, Gm, Gds, Gmb);
3413 trace0("=========================");
3415 d->gds = Gds;
3416 if (d->reversed) {
3417 d->ids = -Ids;
3418 d->gmr = Gm;
3419 d->gmbr = Gmb;
3420 d->gmf = d->gmbf = 0;
3421 }else{
3422 d->ids = Ids;
3423 d->gmf = Gm;
3424 d->gmbf = Gmb;
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);
3437 }else{
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);
3449 }else{
3450 double T3 = T2 * MIN_EXP;
3451 trace2("", T2, T3);
3452 T1 = T3 * diffVds;
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);
3458 Isub = T1 * Idsa;
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);
3470 if (d->reversed) {
3471 d->idb = Isub;
3472 d->gdbds = Gbd;
3473 d->gdbgs = Gbg;
3474 d->gdbbs = Gbb;
3475 d->isb = d->gsbsd = d->gsbgd = d->gsbbd = 0.;
3476 }else{
3477 d->idb = d->gdbds = d->gdbgs = d->gdbbs = 0.;
3478 d->isb = Isub;
3479 d->gsbsd = Gbd;
3480 d->gsbgd = Gbg;
3481 d->gsbbd = Gbb;
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
3511 Vbseff = d->vbs;
3512 dVbseff_dVb = 1.0;
3513 }else{
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
3530 if (Arg1 <= 0.0) {
3531 trace0("Arg1 <= 0.0");
3533 d->qgate = CoxWL * Arg1;
3534 d->cggb = CoxWL * dVgs_eff_dVg;
3535 d->cgdb = 0.0;
3536 d->cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg);
3538 d->qbulk = -d->qgate;
3539 d->cbgb = -CoxWL * dVgs_eff_dVg;
3540 d->cbdb = 0.0;
3541 d->cbsb = -d->cgsb;
3543 d->qdrn = 0.0;
3544 d->cdgb = 0.0;
3545 d->cddb = 0.0;
3546 d->cdsb = 0.0;
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;
3555 d->cgdb = 0.0;
3556 d->cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg);
3558 d->qbulk = -d->qgate;
3559 d->cbgb = -d->cggb;
3560 d->cbdb = 0.0;
3561 d->cbsb = -d->cgsb;
3563 d->qdrn = 0.0;
3564 d->cdgb = 0.0;
3565 d->cddb = 0.0;
3566 d->cdsb = 0.0;
3567 }else{
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);
3588 d->cgdb = 0.0;
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);
3595 d->cbdb = 0.0;
3597 d->qdrn = 0.0;
3598 d->cdgb = 0.0;
3599 d->cddb = 0.0;
3600 d->cdsb = 0.0;
3601 }else{
3602 /* linear region */
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;
3613 d->qdrn = T4 * T7;
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);
3625 T7 = T9 * T7;
3626 T8 = T9 * T8;
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);
3650 d->qdrn = 0.4 * 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);
3655 d->cgdb = 0.0;
3657 double T3 = 0.4 * Two_Third_CoxWL;
3658 d->cdgb = -T3 * dVgs_eff_dVg;
3659 d->cddb = 0.0;
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);
3666 d->cbdb = 0.0;
3667 }else{
3668 /* linear region */
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;
3689 d->qdrn = T4 * T7;
3690 T7 *= T9;
3691 tmp = T8 / T1;
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);
3702 T7 *= T9;
3703 double T0 = 4.0 * T4 * (1.0 - T5);
3704 double T12 = (-T7 * dAlphaz_dVg - d->cdgb - T0 * dVdsat_dVg)
3705 * dVgs_eff_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);
3715 }else{
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);
3723 d->qdrn = 0.5 * 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);
3728 d->cgdb = 0.0;
3730 double T4 = One_Third_CoxWL * dVth_dVb;
3731 d->cdgb = -One_Third_CoxWL * dVgs_eff_dVg;
3732 d->cddb = 0.0;
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);
3738 d->cbdb = 0.0;
3739 }else{
3740 /* linear region */
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;
3759 d->qdrn = -T4 * T7;
3760 d->qbulk = - (d->qgate + d->qdrn + d->qdrn);
3762 T7 *= T9;
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
3777 }else{
3778 trace0("begin capMod != 0 (mos7)");
3779 assert(m->capMod != 0);
3780 double qsrc;
3781 double VbseffCV, dVbseffCV_dVb;
3782 if (Vbseff < 0.0) {
3783 VbseffCV = Vbseff;
3784 dVbseffCV_dVb = 1.0;
3785 }else{
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);
3801 double Vgsteff;
3803 if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) {
3804 trace0("VgstNVt in range");
3805 assert(ExpVgst != NOT_VALID);
3806 ExpVgst *= ExpVgst;
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;
3818 }else{
3819 Vgsteff = d->vgst;
3822 trace4("", Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb);
3824 double CoxWL = m->cox * s->weffCV * s->leffCV;
3825 // redundant??
3827 if (m->capMod == 1) {
3828 double Cgg, Cgd, Cgb;
3830 double Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff;
3831 if (Arg1 <= 0.0) {
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);
3836 }else{
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;
3847 double Cbg = -Cgg;
3848 double Cbd = -Cgd;
3849 double Cbb = -Cgb;
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;
3871 Cgg += Cgg1;
3872 Cgb += Cgb1;
3873 Cgd += Cgd1;
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;
3884 Cbg += Cbg1;
3885 Cbb += Cbb1;
3886 Cbd += Cbd1;
3888 double T0;
3889 if (m->xpart > 0.5) {
3890 T0 = -Two_Third_CoxWL;
3891 }else if (m->xpart < 0.5) {
3892 T0 = -0.4 * CoxWL;
3893 }else{
3894 T0 = -One_Third_CoxWL;
3896 qsrc = T0 * Vgsteff;
3897 Csg = T0 * dVgsteff_dVg;
3898 Csb = T0 * dVgsteff_dVb;
3899 Csd = T0 * dVgsteff_dVd;
3900 Cgb *= dVbseff_dVb;
3901 Cbb *= dVbseff_dVb;
3902 Csb *= dVbseff_dVb;
3903 }else{
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;
3919 Cgg += Cgg1;
3920 Cgb += Cgb1;
3921 Cgd += Cgd1;
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;
3931 Cbg += Cbg1;
3932 Cbb += Cbb1;
3933 Cbd += Cbd1;
3935 if (m->xpart > 0.5) {
3936 /* 0/100 Charge petition model */
3937 T1 = T1 + T1;
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 */
3949 T1 = T1 / 12.0;
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;
3954 qsrc = -T2 * T3;
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;
3963 }else{
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);
3970 Cgb *= dVbseff_dVb;
3971 Cbb *= dVbseff_dVb;
3972 Csb *= dVbseff_dVb;
3975 d->qdrn = -(d->qgate + d->qbulk + qsrc);
3976 d->cggb = Cgg;
3977 d->cgsb = -(Cgg + Cgd + Cgb);
3978 d->cgdb = Cgd;
3979 d->cdgb = -(Cgg + Cbg + Csg);
3980 d->cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb);
3981 d->cddb = -(Cgd + Cbd + Csd);
3982 d->cbgb = Cbg;
3983 d->cbsb = -(Cbg + Cbd + Cbb);
3984 d->cbdb = Cbd;
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;
3995 double T0, T2;
3996 if (Vfb <= 0.0) {
3997 T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb);
3998 T2 = -DELTA_3 / T0;
3999 }else{
4000 T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb);
4001 T2 = DELTA_3 / T0;
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;
4024 double T1, T2;
4025 if (t->k1 == 0.0) {
4026 T1 = 0.0;
4027 T2 = 0.0;
4028 }else if (T3 < 0.0) {
4029 T1 = T0 + T3 / t->k1;
4030 T2 = CoxWL;
4031 }else{
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;
4059 dVdseffCV_dVg = T3;
4060 dVdseffCV_dVd = T1;
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);
4067 trace2("", T0, T1);
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);
4087 T5 = -T7 * T5;
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");
4103 T1 = T1 + T1;
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");
4116 T1 = T1 / 12.0;
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;
4121 qsrc = -T2 * T3;
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;
4133 }else{
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);
4157 Cgb *= dVbseff_dVb;
4158 Cbb *= dVbseff_dVb;
4159 Csb *= dVbseff_dVb;
4160 trace3("adjusted", Cgb, Cbb, Csb);
4162 d->cggb = Cgg;
4163 d->cgsb = -(Cgg + Cgd + Cgb);
4164 d->cgdb = Cgd;
4165 d->cdgb = -(Cgg + Cbg + Csg);
4166 d->cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb);
4167 d->cddb = -(Cgd + Cbd + Csd);
4168 d->cbgb = Cbg;
4169 d->cbsb = -(Cbg + Cbd + Cbb);
4170 d->cbdb = Cbd;
4171 trace0("end capMod == 2");
4172 }else{
4173 error(bDANGER, "illegal capmod = %d\n", int(m->capMod));
4174 d->qbulk = d->qgate = NOT_VALID;
4177 /* Non-quasi-static Model */
4178 double tconst;
4179 if (m->nqsMod) {
4180 // d->gtau
4181 double qcheq = -d->qbulk - d->qgate;
4182 double T0 = s->leffCV * s->leffCV;
4183 tconst = t->u0temp * s->elm / CoxWL / T0;
4184 if (qcheq == 0.0) {
4185 tconst = 0.0;
4186 }else if (qcheq < 0.0) {
4187 tconst = -tconst;
4188 }else{
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;
4202 #if 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);
4208 #endif
4209 }else{
4210 d->gtau = 0.0;
4211 d->cqgb = d->cqdb = d->cqsb = d->cqbb = 0.0;
4215 trace0("mos7");
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