30 double DrainSatCurrent;
31 double EffectiveLength;
32 double GateBulkOverlapCap;
33 double GateDrainOverlapCap;
34 double GateSourceOverlapCap;
35 double SourceSatCurrent;
38 double DrainPerimeter;
39 double SourcePerimeter;
140 EffectiveLength=here->
B2l - model->
B2deltaL * 1.e-6;
147 DrainSatCurrent = 1.0e-15;
151 SourceSatCurrent = 1.0e-15;
163 vbs= *(ckt->CKTstate0 + here->B2vbs);
164 vgs= *(ckt->CKTstate0 + here->B2vgs);
165 vds= *(ckt->CKTstate0 + here->B2vds);
167 vbs= *(ckt->CKTstate1 + here->B2vbs);
168 vgs= *(ckt->CKTstate1 + here->B2vgs);
169 vds= *(ckt->CKTstate1 + here->B2vds);
174 if((vds==0) && (vgs==0) && (vbs==0) &&
189 *(ckt->CKTstate0 + here->B2vbs) =
190 *(ckt->CKTstate1 + here->B2vbs);
191 vbs = (1+xfact)* (*(ckt->CKTstate1 + here->B2vbs))
192 -(xfact * (*(ckt->CKTstate2 + here->B2vbs)));
193 *(ckt->CKTstate0 + here->B2vgs) =
194 *(ckt->CKTstate1 + here->B2vgs);
195 vgs = (1+xfact)* (*(ckt->CKTstate1 + here->B2vgs))
196 -(xfact * (*(ckt->CKTstate2 + here->B2vgs)));
197 *(ckt->CKTstate0 + here->B2vds) =
198 *(ckt->CKTstate1 + here->B2vds);
199 vds = (1+xfact)* (*(ckt->CKTstate1 + here->B2vds))
200 -(xfact * (*(ckt->CKTstate2 + here->B2vds)));
201 *(ckt->CKTstate0 + here->B2vbd) =
202 *(ckt->CKTstate0 + here->B2vbs)-
203 *(ckt->CKTstate0 + here->B2vds);
204 *(ckt->CKTstate0 + here->B2cd) =
205 *(ckt->CKTstate1 + here->B2cd);
206 *(ckt->CKTstate0 + here->B2cbs) =
207 *(ckt->CKTstate1 + here->B2cbs);
208 *(ckt->CKTstate0 + here->B2cbd) =
209 *(ckt->CKTstate1 + here->B2cbd);
210 *(ckt->CKTstate0 + here->B2gm) =
211 *(ckt->CKTstate1 + here->B2gm);
212 *(ckt->CKTstate0 + here->B2gds) =
213 *(ckt->CKTstate1 + here->B2gds);
214 *(ckt->CKTstate0 + here->B2gmbs) =
215 *(ckt->CKTstate1 + here->B2gmbs);
216 *(ckt->CKTstate0 + here->B2gbd) =
217 *(ckt->CKTstate1 + here->B2gbd);
218 *(ckt->CKTstate0 + here->B2gbs) =
219 *(ckt->CKTstate1 + here->B2gbs);
220 *(ckt->CKTstate0 + here->B2cggb) =
221 *(ckt->CKTstate1 + here->B2cggb);
222 *(ckt->CKTstate0 + here->B2cbgb) =
223 *(ckt->CKTstate1 + here->B2cbgb);
224 *(ckt->CKTstate0 + here->B2cbsb) =
225 *(ckt->CKTstate1 + here->B2cbsb);
226 *(ckt->CKTstate0 + here->B2cgdb) =
227 *(ckt->CKTstate1 + here->B2cgdb);
228 *(ckt->CKTstate0 + here->B2cgsb) =
229 *(ckt->CKTstate1 + here->B2cgsb);
230 *(ckt->CKTstate0 + here->B2cbdb) =
231 *(ckt->CKTstate1 + here->B2cbdb);
232 *(ckt->CKTstate0 + here->B2cdgb) =
233 *(ckt->CKTstate1 + here->B2cdgb);
234 *(ckt->CKTstate0 + here->B2cddb) =
235 *(ckt->CKTstate1 + here->B2cddb);
236 *(ckt->CKTstate0 + here->B2cdsb) =
237 *(ckt->CKTstate1 + here->B2cdsb);
254 vgdo = *(ckt->CKTstate0 + here->B2vgs) -
255 *(ckt->CKTstate0 + here->B2vds);
256 delvbs = vbs - *(ckt->CKTstate0 + here->B2vbs);
257 delvbd = vbd - *(ckt->CKTstate0 + here->B2vbd);
258 delvgs = vgs - *(ckt->CKTstate0 + here->B2vgs);
259 delvds = vds - *(ckt->CKTstate0 + here->B2vds);
264 *(ckt->CKTstate0 + here->B2cd) -
265 *(ckt->CKTstate0 + here->B2gbd) * delvbd +
266 *(ckt->CKTstate0 + here->B2gmbs) * delvbs +
267 *(ckt->CKTstate0 + here->B2gm) * delvgs +
268 *(ckt->CKTstate0 + here->B2gds) * delvds ;
271 *(ckt->CKTstate0 + here->B2cd) -
272 ( *(ckt->CKTstate0 + here->B2gbd) -
273 *(ckt->CKTstate0 + here->B2gmbs)) * delvbd -
274 *(ckt->CKTstate0 + here->B2gm) * delvgd +
275 *(ckt->CKTstate0 + here->B2gds) * delvds;
278 *(ckt->CKTstate0 + here->B2cbs) +
279 *(ckt->CKTstate0 + here->B2cbd) +
280 *(ckt->CKTstate0 + here->B2gbd) * delvbd +
281 *(ckt->CKTstate0 + here->B2gbs) * delvbs ;
290 tempv =
MAX(
FABS(cbhat),
FABS(*(ckt->CKTstate0 + here->B2cbs)
291 + *(ckt->CKTstate0 + here->B2cbd)))+ckt->
CKTabstol;
294 FABS(*(ckt->CKTstate0+here->B2vbs)))+
297 FABS(*(ckt->CKTstate0+here->B2vbd)))+
300 FABS(*(ckt->CKTstate0+here->B2vgs)))+
303 FABS(*(ckt->CKTstate0+here->B2vds)))+
305 if( (
FABS(cdhat- *(ckt->CKTstate0 + here->B2cd)) <
308 if ( (
FABS(cbhat-(*(ckt->CKTstate0 + here->B2cbs) +
309 *(ckt->CKTstate0 + here->B2cbd))) < ckt->
CKTreltol *
312 vbs = *(ckt->CKTstate0 + here->B2vbs);
313 vbd = *(ckt->CKTstate0 + here->B2vbd);
314 vgs = *(ckt->CKTstate0 + here->B2vgs);
315 vds = *(ckt->CKTstate0 + here->B2vds);
318 cd = *(ckt->CKTstate0 + here->B2cd);
319 cbs = *(ckt->CKTstate0 + here->B2cbs);
320 cbd = *(ckt->CKTstate0 + here->B2cbd);
321 cdrain = here->
B2mode * (cd + cbd);
322 gm = *(ckt->CKTstate0 + here->B2gm);
323 gds = *(ckt->CKTstate0 + here->B2gds);
324 gmbs = *(ckt->CKTstate0 + here->B2gmbs);
325 gbd = *(ckt->CKTstate0 + here->B2gbd);
326 gbs = *(ckt->CKTstate0 + here->B2gbs);
330 cggb = *(ckt->CKTstate0 + here->B2cggb);
331 cgdb = *(ckt->CKTstate0 + here->B2cgdb);
332 cgsb = *(ckt->CKTstate0 + here->B2cgsb);
333 cbgb = *(ckt->CKTstate0 + here->B2cbgb);
334 cbdb = *(ckt->CKTstate0 + here->B2cbdb);
335 cbsb = *(ckt->CKTstate0 + here->B2cbsb);
336 cdgb = *(ckt->CKTstate0 + here->B2cdgb);
337 cddb = *(ckt->CKTstate0 + here->B2cddb);
338 cdsb = *(ckt->CKTstate0 + here->B2cdsb);
339 capbs = *(ckt->CKTstate0 + here->B2capbs);
340 capbd = *(ckt->CKTstate0 + here->B2capbd);
350 if(*(ckt->CKTstate0 + here->B2vds) >=0) {
351 vgs =
DEVfetlim(vgs,*(ckt->CKTstate0 + here->B2vgs)
354 vds =
DEVlimvds(vds,*(ckt->CKTstate0 + here->B2vds));
359 vds = -
DEVlimvds(-vds,-(*(ckt->CKTstate0 +
365 vbs =
DEVpnjlim(vbs,*(ckt->CKTstate0 + here->B2vbs),
370 vbd =
DEVpnjlim(vbd,*(ckt->CKTstate0 + here->B2vbd),
388 cbs = SourceSatCurrent * (evbs-1) + ckt->
CKTgmin * vbs ;
396 cbd = DrainSatCurrent *(evbd-1)+ckt->
CKTgmin*vbd;
411 B2evaluate(vds,vbs,vgs,here,model,&gm,&gds,&gmbs,&qgate,
412 &qbulk,&qdrn,&cggb,&cgdb,&cgsb,&cbgb,&cbdb,&cbsb,&cdgb,
413 &cddb,&cdsb,&cdrain,&von,&vdsat,ckt);
415 B2evaluate(-vds,vbd,vgd,here,model,&gm,&gds,&gmbs,&qgate,
416 &qbulk,&qsrc,&cggb,&cgsb,&cgdb,&cbgb,&cbsb,&cbdb,&csgb,
417 &cssb,&csdb,&cdrain,&von,&vdsat,ckt);
428 cd=here->
B2mode * cdrain - cbd;
453 arg = 1 - vbs / PhiB;
454 argsw = 1 - vbs / PhiBSW;
455 sarg = exp(-MJ*log(arg));
456 sargsw = exp(-MJSW*log(argsw));
457 *(ckt->CKTstate0 + here->B2qbs) =
458 PhiB * czbs * (1-arg*sarg)/(1-MJ) + PhiBSW *
459 czbssw * (1-argsw*sargsw)/(1-MJSW);
460 capbs = czbs * sarg + czbssw * sargsw ;
462 *(ckt->CKTstate0+here->B2qbs) =
463 vbs*(czbs+czbssw)+ vbs*vbs*(czbs*MJ*0.5/PhiB
464 + czbssw * MJSW * 0.5/PhiBSW);
465 capbs = czbs + czbssw + vbs *(czbs*MJ/PhiB+
466 czbssw * MJSW / PhiBSW );
471 arg = 1 - vbd / PhiB;
472 argsw = 1 - vbd / PhiBSW;
473 sarg = exp(-MJ*log(arg));
474 sargsw = exp(-MJSW*log(argsw));
475 *(ckt->CKTstate0 + here->B2qbd) =
476 PhiB * czbd * (1-arg*sarg)/(1-MJ) + PhiBSW *
477 czbdsw * (1-argsw*sargsw)/(1-MJSW);
478 capbd = czbd * sarg + czbdsw * sargsw ;
480 *(ckt->CKTstate0+here->B2qbd) =
481 vbd*(czbd+czbdsw)+ vbd*vbd*(czbd*MJ*0.5/PhiB
482 + czbdsw * MJSW * 0.5/PhiBSW);
483 capbd = czbd + czbdsw + vbd *(czbd*MJ/PhiB+
484 czbdsw * MJSW / PhiBSW );
503 if (
FABS(cdhat-cd) >= tol) {
509 if (
FABS(cbhat-(cbs+cbd)) > tol) {
517 *(ckt->CKTstate0 + here->B2vbs) = vbs;
518 *(ckt->CKTstate0 + here->B2vbd) = vbd;
519 *(ckt->CKTstate0 + here->B2vgs) = vgs;
520 *(ckt->CKTstate0 + here->B2vds) = vds;
521 *(ckt->CKTstate0 + here->B2cd) = cd;
522 *(ckt->CKTstate0 + here->B2cbs) = cbs;
523 *(ckt->CKTstate0 + here->B2cbd) = cbd;
524 *(ckt->CKTstate0 + here->B2gm) = gm;
525 *(ckt->CKTstate0 + here->B2gds) = gds;
526 *(ckt->CKTstate0 + here->B2gmbs) = gmbs;
527 *(ckt->CKTstate0 + here->B2gbd) = gbd;
528 *(ckt->CKTstate0 + here->B2gbs) = gbs;
530 *(ckt->CKTstate0 + here->B2cggb) = cggb;
531 *(ckt->CKTstate0 + here->B2cgdb) = cgdb;
532 *(ckt->CKTstate0 + here->B2cgsb) = cgsb;
534 *(ckt->CKTstate0 + here->B2cbgb) = cbgb;
535 *(ckt->CKTstate0 + here->B2cbdb) = cbdb;
536 *(ckt->CKTstate0 + here->B2cbsb) = cbsb;
538 *(ckt->CKTstate0 + here->B2cdgb) = cdgb;
539 *(ckt->CKTstate0 + here->B2cddb) = cddb;
540 *(ckt->CKTstate0 + here->B2cdsb) = cdsb;
542 *(ckt->CKTstate0 + here->B2capbs) = capbs;
543 *(ckt->CKTstate0 + here->B2capbd) = capbd;
555 args[0] = GateDrainOverlapCap;
556 args[1] = GateSourceOverlapCap;
557 args[2] = GateBulkOverlapCap;
571 cbgb,cbdb,cbsb,cdgb,cddb,cdsb
572 ,&gcggb,&gcgdb,&gcgsb,&gcbgb,&gcbdb,&gcbsb,&gcdgb
573 ,&gcddb,&gcdsb,&gcsgb,&gcsdb,&gcssb,&qgate,&qbulk
577 args[0] = GateSourceOverlapCap;
578 args[1] = GateDrainOverlapCap;
579 args[2] = GateBulkOverlapCap;
592 cbgb,cbsb,cbdb,csgb,cssb,csdb
593 ,&gcggb,&gcgsb,&gcgdb,&gcbgb,&gcbsb,&gcbdb,&gcsgb
594 ,&gcssb,&gcsdb,&gcdgb,&gcdsb,&gcddb,&qgate,&qbulk
598 if(ByPass)
goto line860;
599 *(ckt->CKTstate0 + here->B2qg) = qgate;
600 *(ckt->CKTstate0 + here->B2qd) = qdrn -
601 *(ckt->CKTstate0 + here->B2qbd);
602 *(ckt->CKTstate0 + here->B2qb) = qbulk +
603 *(ckt->CKTstate0 + here->B2qbd) +
604 *(ckt->CKTstate0 + here->B2qbs);
611 *(ckt->CKTstate0+here->B2cggb) = cggb;
612 *(ckt->CKTstate0+here->B2cgdb) = cgdb;
613 *(ckt->CKTstate0+here->B2cgsb) = cgsb;
614 *(ckt->CKTstate0+here->B2cbgb) = cbgb;
615 *(ckt->CKTstate0+here->B2cbdb) = cbdb;
616 *(ckt->CKTstate0+here->B2cbsb) = cbsb;
617 *(ckt->CKTstate0+here->B2cdgb) = cdgb;
618 *(ckt->CKTstate0+here->B2cddb) = cddb;
619 *(ckt->CKTstate0+here->B2cdsb) = cdsb;
620 *(ckt->CKTstate0+here->B2capbd) = capbd;
621 *(ckt->CKTstate0+here->B2capbs) = capbs;
627 *(ckt->CKTstate1+here->B2qb) =
628 *(ckt->CKTstate0+here->B2qb) ;
629 *(ckt->CKTstate1+here->B2qg) =
630 *(ckt->CKTstate0+here->B2qg) ;
631 *(ckt->CKTstate1+here->B2qd) =
632 *(ckt->CKTstate0+here->B2qd) ;
636 NI_INTEG(ckt,geq,ceq,0.0,here->B2qb);
637 NI_INTEG(ckt,geq,ceq,0.0,here->B2qg);
638 NI_INTEG(ckt,geq,ceq,0.0,here->B2qd);
644 ceqqg = ceqqb = ceqqd = 0.0;
645 gcdgb = gcddb = gcdsb = 0.0;
646 gcsgb = gcsdb = gcssb = 0.0;
647 gcggb = gcgdb = gcgsb = 0.0;
648 gcbgb = gcbdb = gcbsb = 0.0;
653 cqgate = *(ckt->CKTstate0 + here->B2iqg);
654 cqbulk = *(ckt->CKTstate0 + here->B2iqb);
655 cqdrn = *(ckt->CKTstate0 + here->B2iqd);
656 ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs;
657 ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs;
658 ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs;
661 *(ckt->CKTstate1 + here->B2iqb) =
662 *(ckt->CKTstate0 + here->B2iqb);
663 *(ckt->CKTstate1 + here->B2iqg) =
664 *(ckt->CKTstate0 + here->B2iqg);
665 *(ckt->CKTstate1 + here->B2iqd) =
666 *(ckt->CKTstate0 + here->B2iqd);
677 ceqqg = model->
B2type * ceqqg;
678 ceqqb = model->
B2type * ceqqb;
679 ceqqd = model->
B2type * ceqqd;
683 cdreq=model->
B2type*(cdrain-gds*vds-gm*vgs-gmbs*vbs);
687 cdreq = -(model->
B2type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd);
695 (cdreq+ceqbs+ceqqg+ceqqb+ceqqd);
704 *(here->
B2BbPtr) += (gbd+gbs-gcbgb-gcbdb-gcbsb);
710 *(here->
B2GbPtr) += (-gcggb-gcgdb-gcgsb);
718 *(here->
B2DPgPtr) += ((xnrm-xrev)*gm+gcdgb);
719 *(here->
B2DPbPtr) += (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb);
720 *(here->
B2DPspPtr) += (-gds-xnrm*(gm+gmbs)+gcdsb);
721 *(here->
B2SPgPtr) += (-(xnrm-xrev)*gm+gcsgb);
723 *(here->
B2SPbPtr) += (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb);
724 *(here->
B2SPdpPtr) += (-gds-xrev*(gm+gmbs)+gcsdb);
double B2bulkJctSideGradingCoeff
double B2unitLengthSidewallJctCap
struct sBSIM2instance * B2nextInstance
GENinstance * CKTtroubleElt
double B2bulkJctPotential
double B2sourceConductance
#define NI_INTEG(ckt, geq, ceq, cap, qcap)
struct sBSIM2model * B2nextModel
struct bsim2SizeDependParam * pParam
double B2gateDrainOverlapCap
double B2drainConductance
double B2jctSatCurDensity
double B2gateSourceOverlapCap
double B2gateBulkOverlapCap
double B2sidewallJctPotential
double B2bulkJctBotGradingCoeff