45 #include <Xyce_config.h>
62 #include <N_ERH_ErrorMgr.h>
63 #include <N_LAS_Matrix.h>
64 #include <N_LAS_Vector.h>
117 "Initial condition of no voltage drops across device");
191 U_OHM,
CAT_RES,
"Drain, source diffusion sheet resistance");
233 U_NONE,
CAT_CAP,
"Bulk p-n forward-bias capacitance coefficient");
259 " 0 = aluminum, 1 = opposite of substrate)");
314 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
322 l(getDeviceOptions().defl),
323 w(getDeviceOptions().defw),
325 drainArea(getDeviceOptions().defad),
326 sourceArea(getDeviceOptions().defas),
330 sourcePerimeter(0.0),
331 sourceConductance(0.0),
332 drainConductance(0.0),
333 temp(getDeviceOptions().temp.getImmutableValue<double>()),
335 tTransconductance(0.0),
386 GateSourceOverlapCap(0),
387 GateDrainOverlapCap(0),
388 GateBulkOverlapCap(0),
401 li_DrainPrimedot(-1),
403 li_SourcePrimedot(-1),
417 ADrainEquDrainNodeOffset(-1),
418 ADrainEquDrainPrimeNodeOffset(-1),
420 AGateEquGateNodeOffset(-1),
421 AGateEquBulkNodeOffset(-1),
422 AGateEquDrainPrimeNodeOffset(-1),
423 AGateEquSourcePrimeNodeOffset(-1),
425 AGateEquVGatedotNodeOffset(-1),
426 AGateEquVBulkdotNodeOffset(-1),
427 AGateEquVDrainPrimedotNodeOffset(-1),
428 AGateEquVSourcePrimedotNodeOffset(-1),
430 ASourceEquSourceNodeOffset(-1),
431 ASourceEquSourcePrimeNodeOffset(-1),
433 ABulkEquGateNodeOffset(-1),
434 ABulkEquBulkNodeOffset(-1),
435 ABulkEquDrainPrimeNodeOffset(-1),
436 ABulkEquSourcePrimeNodeOffset(-1),
438 ABulkEquVGatedotNodeOffset(-1),
439 ABulkEquVBulkdotNodeOffset(-1),
440 ABulkEquVDrainPrimedotNodeOffset(-1),
441 ABulkEquVSourcePrimedotNodeOffset(-1),
443 ADrainPrimeEquDrainNodeOffset(-1),
444 ADrainPrimeEquGateNodeOffset(-1),
445 ADrainPrimeEquBulkNodeOffset(-1),
446 ADrainPrimeEquDrainPrimeNodeOffset(-1),
447 ADrainPrimeEquSourcePrimeNodeOffset(-1),
449 ADrainPrimeEquVGatedotNodeOffset(-1),
450 ADrainPrimeEquVBulkdotNodeOffset(-1),
451 ADrainPrimeEquVDrainPrimedotNodeOffset(-1),
453 ASourcePrimeEquGateNodeOffset(-1),
454 ASourcePrimeEquSourceNodeOffset(-1),
455 ASourcePrimeEquBulkNodeOffset(-1),
456 ASourcePrimeEquDrainPrimeNodeOffset(-1),
457 ASourcePrimeEquSourcePrimeNodeOffset(-1),
459 ASourcePrimeEquVGatedotNodeOffset(-1),
460 ASourcePrimeEquVBulkdotNodeOffset(-1),
461 ASourcePrimeEquVSourcePrimedotNodeOffset(-1),
463 ADraindotEquVDrainNodeOffset(-1),
464 ADraindotEquVDraindotNodeOffset(-1),
465 AGatedotEquVGateNodeOffset(-1),
466 AGatedotEquVGatedotNodeOffset(-1),
467 ASourcedotEquVSourceNodeOffset(-1),
468 ASourcedotEquVSourcedotNodeOffset(-1),
469 ABulkdotEquVBulkNodeOffset(-1),
470 ABulkdotEquVBulkdotNodeOffset(-1),
471 ADrainPrimedotEquVDrainPrimeNodeOffset(-1),
472 ADrainPrimedotEquVDrainPrimedotNodeOffset(-1),
478 f_DrainEquDrainNodePtr(0),
479 f_DrainEquDrainPrimeNodePtr(0),
482 f_GateEquGateNodePtr(0),
483 f_GateEquBulkNodePtr(0),
484 f_GateEquDrainPrimeNodePtr(0),
485 f_GateEquSourcePrimeNodePtr(0),
487 f_GateEquVGatedotNodePtr(0),
488 f_GateEquVBulkdotNodePtr(0),
489 f_GateEquVDrainPrimedotNodePtr(0),
490 f_GateEquVSourcePrimedotNodePtr(0),
493 f_SourceEquSourceNodePtr(0),
494 f_SourceEquSourcePrimeNodePtr(0),
497 f_BulkEquGateNodePtr(0),
498 f_BulkEquBulkNodePtr(0),
499 f_BulkEquDrainPrimeNodePtr(0),
500 f_BulkEquSourcePrimeNodePtr(0),
502 f_BulkEquVGatedotNodePtr(0),
503 f_BulkEquVBulkdotNodePtr(0),
504 f_BulkEquVDrainPrimedotNodePtr(0),
505 f_BulkEquVSourcePrimedotNodePtr(0),
508 f_DrainPrimeEquDrainNodePtr(0),
509 f_DrainPrimeEquGateNodePtr(0),
510 f_DrainPrimeEquBulkNodePtr(0),
511 f_DrainPrimeEquDrainPrimeNodePtr(0),
512 f_DrainPrimeEquSourcePrimeNodePtr(0),
514 f_DrainPrimeEquVGatedotNodePtr(0),
515 f_DrainPrimeEquVBulkdotNodePtr(0),
516 f_DrainPrimeEquVDrainPrimedotNodePtr(0),
519 f_SourcePrimeEquGateNodePtr(0),
520 f_SourcePrimeEquSourceNodePtr(0),
521 f_SourcePrimeEquBulkNodePtr(0),
522 f_SourcePrimeEquDrainPrimeNodePtr(0),
523 f_SourcePrimeEquSourcePrimeNodePtr(0),
525 f_SourcePrimeEquVGatedotNodePtr(0),
526 f_SourcePrimeEquVBulkdotNodePtr(0),
527 f_SourcePrimeEquVSourcePrimedotNodePtr(0),
530 f_DraindotEquVDrainNodePtr(0),
531 f_DraindotEquVDraindotNodePtr(0),
532 f_GatedotEquVGateNodePtr(0),
533 f_GatedotEquVGatedotNodePtr(0),
534 f_SourcedotEquVSourceNodePtr(0),
535 f_SourcedotEquVSourcedotNodePtr(0),
536 f_BulkdotEquVBulkNodePtr(0),
537 f_BulkdotEquVBulkdotNodePtr(0),
538 f_DrainPrimedotEquVDrainPrimeNodePtr(0),
539 f_DrainPrimedotEquVDrainPrimedotNodePtr(0),
540 f_SourcePrimedotEquVSourcePrimeNodePtr(0),
541 f_SourcePrimedotEquVSourcePrimedotNodePtr(0),
545 q_DrainEquDrainNodePtr(0),
546 q_DrainEquDrainPrimeNodePtr(0),
549 q_GateEquGateNodePtr(0),
550 q_GateEquBulkNodePtr(0),
551 q_GateEquDrainPrimeNodePtr(0),
552 q_GateEquSourcePrimeNodePtr(0),
554 q_GateEquVGatedotNodePtr(0),
555 q_GateEquVBulkdotNodePtr(0),
556 q_GateEquVDrainPrimedotNodePtr(0),
557 q_GateEquVSourcePrimedotNodePtr(0),
560 q_SourceEquSourceNodePtr(0),
561 q_SourceEquSourcePrimeNodePtr(0),
564 q_BulkEquGateNodePtr(0),
565 q_BulkEquBulkNodePtr(0),
566 q_BulkEquDrainPrimeNodePtr(0),
567 q_BulkEquSourcePrimeNodePtr(0),
569 q_BulkEquVGatedotNodePtr(0),
570 q_BulkEquVBulkdotNodePtr(0),
571 q_BulkEquVDrainPrimedotNodePtr(0),
572 q_BulkEquVSourcePrimedotNodePtr(0),
575 q_DrainPrimeEquDrainNodePtr(0),
576 q_DrainPrimeEquGateNodePtr(0),
577 q_DrainPrimeEquBulkNodePtr(0),
578 q_DrainPrimeEquDrainPrimeNodePtr(0),
579 q_DrainPrimeEquSourcePrimeNodePtr(0),
581 q_DrainPrimeEquVGatedotNodePtr(0),
582 q_DrainPrimeEquVBulkdotNodePtr(0),
583 q_DrainPrimeEquVDrainPrimedotNodePtr(0),
586 q_SourcePrimeEquGateNodePtr(0),
587 q_SourcePrimeEquSourceNodePtr(0),
588 q_SourcePrimeEquBulkNodePtr(0),
589 q_SourcePrimeEquDrainPrimeNodePtr(0),
590 q_SourcePrimeEquSourcePrimeNodePtr(0),
592 q_SourcePrimeEquVGatedotNodePtr(0),
593 q_SourcePrimeEquVBulkdotNodePtr(0),
594 q_SourcePrimeEquVSourcePrimedotNodePtr(0),
597 q_DraindotEquVDrainNodePtr(0),
598 q_DraindotEquVDraindotNodePtr(0),
599 q_GatedotEquVGateNodePtr(0),
600 q_GatedotEquVGatedotNodePtr(0),
601 q_SourcedotEquVSourceNodePtr(0),
602 q_SourcedotEquVSourcedotNodePtr(0),
603 q_BulkdotEquVBulkNodePtr(0),
604 q_BulkdotEquVBulkdotNodePtr(0),
605 q_DrainPrimedotEquVDrainPrimeNodePtr(0),
606 q_DrainPrimedotEquVDrainPrimedotNodePtr(0),
607 q_SourcePrimedotEquVSourcePrimeNodePtr(0),
608 q_SourcePrimedotEquVSourcePrimedotNodePtr(0),
758 for (
int i=0; i < 12; i++)
823 for (
int i=0; i < 5; i++)
876 for (
int i=6; i < 12; i++)
879 for (
int j=0; j < 2; j++)
942 for (
int i=0; i < 4; i++)
996 for (
int i=6; i < 12; i++)
999 for (
int j=0; j < 2; j++)
1055 for (
int i=0; i < 4; i++)
1109 for (
int i=6; i < 12; i++)
1112 for (
int j=0; j < 2; j++)
1236 UserError0(*
this) <<
"Effective channel length less than zero.";
1279 const std::vector<int> & extLIDVecRef )
1295 #ifdef Xyce_DEBUG_DEVICE
1298 Xyce::dout() << section_divider << std::endl;
1299 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1300 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1301 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1302 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1350 #ifdef Xyce_DEBUG_DEVICE
1353 Xyce::dout() <<
"\n variable local indices:\n";
1354 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1355 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1356 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1357 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1358 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1359 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1361 Xyce::dout() <<
" li_Draindot = " <<
li_Draindot << std::endl;
1362 Xyce::dout() <<
" li_Gatedot = " <<
li_Gatedot << std::endl;
1363 Xyce::dout() <<
" li_Sourcedot = " <<
li_Sourcedot << std::endl;
1364 Xyce::dout() <<
" li_Bulkdot = " <<
li_Bulkdot << std::endl;
1368 Xyce::dout() << section_divider << std::endl;
1456 #ifdef Xyce_DEBUG_DEVICE
1459 Xyce::dout() << std::endl;
1460 Xyce::dout() << section_divider << std::endl;
1461 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1462 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1463 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1484 #ifdef Xyce_DEBUG_DEVICE
1487 Xyce::dout() <<
" State local indices:" << std::endl;
1488 Xyce::dout() << std::endl;
1498 Xyce::dout() << std::endl;
1499 Xyce::dout() << section_divider << std::endl;
1568 std::vector<int> map;
1569 std::vector< std::vector<int> > map2;
1678 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1889 double Qeqbs,Qeqbd,Qeqgb, Qeqgs, Qeqgd;
1900 Qeqbs = Dtype*(
qbs);
1901 Qeqbd = Dtype*(
qbd);
1904 Qeqgb = Dtype*(
qgb);
1905 Qeqgs = Dtype*(
qgs);
1906 Qeqgd = Dtype*(
qgd);
1909 coef = (Qeqgs+Qeqgd+Qeqgb);
1913 coef = Qeqbs + Qeqbd - Qeqgb;
1917 coef = -(Qeqbd + Qeqgd);
1921 coef = -(Qeqbs + Qeqgs);
1934 double gcgd, gcgs, gcgb, gcbs, gcbd;
1946 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1954 double coef_Jdxp4 = Dtype*(
1960 double coef_Jdxp5 = Dtype*(
2062 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
2084 ceqgb = Dtype*(
Capgb*vgbdot);
2085 ceqgs = Dtype*(
Capgs*vgsdot);
2086 ceqgd = Dtype*(
Capgd*vgddot);
2090 ceqbs = Dtype*(
cbs);
2091 ceqbd = Dtype*(
cbd);
2103 ceqbs = Dtype*(
cbs);
2104 ceqbd = Dtype*(
cbd);
2121 coef = (ceqgs+ceqgd+ceqgb);
2132 coef = ceqbs + ceqbd - ceqgb;
2171 double coef_Jdxp4 = Dtype*(
2176 double coef_Jdxp5 = Dtype*(
2183 double coef_Jdxp6 = Dtype*(
2302 (+gcbs+gcbd+gcgb)*numberParallel;
2312 (+gcbd+gcgd)*numberParallel;
2319 (+gcbs+gcgs)*numberParallel;
2386 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
2387 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
2388 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
2389 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
2390 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
2426 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
2427 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
2428 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*
numberParallel;
2430 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
2431 l_dcapgddvgd*l_vgddot)*numberParallel;
2433 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
2434 l_dcapgddvgs*l_vgddot)*numberParallel;
2436 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
2437 l_dcapgddvgb*l_vgddot)*numberParallel;
2440 (l_capgs + l_capgd + l_capgb)*numberParallel;
2457 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*numberParallel;
2459 (
gbs+
gbd+l_dcapgbdvgb*l_vgbdot)*numberParallel;
2461 (
gbd-l_dcapgbdvgd*l_vgbdot)*numberParallel;
2463 (
gbs-l_dcapgbdvgs*l_vgbdot )*numberParallel;
2469 (l_capbs+l_capgb+l_capbd)*numberParallel;
2478 (
gbs+
gbd)*numberParallel;
2491 (-
gbd+
Gmbs+l_dcapgddvgb*l_vgddot)*numberParallel;
2495 (-
gds-
nrmsum+l_dcapgddvgs*l_vgddot)*numberParallel;
2503 (l_capgd+l_capbd)*numberParallel;
2510 (
Gm)*numberParallel;
2526 (
gbs+
Gmbs-l_dcapgsdvgb*l_vgsdot)*numberParallel;
2528 (
gds+
revsum-l_dcapgsdvgd*l_vgsdot)*numberParallel;
2538 += (l_capgs+l_capbs)*numberParallel;
2543 (
Gm)*numberParallel;
2586 bool bsuccess =
true;
2696 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2865 #ifdef Xyce_DEBUG_DEVICE
2868 Xyce::dout() <<
"HOMOTOPY INFO: Von = " << Von <<std::endl;
2869 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
2871 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " << vds << std::endl;
2872 Xyce::dout() <<
"HOMOTOPY INFO: before vgs = " <<
vgs << std::endl;
2913 #ifdef Xyce_DEBUG_DEVICE
2916 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << vds << std::endl;
2917 Xyce::dout() <<
"HOMOTOPY INFO: after vgs = " <<
vgs << std::endl;
2922 if ((
mode==1?vbs:
vbd) <= 0 ) {
2926 sarg=sarg-(
mode==1?vbs:
vbd)/(sarg+sarg);
2954 if (vgst <= (vds*
mode))
2956 cdrain=betap*vgst*vgst*.5;
2969 (vgst-.5*(vds*mode));
2974 (vgst-.5*(vds*mode));
3031 sarg = sargsw = 1/sqrt(arg);
3050 sargsw = 1/sqrt(arg);
3090 sarg = sargsw = 1/sqrt(arg);
3104 sargsw = 1/sqrt(arg);
3236 #ifdef Xyce_DEBUG_DEVICE
3239 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3240 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3241 Xyce::dout() <<
" capgd = " <<
capgd <<
" capgd_old = " << capgd_old << std::endl;
3242 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3252 #ifdef Xyce_DEBUG_DEVICE
3255 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3256 Xyce::dout() <<
"Capgd = " <<
Capgd << std::endl;
3257 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3258 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3259 Xyce::dout() <<
"capgd = " <<
capgd << std::endl;
3260 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3413 double ratio,ratio4;
3421 double gmanew,gmaold;
3426 #ifdef Xyce_DEBUG_DEVICE
3429 Xyce::dout() << subsection_divider << std::endl;
3430 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3431 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3432 Xyce::dout() << std::endl;
3437 if (temp_tmp != -999.0)
temp = temp_tmp;
3447 #ifdef Xyce_DEBUG_DEVICE
3450 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
3451 Xyce::dout() <<
"tnom = " << tnom << std::endl;
3452 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3462 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3464 #ifdef Xyce_DEBUG_DEVICE
3467 Xyce::dout() <<
"vt = " <<
vt << std::endl;
3468 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3469 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
3470 Xyce::dout() <<
"kt = " << kt << std::endl;
3471 Xyce::dout() <<
"egfet = " << egfet << std::endl;
3472 Xyce::dout() <<
"arg = " << arg << std::endl;
3473 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
3486 ratio4 = ratio * sqrt(ratio);
3490 tPhi = fact2 * phio + pbfact;
3517 #ifdef Xyce_DEBUG_DEVICE
3520 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3522 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3523 Xyce::dout() <<
" phio = " << phio << std::endl;
3524 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3525 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3526 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3527 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3528 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3529 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3530 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3531 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3532 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3533 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3534 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3535 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3536 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3537 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3538 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3539 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3662 double vgs1, vgd1, vbs1,vgb1, vds1;
3765 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
3798 wkfng = 3.25 + .5 *
egfet1 - fermig;
3800 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
3803 gamma = sqrt(2 * 11.70 * 8.854214871e-12 *
3836 std::vector<Instance*>::iterator iter;
3840 for (iter=first; iter!=last; ++iter)
3842 (*iter)->processParams();
3860 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
3862 tnom(getDeviceOptions().tnom),
3864 jctSatCurDensity(0.0),
3866 drainResistance(0.0),
3867 sourceResistance(0.0),
3868 sheetResistance(0.0),
3869 transconductance(0.0),
3870 gateSourceOverlapCapFactor(0.0),
3871 gateDrainOverlapCapFactor(0.0),
3872 gateBulkOverlapCapFactor(0.0),
3873 oxideCapFactor(0.0),
3878 sideWallCapFactor(0.0),
3879 bulkJctPotential(0.0),
3880 bulkJctBotGradingCoeff(0.0),
3881 bulkJctSideGradingCoeff(0.0),
3882 fwdCapDepCoeff(0.0),
3886 substrateDoping(0.0),
3888 surfaceStateDensity(0.0),
3889 oxideThickness(0.0),
3890 surfaceMobility(0.0),
3895 bulkCapFactorGiven(0),
3896 sideWallCapFactorGiven(0)
3903 else if (
getType() ==
"PMOS") {
3938 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
3940 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
3958 std::vector<Instance*>::iterator iter;
3962 for (iter=first; iter!=last; ++iter)
3979 std::vector<Instance*>::const_iterator iter;
3985 os <<
" name model name Parameters" << std::endl;
3986 for (i=0, iter=first; iter!=last; ++iter, ++i)
3988 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
4013 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
4033 bool returnVal=
false;
4048 (*maskVectorPtr)[
li_Gate] = 0.0;
4049 (*maskVectorPtr)[
li_Bulk] = 0.0;
4071 bool bsuccess =
true;
4080 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
4083 bsuccess = bsuccess && btmp;
4168 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
4176 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
4177 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
4191 ceqbs = Dtype*(mi.
cbs+mi.
capbs*vbsdot);
4192 ceqbd = Dtype*(mi.
cbd+mi.
capbd*vbddot);
4193 ceqgb = Dtype*(mi.
Capgb*vgbdot);
4194 ceqgs = Dtype*(mi.
Capgs*vgsdot);
4195 ceqgd = Dtype*(mi.
Capgd*vgddot);
4199 ceqbs = Dtype*(mi.
cbs);
4200 ceqbd = Dtype*(mi.
cbd);
4211 ceqbs = Dtype*(mi.
cbs);
4212 ceqbd = Dtype*(mi.
cbd);
4225 coef = (ceqgs+ceqgd+ceqgb);
4231 coef = ceqbs + ceqbd - ceqgb;
4278 Qeqbs = Dtype*(mi.
qbs);
4279 Qeqbd = Dtype*(mi.
qbd);
4282 Qeqgb = Dtype*(mi.
qgb);
4283 Qeqgs = Dtype*(mi.
qgs);
4284 Qeqgd = Dtype*(mi.
qgd);
4286 coef = (Qeqgs+Qeqgd+Qeqgb);
4289 coef = Qeqbs + Qeqbd - Qeqgb;
4292 coef = -(Qeqbd + Qeqgd);
4295 coef = -(Qeqbs + Qeqgs);
4303 double coef_Jdxp4 = Dtype*(
4307 double coef_Jdxp5 = Dtype*(
4313 double coef_Jdxp6 = Dtype*(
4328 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
4340 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
4347 double coef_Jdxp4 = Dtype*(
4352 double coef_Jdxp5 = Dtype*(
4357 double coef_Jdxp6 = Dtype*
4398 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
4416 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4417 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4418 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4419 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4420 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4458 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4459 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4460 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4462 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4465 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4468 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4491 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4523 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4556 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
4700 int sizeInstances = instanceContainer_.size();
4701 for (
int i=0; i<sizeInstances; ++i)
4703 Instance & mi = *(instanceContainer_.at(i));
4708 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4709 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4710 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4711 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4712 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4751 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4752 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4753 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4755 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4758 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4761 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4784 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4816 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4849 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
4993 .registerDevice(
"m", 1)
4994 .registerModelType(
"pmos", 1)
4995 .registerModelType(
"nmos", 1);