45 #include <Xyce_config.h>
62 #include <N_ERH_ErrorMgr.h>
64 #include <N_LAS_Matrix.h>
65 #include <N_LAS_Vector.h>
120 "Initial condition of no voltage drops across device");
194 U_OHM,
CAT_RES,
"Drain, source diffusion sheet resistance");
236 U_NONE,
CAT_CAP,
"Bulk p-n forward-bias capacitance coefficient");
262 " 0 = aluminum, 1 = opposite of substrate)");
318 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
326 l(getDeviceOptions().defl),
327 w(getDeviceOptions().defw),
329 drainArea(getDeviceOptions().defad),
330 sourceArea(getDeviceOptions().defas),
334 sourcePerimeter(0.0),
335 sourceConductance(0.0),
336 drainConductance(0.0),
337 temp(getDeviceOptions().temp.getImmutableValue<double>()),
339 tTransconductance(0.0),
390 GateSourceOverlapCap(0),
391 GateDrainOverlapCap(0),
392 GateBulkOverlapCap(0),
405 li_DrainPrimedot(-1),
407 li_SourcePrimedot(-1),
421 ADrainEquDrainNodeOffset(-1),
422 ADrainEquDrainPrimeNodeOffset(-1),
424 AGateEquGateNodeOffset(-1),
425 AGateEquBulkNodeOffset(-1),
426 AGateEquDrainPrimeNodeOffset(-1),
427 AGateEquSourcePrimeNodeOffset(-1),
429 AGateEquVGatedotNodeOffset(-1),
430 AGateEquVBulkdotNodeOffset(-1),
431 AGateEquVDrainPrimedotNodeOffset(-1),
432 AGateEquVSourcePrimedotNodeOffset(-1),
434 ASourceEquSourceNodeOffset(-1),
435 ASourceEquSourcePrimeNodeOffset(-1),
437 ABulkEquGateNodeOffset(-1),
438 ABulkEquBulkNodeOffset(-1),
439 ABulkEquDrainPrimeNodeOffset(-1),
440 ABulkEquSourcePrimeNodeOffset(-1),
442 ABulkEquVGatedotNodeOffset(-1),
443 ABulkEquVBulkdotNodeOffset(-1),
444 ABulkEquVDrainPrimedotNodeOffset(-1),
445 ABulkEquVSourcePrimedotNodeOffset(-1),
447 ADrainPrimeEquDrainNodeOffset(-1),
448 ADrainPrimeEquGateNodeOffset(-1),
449 ADrainPrimeEquBulkNodeOffset(-1),
450 ADrainPrimeEquDrainPrimeNodeOffset(-1),
451 ADrainPrimeEquSourcePrimeNodeOffset(-1),
453 ADrainPrimeEquVGatedotNodeOffset(-1),
454 ADrainPrimeEquVBulkdotNodeOffset(-1),
455 ADrainPrimeEquVDrainPrimedotNodeOffset(-1),
457 ASourcePrimeEquGateNodeOffset(-1),
458 ASourcePrimeEquSourceNodeOffset(-1),
459 ASourcePrimeEquBulkNodeOffset(-1),
460 ASourcePrimeEquDrainPrimeNodeOffset(-1),
461 ASourcePrimeEquSourcePrimeNodeOffset(-1),
463 ASourcePrimeEquVGatedotNodeOffset(-1),
464 ASourcePrimeEquVBulkdotNodeOffset(-1),
465 ASourcePrimeEquVSourcePrimedotNodeOffset(-1),
467 ADraindotEquVDrainNodeOffset(-1),
468 ADraindotEquVDraindotNodeOffset(-1),
469 AGatedotEquVGateNodeOffset(-1),
470 AGatedotEquVGatedotNodeOffset(-1),
471 ASourcedotEquVSourceNodeOffset(-1),
472 ASourcedotEquVSourcedotNodeOffset(-1),
473 ABulkdotEquVBulkNodeOffset(-1),
474 ABulkdotEquVBulkdotNodeOffset(-1),
475 ADrainPrimedotEquVDrainPrimeNodeOffset(-1),
476 ADrainPrimedotEquVDrainPrimedotNodeOffset(-1),
482 f_DrainEquDrainNodePtr(0),
483 f_DrainEquDrainPrimeNodePtr(0),
486 f_GateEquGateNodePtr(0),
487 f_GateEquBulkNodePtr(0),
488 f_GateEquDrainPrimeNodePtr(0),
489 f_GateEquSourcePrimeNodePtr(0),
491 f_GateEquVGatedotNodePtr(0),
492 f_GateEquVBulkdotNodePtr(0),
493 f_GateEquVDrainPrimedotNodePtr(0),
494 f_GateEquVSourcePrimedotNodePtr(0),
497 f_SourceEquSourceNodePtr(0),
498 f_SourceEquSourcePrimeNodePtr(0),
501 f_BulkEquGateNodePtr(0),
502 f_BulkEquBulkNodePtr(0),
503 f_BulkEquDrainPrimeNodePtr(0),
504 f_BulkEquSourcePrimeNodePtr(0),
506 f_BulkEquVGatedotNodePtr(0),
507 f_BulkEquVBulkdotNodePtr(0),
508 f_BulkEquVDrainPrimedotNodePtr(0),
509 f_BulkEquVSourcePrimedotNodePtr(0),
512 f_DrainPrimeEquDrainNodePtr(0),
513 f_DrainPrimeEquGateNodePtr(0),
514 f_DrainPrimeEquBulkNodePtr(0),
515 f_DrainPrimeEquDrainPrimeNodePtr(0),
516 f_DrainPrimeEquSourcePrimeNodePtr(0),
518 f_DrainPrimeEquVGatedotNodePtr(0),
519 f_DrainPrimeEquVBulkdotNodePtr(0),
520 f_DrainPrimeEquVDrainPrimedotNodePtr(0),
523 f_SourcePrimeEquGateNodePtr(0),
524 f_SourcePrimeEquSourceNodePtr(0),
525 f_SourcePrimeEquBulkNodePtr(0),
526 f_SourcePrimeEquDrainPrimeNodePtr(0),
527 f_SourcePrimeEquSourcePrimeNodePtr(0),
529 f_SourcePrimeEquVGatedotNodePtr(0),
530 f_SourcePrimeEquVBulkdotNodePtr(0),
531 f_SourcePrimeEquVSourcePrimedotNodePtr(0),
534 f_DraindotEquVDrainNodePtr(0),
535 f_DraindotEquVDraindotNodePtr(0),
536 f_GatedotEquVGateNodePtr(0),
537 f_GatedotEquVGatedotNodePtr(0),
538 f_SourcedotEquVSourceNodePtr(0),
539 f_SourcedotEquVSourcedotNodePtr(0),
540 f_BulkdotEquVBulkNodePtr(0),
541 f_BulkdotEquVBulkdotNodePtr(0),
542 f_DrainPrimedotEquVDrainPrimeNodePtr(0),
543 f_DrainPrimedotEquVDrainPrimedotNodePtr(0),
544 f_SourcePrimedotEquVSourcePrimeNodePtr(0),
545 f_SourcePrimedotEquVSourcePrimedotNodePtr(0),
549 q_DrainEquDrainNodePtr(0),
550 q_DrainEquDrainPrimeNodePtr(0),
553 q_GateEquGateNodePtr(0),
554 q_GateEquBulkNodePtr(0),
555 q_GateEquDrainPrimeNodePtr(0),
556 q_GateEquSourcePrimeNodePtr(0),
558 q_GateEquVGatedotNodePtr(0),
559 q_GateEquVBulkdotNodePtr(0),
560 q_GateEquVDrainPrimedotNodePtr(0),
561 q_GateEquVSourcePrimedotNodePtr(0),
564 q_SourceEquSourceNodePtr(0),
565 q_SourceEquSourcePrimeNodePtr(0),
568 q_BulkEquGateNodePtr(0),
569 q_BulkEquBulkNodePtr(0),
570 q_BulkEquDrainPrimeNodePtr(0),
571 q_BulkEquSourcePrimeNodePtr(0),
573 q_BulkEquVGatedotNodePtr(0),
574 q_BulkEquVBulkdotNodePtr(0),
575 q_BulkEquVDrainPrimedotNodePtr(0),
576 q_BulkEquVSourcePrimedotNodePtr(0),
579 q_DrainPrimeEquDrainNodePtr(0),
580 q_DrainPrimeEquGateNodePtr(0),
581 q_DrainPrimeEquBulkNodePtr(0),
582 q_DrainPrimeEquDrainPrimeNodePtr(0),
583 q_DrainPrimeEquSourcePrimeNodePtr(0),
585 q_DrainPrimeEquVGatedotNodePtr(0),
586 q_DrainPrimeEquVBulkdotNodePtr(0),
587 q_DrainPrimeEquVDrainPrimedotNodePtr(0),
590 q_SourcePrimeEquGateNodePtr(0),
591 q_SourcePrimeEquSourceNodePtr(0),
592 q_SourcePrimeEquBulkNodePtr(0),
593 q_SourcePrimeEquDrainPrimeNodePtr(0),
594 q_SourcePrimeEquSourcePrimeNodePtr(0),
596 q_SourcePrimeEquVGatedotNodePtr(0),
597 q_SourcePrimeEquVBulkdotNodePtr(0),
598 q_SourcePrimeEquVSourcePrimedotNodePtr(0),
601 q_DraindotEquVDrainNodePtr(0),
602 q_DraindotEquVDraindotNodePtr(0),
603 q_GatedotEquVGateNodePtr(0),
604 q_GatedotEquVGatedotNodePtr(0),
605 q_SourcedotEquVSourceNodePtr(0),
606 q_SourcedotEquVSourcedotNodePtr(0),
607 q_BulkdotEquVBulkNodePtr(0),
608 q_BulkdotEquVBulkdotNodePtr(0),
609 q_DrainPrimedotEquVDrainPrimeNodePtr(0),
610 q_DrainPrimedotEquVDrainPrimedotNodePtr(0),
611 q_SourcePrimedotEquVSourcePrimeNodePtr(0),
612 q_SourcePrimedotEquVSourcePrimedotNodePtr(0),
762 for (
int i=0; i < 12; i++)
827 for (
int i=0; i < 5; i++)
880 for (
int i=6; i < 12; i++)
883 for (
int j=0; j < 2; j++)
946 for (
int i=0; i < 4; i++)
1000 for (
int i=6; i < 12; i++)
1003 for (
int j=0; j < 2; j++)
1059 for (
int i=0; i < 4; i++)
1113 for (
int i=6; i < 12; i++)
1116 for (
int j=0; j < 2; j++)
1240 UserError0(*
this) <<
"Effective channel length less than zero.";
1283 const std::vector<int> & extLIDVecRef )
1299 #ifdef Xyce_DEBUG_DEVICE
1302 Xyce::dout() << section_divider << std::endl;
1303 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1304 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1305 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1306 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1354 #ifdef Xyce_DEBUG_DEVICE
1357 Xyce::dout() <<
"\n variable local indices:\n";
1358 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1359 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1360 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1361 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1362 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1363 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1365 Xyce::dout() <<
" li_Draindot = " <<
li_Draindot << std::endl;
1366 Xyce::dout() <<
" li_Gatedot = " <<
li_Gatedot << std::endl;
1367 Xyce::dout() <<
" li_Sourcedot = " <<
li_Sourcedot << std::endl;
1368 Xyce::dout() <<
" li_Bulkdot = " <<
li_Bulkdot << std::endl;
1372 Xyce::dout() << section_divider << std::endl;
1395 tmpstr =
getName()+
"_drainprime";
1402 tmpstr =
getName()+
"_sourceprime";
1410 tmpstr =
getName()+
"_draindot";
1414 tmpstr =
getName()+
"_gatedot";
1418 tmpstr =
getName()+
"_sourcedot";
1422 tmpstr =
getName()+
"_bulkdot";
1428 tmpstr =
getName()+
"_drainprimedot";
1435 tmpstr =
getName()+
"_sourceprimedot";
1461 std::string modName(
getName());
1464 tmpstr = modName+
":DEV_ID";
1466 tmpstr = modName+
":DEV_IG";
1468 tmpstr = modName+
":DEV_IS";
1470 tmpstr = modName+
":DEV_IB";
1490 #ifdef Xyce_DEBUG_DEVICE
1493 Xyce::dout() << std::endl;
1494 Xyce::dout() << section_divider << std::endl;
1495 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1496 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1497 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1518 #ifdef Xyce_DEBUG_DEVICE
1521 Xyce::dout() <<
" State local indices:" << std::endl;
1522 Xyce::dout() << std::endl;
1532 Xyce::dout() << std::endl;
1533 Xyce::dout() << section_divider << std::endl;
1602 std::vector<int> map;
1603 std::vector< std::vector<int> > map2;
1712 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1923 double Qeqbs,Qeqbd,Qeqgb, Qeqgs, Qeqgd;
1934 Qeqbs = Dtype*(
qbs);
1935 Qeqbd = Dtype*(
qbd);
1938 Qeqgb = Dtype*(
qgb);
1939 Qeqgs = Dtype*(
qgs);
1940 Qeqgd = Dtype*(
qgd);
1943 coef = (Qeqgs+Qeqgd+Qeqgb);
1947 coef = Qeqbs + Qeqbd - Qeqgb;
1951 coef = -(Qeqbd + Qeqgd);
1955 coef = -(Qeqbs + Qeqgs);
1968 double gcgd, gcgs, gcgb, gcbs, gcbd;
1980 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1988 double coef_Jdxp4 = Dtype*(
1994 double coef_Jdxp5 = Dtype*(
2096 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
2118 ceqgb = Dtype*(
Capgb*vgbdot);
2119 ceqgs = Dtype*(
Capgs*vgsdot);
2120 ceqgd = Dtype*(
Capgd*vgddot);
2124 ceqbs = Dtype*(
cbs);
2125 ceqbd = Dtype*(
cbd);
2137 ceqbs = Dtype*(
cbs);
2138 ceqbd = Dtype*(
cbd);
2155 coef = (ceqgs+ceqgd+ceqgb);
2166 coef = ceqbs + ceqbd - ceqgb;
2205 double coef_Jdxp4 = Dtype*(
2210 double coef_Jdxp5 = Dtype*(
2217 double coef_Jdxp6 = Dtype*(
2336 (+gcbs+gcbd+gcgb)*numberParallel;
2346 (+gcbd+gcgd)*numberParallel;
2353 (+gcbs+gcgs)*numberParallel;
2420 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
2421 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
2422 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
2423 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
2424 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
2460 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
2461 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
2462 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*
numberParallel;
2464 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
2465 l_dcapgddvgd*l_vgddot)*numberParallel;
2467 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
2468 l_dcapgddvgs*l_vgddot)*numberParallel;
2470 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
2471 l_dcapgddvgb*l_vgddot)*numberParallel;
2474 (l_capgs + l_capgd + l_capgb)*numberParallel;
2491 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*numberParallel;
2493 (
gbs+
gbd+l_dcapgbdvgb*l_vgbdot)*numberParallel;
2495 (
gbd-l_dcapgbdvgd*l_vgbdot)*numberParallel;
2497 (
gbs-l_dcapgbdvgs*l_vgbdot )*numberParallel;
2503 (l_capbs+l_capgb+l_capbd)*numberParallel;
2512 (
gbs+
gbd)*numberParallel;
2525 (-
gbd+
Gmbs+l_dcapgddvgb*l_vgddot)*numberParallel;
2529 (-
gds-
nrmsum+l_dcapgddvgs*l_vgddot)*numberParallel;
2537 (l_capgd+l_capbd)*numberParallel;
2544 (
Gm)*numberParallel;
2560 (
gbs+
Gmbs-l_dcapgsdvgb*l_vgsdot)*numberParallel;
2562 (
gds+
revsum-l_dcapgsdvgd*l_vgsdot)*numberParallel;
2572 += (l_capgs+l_capbs)*numberParallel;
2577 (
Gm)*numberParallel;
2620 bool bsuccess =
true;
2730 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2899 #ifdef Xyce_DEBUG_DEVICE
2902 Xyce::dout() <<
"HOMOTOPY INFO: Von = " << Von <<std::endl;
2903 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
2905 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " << vds << std::endl;
2906 Xyce::dout() <<
"HOMOTOPY INFO: before vgs = " <<
vgs << std::endl;
2947 #ifdef Xyce_DEBUG_DEVICE
2950 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << vds << std::endl;
2951 Xyce::dout() <<
"HOMOTOPY INFO: after vgs = " <<
vgs << std::endl;
2956 if ((
mode==1?vbs:
vbd) <= 0 ) {
2960 sarg=sarg-(
mode==1?vbs:
vbd)/(sarg+sarg);
2961 sarg=Xycemax(0.0,sarg);
2965 Vdsat=Xycemax(vgst,0.0);
2988 if (vgst <= (vds*
mode))
2990 cdrain=betap*vgst*vgst*.5;
3003 (vgst-.5*(vds*mode));
3008 (vgst-.5*(vds*mode));
3065 sarg = sargsw = 1/sqrt(arg);
3084 sargsw = 1/sqrt(arg);
3124 sarg = sargsw = 1/sqrt(arg);
3138 sargsw = 1/sqrt(arg);
3270 #ifdef Xyce_DEBUG_DEVICE
3273 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3274 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3275 Xyce::dout() <<
" capgd = " <<
capgd <<
" capgd_old = " << capgd_old << std::endl;
3276 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3286 #ifdef Xyce_DEBUG_DEVICE
3289 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3290 Xyce::dout() <<
"Capgd = " <<
Capgd << std::endl;
3291 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3292 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3293 Xyce::dout() <<
"capgd = " <<
capgd << std::endl;
3294 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3447 double ratio,ratio4;
3455 double gmanew,gmaold;
3460 #ifdef Xyce_DEBUG_DEVICE
3463 Xyce::dout() << subsection_divider << std::endl;
3464 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3465 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3466 Xyce::dout() << std::endl;
3471 if (temp_tmp != -999.0)
temp = temp_tmp;
3481 #ifdef Xyce_DEBUG_DEVICE
3484 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
3485 Xyce::dout() <<
"tnom = " << tnom << std::endl;
3486 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3496 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3498 #ifdef Xyce_DEBUG_DEVICE
3501 Xyce::dout() <<
"vt = " <<
vt << std::endl;
3502 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3503 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
3504 Xyce::dout() <<
"kt = " << kt << std::endl;
3505 Xyce::dout() <<
"egfet = " << egfet << std::endl;
3506 Xyce::dout() <<
"arg = " << arg << std::endl;
3507 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
3520 ratio4 = ratio * sqrt(ratio);
3524 tPhi = fact2 * phio + pbfact;
3551 #ifdef Xyce_DEBUG_DEVICE
3554 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3556 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3557 Xyce::dout() <<
" phio = " << phio << std::endl;
3558 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3559 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3560 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3561 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3562 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3563 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3564 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3565 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3566 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3567 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3568 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3569 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3570 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3571 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3572 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3573 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3696 double vgs1, vgd1, vbs1,vgb1, vds1;
3799 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
3832 wkfng = 3.25 + .5 *
egfet1 - fermig;
3834 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
3837 gamma = sqrt(2 * 11.70 * 8.854214871e-12 *
3870 std::vector<Instance*>::iterator iter;
3874 for (iter=first; iter!=last; ++iter)
3876 (*iter)->processParams();
3894 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
3896 tnom(getDeviceOptions().tnom),
3898 jctSatCurDensity(0.0),
3900 drainResistance(0.0),
3901 sourceResistance(0.0),
3902 sheetResistance(0.0),
3903 transconductance(0.0),
3904 gateSourceOverlapCapFactor(0.0),
3905 gateDrainOverlapCapFactor(0.0),
3906 gateBulkOverlapCapFactor(0.0),
3907 oxideCapFactor(0.0),
3912 sideWallCapFactor(0.0),
3913 bulkJctPotential(0.0),
3914 bulkJctBotGradingCoeff(0.0),
3915 bulkJctSideGradingCoeff(0.0),
3916 fwdCapDepCoeff(0.0),
3920 substrateDoping(0.0),
3922 surfaceStateDensity(0.0),
3923 oxideThickness(0.0),
3924 surfaceMobility(0.0),
3929 bulkCapFactorGiven(0),
3930 sideWallCapFactorGiven(0)
3937 else if (
getType() ==
"PMOS") {
3972 UserError0(*
this) <<
"You have specified both uo and u0, which is not allowed.";
3974 UserWarning0(*
this) <<
"You have specified the surface mobility as u0 instead of uo. This is supported, but ill-advised.";
3992 std::vector<Instance*>::iterator iter;
3996 for (iter=first; iter!=last; ++iter)
4013 std::vector<Instance*>::const_iterator iter;
4019 os <<
" name model name Parameters" << std::endl;
4020 for (i=0, iter=first; iter!=last; ++iter, ++i)
4022 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
4047 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
4067 bool returnVal=
false;
4082 (*maskVectorPtr)[
li_Gate] = 0.0;
4083 (*maskVectorPtr)[
li_Bulk] = 0.0;
4105 bool bsuccess =
true;
4114 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
4117 bsuccess = bsuccess && btmp;
4210 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
4211 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
4225 ceqbs = Dtype*(mi.
cbs+mi.
capbs*vbsdot);
4226 ceqbd = Dtype*(mi.
cbd+mi.
capbd*vbddot);
4227 ceqgb = Dtype*(mi.
Capgb*vgbdot);
4228 ceqgs = Dtype*(mi.
Capgs*vgsdot);
4229 ceqgd = Dtype*(mi.
Capgd*vgddot);
4233 ceqbs = Dtype*(mi.
cbs);
4234 ceqbd = Dtype*(mi.
cbd);
4245 ceqbs = Dtype*(mi.
cbs);
4246 ceqbd = Dtype*(mi.
cbd);
4259 coef = (ceqgs+ceqgd+ceqgb);
4265 coef = ceqbs + ceqbd - ceqgb;
4312 Qeqbs = Dtype*(mi.
qbs);
4313 Qeqbd = Dtype*(mi.
qbd);
4316 Qeqgb = Dtype*(mi.
qgb);
4317 Qeqgs = Dtype*(mi.
qgs);
4318 Qeqgd = Dtype*(mi.
qgd);
4320 coef = (Qeqgs+Qeqgd+Qeqgb);
4323 coef = Qeqbs + Qeqbd - Qeqgb;
4326 coef = -(Qeqbd + Qeqgd);
4329 coef = -(Qeqbs + Qeqgs);
4337 double coef_Jdxp4 = Dtype*(
4341 double coef_Jdxp5 = Dtype*(
4347 double coef_Jdxp6 = Dtype*(
4362 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
4374 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
4381 double coef_Jdxp4 = Dtype*(
4386 double coef_Jdxp5 = Dtype*(
4391 double coef_Jdxp6 = Dtype*
4432 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
4450 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4451 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4452 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4453 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4454 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4492 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4493 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4494 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4496 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4499 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4502 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4525 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4557 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4590 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
4734 int sizeInstances = instanceContainer_.size();
4735 for (
int i=0; i<sizeInstances; ++i)
4737 Instance & mi = *(instanceContainer_.at(i));
4742 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4743 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4744 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4745 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4746 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4785 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4786 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4787 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4789 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4792 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4795 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4818 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4850 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4883 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
5027 .registerDevice(
"m", 1)
5028 .registerModelType(
"pmos", 1)
5029 .registerModelType(
"nmos", 1);