45 #include <Xyce_config.h>
47 #include <N_UTL_Math.h>
57 #include <N_ERH_ErrorMgr.h>
58 #include <N_LAS_Matrix.h>
59 #include <N_LAS_Vector.h>
60 #include <N_UTL_FeatureTest.h>
73 .setDescription(
"Device temperature");
76 .setOriginalValueStored(
true)
79 .setDescription(
"Channel length");
82 .setOriginalValueStored(
true)
85 .setDescription(
"Channel width");
90 .setDescription(
"Drain diffusion area");
95 .setDescription(
"Source diffusion area");
100 .setDescription(
"Multiplier for RSH to yield parasitic resistance of drain");
105 .setDescription(
"Multiplier for RSH to yield parasitic resistance of source");
110 .setDescription(
"Drain diffusion perimeter");
115 .setDescription(
"Source diffusion perimeter");
120 .setDescription(
"Multiplier for M devices connected in parallel");
127 .setDescription(
"Initial condition on Drain-Source voltage");
133 .setDescription(
"Initial condition on Gate-Source voltage");
139 .setDescription(
"Initial condition on Bulk-Source voltage");
147 .setDescription(
"Initial condition of no voltage drops across device");
156 .setDescription(
"Default channel length");
161 .setDescription(
"Default channel width");
166 .setDescription(
"Zero-bias threshold voltage");
171 .setDescription(
"Transconductance coefficient");
176 .setDescription(
"Bulk threshold parameter");
181 .setDescription(
"Surface potential");
186 .setDescription(
"Channel-length modulation");
192 .setDescription(
"Drain ohmic resistance");
198 .setDescription(
"Source ohmic resistance");
205 .setDescription(
"Zero-bias bulk-drain p-n capacitance");
212 .setDescription(
"Zero-bias bulk-source p-n capacitance");
217 .setDescription(
"Bulk p-n saturation current");
222 .setDescription(
"Bulk p-n bottom potential");
227 .setDescription(
"Gate-source overlap capacitance/channel width");
232 .setDescription(
"Gate-drain overlap capacitance/channel width");
237 .setDescription(
"Gate-bulk overlap capacitance/channel length");
242 .setDescription(
"Drain,source diffusion sheet resistance");
248 .setDescription(
"Bulk p-n zero-bias bottom capacitance/area");
253 .setDescription(
"Bulk p-n bottom grading coefficient");
259 .setDescription(
"Bulk p-n zero-bias sidewall capacitance/area");
264 .setDescription(
"Bulk p-n sidewall grading coefficient");
269 .setDescription(
"Bulk p-n saturation current density");
272 .setOriginalValueStored(
true)
275 .setDescription(
"Gate oxide thickness");
280 .setDescription(
"Lateral diffusion length");
285 .setDescription(
"Surface mobility");
290 .setDescription(
"Surface mobility");
295 .setDescription(
"Bulk p-n forward-bias capacitance coefficient");
300 .setDescription(
"Substrate doping density");
305 .setDescription(
"Surface state density");
310 .setDescription(
"Parameter measurement temperature");
315 .setDescription(
"Flicker noise coefficient");
320 .setDescription(
"Flicker noise exponent");
326 .setDescription(
"Gate material type (-1 = same as substrate) 0 = aluminum,1 = opposite of substrate)");
376 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
384 l(getDeviceOptions().defl),
385 w(getDeviceOptions().defw),
387 drainArea(getDeviceOptions().defad),
388 sourceArea(getDeviceOptions().defas),
392 sourcePerimeter(0.0),
393 sourceConductance(0.0),
394 drainConductance(0.0),
395 temp(getDeviceOptions().temp.getImmutableValue<double>()),
397 tTransconductance(0.0),
448 GateSourceOverlapCap(0),
449 GateDrainOverlapCap(0),
450 GateBulkOverlapCap(0),
463 li_DrainPrimedot(-1),
465 li_SourcePrimedot(-1),
479 ADrainEquDrainNodeOffset(-1),
480 ADrainEquDrainPrimeNodeOffset(-1),
482 AGateEquGateNodeOffset(-1),
483 AGateEquBulkNodeOffset(-1),
484 AGateEquDrainPrimeNodeOffset(-1),
485 AGateEquSourcePrimeNodeOffset(-1),
487 AGateEquVGatedotNodeOffset(-1),
488 AGateEquVBulkdotNodeOffset(-1),
489 AGateEquVDrainPrimedotNodeOffset(-1),
490 AGateEquVSourcePrimedotNodeOffset(-1),
492 ASourceEquSourceNodeOffset(-1),
493 ASourceEquSourcePrimeNodeOffset(-1),
495 ABulkEquGateNodeOffset(-1),
496 ABulkEquBulkNodeOffset(-1),
497 ABulkEquDrainPrimeNodeOffset(-1),
498 ABulkEquSourcePrimeNodeOffset(-1),
500 ABulkEquVGatedotNodeOffset(-1),
501 ABulkEquVBulkdotNodeOffset(-1),
502 ABulkEquVDrainPrimedotNodeOffset(-1),
503 ABulkEquVSourcePrimedotNodeOffset(-1),
505 ADrainPrimeEquDrainNodeOffset(-1),
506 ADrainPrimeEquGateNodeOffset(-1),
507 ADrainPrimeEquBulkNodeOffset(-1),
508 ADrainPrimeEquDrainPrimeNodeOffset(-1),
509 ADrainPrimeEquSourcePrimeNodeOffset(-1),
511 ADrainPrimeEquVGatedotNodeOffset(-1),
512 ADrainPrimeEquVBulkdotNodeOffset(-1),
513 ADrainPrimeEquVDrainPrimedotNodeOffset(-1),
515 ASourcePrimeEquGateNodeOffset(-1),
516 ASourcePrimeEquSourceNodeOffset(-1),
517 ASourcePrimeEquBulkNodeOffset(-1),
518 ASourcePrimeEquDrainPrimeNodeOffset(-1),
519 ASourcePrimeEquSourcePrimeNodeOffset(-1),
521 ASourcePrimeEquVGatedotNodeOffset(-1),
522 ASourcePrimeEquVBulkdotNodeOffset(-1),
523 ASourcePrimeEquVSourcePrimedotNodeOffset(-1),
525 ADraindotEquVDrainNodeOffset(-1),
526 ADraindotEquVDraindotNodeOffset(-1),
527 AGatedotEquVGateNodeOffset(-1),
528 AGatedotEquVGatedotNodeOffset(-1),
529 ASourcedotEquVSourceNodeOffset(-1),
530 ASourcedotEquVSourcedotNodeOffset(-1),
531 ABulkdotEquVBulkNodeOffset(-1),
532 ABulkdotEquVBulkdotNodeOffset(-1),
533 ADrainPrimedotEquVDrainPrimeNodeOffset(-1),
534 ADrainPrimedotEquVDrainPrimedotNodeOffset(-1),
540 f_DrainEquDrainNodePtr(0),
541 f_DrainEquDrainPrimeNodePtr(0),
544 f_GateEquGateNodePtr(0),
545 f_GateEquBulkNodePtr(0),
546 f_GateEquDrainPrimeNodePtr(0),
547 f_GateEquSourcePrimeNodePtr(0),
549 f_GateEquVGatedotNodePtr(0),
550 f_GateEquVBulkdotNodePtr(0),
551 f_GateEquVDrainPrimedotNodePtr(0),
552 f_GateEquVSourcePrimedotNodePtr(0),
555 f_SourceEquSourceNodePtr(0),
556 f_SourceEquSourcePrimeNodePtr(0),
559 f_BulkEquGateNodePtr(0),
560 f_BulkEquBulkNodePtr(0),
561 f_BulkEquDrainPrimeNodePtr(0),
562 f_BulkEquSourcePrimeNodePtr(0),
564 f_BulkEquVGatedotNodePtr(0),
565 f_BulkEquVBulkdotNodePtr(0),
566 f_BulkEquVDrainPrimedotNodePtr(0),
567 f_BulkEquVSourcePrimedotNodePtr(0),
570 f_DrainPrimeEquDrainNodePtr(0),
571 f_DrainPrimeEquGateNodePtr(0),
572 f_DrainPrimeEquBulkNodePtr(0),
573 f_DrainPrimeEquDrainPrimeNodePtr(0),
574 f_DrainPrimeEquSourcePrimeNodePtr(0),
576 f_DrainPrimeEquVGatedotNodePtr(0),
577 f_DrainPrimeEquVBulkdotNodePtr(0),
578 f_DrainPrimeEquVDrainPrimedotNodePtr(0),
581 f_SourcePrimeEquGateNodePtr(0),
582 f_SourcePrimeEquSourceNodePtr(0),
583 f_SourcePrimeEquBulkNodePtr(0),
584 f_SourcePrimeEquDrainPrimeNodePtr(0),
585 f_SourcePrimeEquSourcePrimeNodePtr(0),
587 f_SourcePrimeEquVGatedotNodePtr(0),
588 f_SourcePrimeEquVBulkdotNodePtr(0),
589 f_SourcePrimeEquVSourcePrimedotNodePtr(0),
592 f_DraindotEquVDrainNodePtr(0),
593 f_DraindotEquVDraindotNodePtr(0),
594 f_GatedotEquVGateNodePtr(0),
595 f_GatedotEquVGatedotNodePtr(0),
596 f_SourcedotEquVSourceNodePtr(0),
597 f_SourcedotEquVSourcedotNodePtr(0),
598 f_BulkdotEquVBulkNodePtr(0),
599 f_BulkdotEquVBulkdotNodePtr(0),
600 f_DrainPrimedotEquVDrainPrimeNodePtr(0),
601 f_DrainPrimedotEquVDrainPrimedotNodePtr(0),
602 f_SourcePrimedotEquVSourcePrimeNodePtr(0),
603 f_SourcePrimedotEquVSourcePrimedotNodePtr(0),
607 q_DrainEquDrainNodePtr(0),
608 q_DrainEquDrainPrimeNodePtr(0),
611 q_GateEquGateNodePtr(0),
612 q_GateEquBulkNodePtr(0),
613 q_GateEquDrainPrimeNodePtr(0),
614 q_GateEquSourcePrimeNodePtr(0),
616 q_GateEquVGatedotNodePtr(0),
617 q_GateEquVBulkdotNodePtr(0),
618 q_GateEquVDrainPrimedotNodePtr(0),
619 q_GateEquVSourcePrimedotNodePtr(0),
622 q_SourceEquSourceNodePtr(0),
623 q_SourceEquSourcePrimeNodePtr(0),
626 q_BulkEquGateNodePtr(0),
627 q_BulkEquBulkNodePtr(0),
628 q_BulkEquDrainPrimeNodePtr(0),
629 q_BulkEquSourcePrimeNodePtr(0),
631 q_BulkEquVGatedotNodePtr(0),
632 q_BulkEquVBulkdotNodePtr(0),
633 q_BulkEquVDrainPrimedotNodePtr(0),
634 q_BulkEquVSourcePrimedotNodePtr(0),
637 q_DrainPrimeEquDrainNodePtr(0),
638 q_DrainPrimeEquGateNodePtr(0),
639 q_DrainPrimeEquBulkNodePtr(0),
640 q_DrainPrimeEquDrainPrimeNodePtr(0),
641 q_DrainPrimeEquSourcePrimeNodePtr(0),
643 q_DrainPrimeEquVGatedotNodePtr(0),
644 q_DrainPrimeEquVBulkdotNodePtr(0),
645 q_DrainPrimeEquVDrainPrimedotNodePtr(0),
648 q_SourcePrimeEquGateNodePtr(0),
649 q_SourcePrimeEquSourceNodePtr(0),
650 q_SourcePrimeEquBulkNodePtr(0),
651 q_SourcePrimeEquDrainPrimeNodePtr(0),
652 q_SourcePrimeEquSourcePrimeNodePtr(0),
654 q_SourcePrimeEquVGatedotNodePtr(0),
655 q_SourcePrimeEquVBulkdotNodePtr(0),
656 q_SourcePrimeEquVSourcePrimedotNodePtr(0),
659 q_DraindotEquVDrainNodePtr(0),
660 q_DraindotEquVDraindotNodePtr(0),
661 q_GatedotEquVGateNodePtr(0),
662 q_GatedotEquVGatedotNodePtr(0),
663 q_SourcedotEquVSourceNodePtr(0),
664 q_SourcedotEquVSourcedotNodePtr(0),
665 q_BulkdotEquVBulkNodePtr(0),
666 q_BulkdotEquVBulkdotNodePtr(0),
667 q_DrainPrimedotEquVDrainPrimeNodePtr(0),
668 q_DrainPrimedotEquVDrainPrimedotNodePtr(0),
669 q_SourcePrimedotEquVSourcePrimeNodePtr(0),
670 q_SourcePrimedotEquVSourcePrimedotNodePtr(0),
820 for (
int i=0; i < 12; i++)
885 for (
int i=0; i < 5; i++)
938 for (
int i=6; i < 12; i++)
941 for (
int j=0; j < 2; j++)
1004 for (
int i=0; i < 4; i++)
1058 for (
int i=6; i < 12; i++)
1061 for (
int j=0; j < 2; j++)
1117 for (
int i=0; i < 4; i++)
1171 for (
int i=6; i < 12; i++)
1174 for (
int j=0; j < 2; j++)
1298 UserError0(*
this) <<
"Effective channel length less than zero.";
1341 const std::vector<int> & extLIDVecRef )
1357 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1359 Xyce::dout() << section_divider << std::endl;
1360 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1361 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1362 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1363 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1410 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1412 Xyce::dout() <<
"\n variable local indices:\n";
1413 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1414 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1415 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1416 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1417 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1418 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1420 Xyce::dout() <<
" li_Draindot = " <<
li_Draindot << std::endl;
1421 Xyce::dout() <<
" li_Gatedot = " <<
li_Gatedot << std::endl;
1422 Xyce::dout() <<
" li_Sourcedot = " <<
li_Sourcedot << std::endl;
1423 Xyce::dout() <<
" li_Bulkdot = " <<
li_Bulkdot << std::endl;
1427 Xyce::dout() << section_divider << std::endl;
1484 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1486 Xyce::dout() << std::endl;
1487 Xyce::dout() << section_divider << std::endl;
1488 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1489 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1490 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1510 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1512 Xyce::dout() <<
" State local indices:" << std::endl;
1513 Xyce::dout() << std::endl;
1523 Xyce::dout() << std::endl;
1524 Xyce::dout() << section_divider << std::endl;
1592 std::vector<int> map;
1593 std::vector< std::vector<int> > map2;
1702 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1913 double Qeqbs,Qeqbd,Qeqgb, Qeqgs, Qeqgd;
1924 Qeqbs = Dtype*(
qbs);
1925 Qeqbd = Dtype*(
qbd);
1928 Qeqgb = Dtype*(
qgb);
1929 Qeqgs = Dtype*(
qgs);
1930 Qeqgd = Dtype*(
qgd);
1933 coef = (Qeqgs+Qeqgd+Qeqgb);
1937 coef = Qeqbs + Qeqbd - Qeqgb;
1941 coef = -(Qeqbd + Qeqgd);
1945 coef = -(Qeqbs + Qeqgs);
1958 double gcgd, gcgs, gcgb, gcbs, gcbd;
1970 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1978 double coef_Jdxp4 = Dtype*(
1984 double coef_Jdxp5 = Dtype*(
2086 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
2108 ceqgb = Dtype*(
Capgb*vgbdot);
2109 ceqgs = Dtype*(
Capgs*vgsdot);
2110 ceqgd = Dtype*(
Capgd*vgddot);
2114 ceqbs = Dtype*(
cbs);
2115 ceqbd = Dtype*(
cbd);
2127 ceqbs = Dtype*(
cbs);
2128 ceqbd = Dtype*(
cbd);
2145 coef = (ceqgs+ceqgd+ceqgb);
2156 coef = ceqbs + ceqbd - ceqgb;
2195 double coef_Jdxp4 = Dtype*(
2200 double coef_Jdxp5 = Dtype*(
2207 double coef_Jdxp6 = Dtype*(
2326 (+gcbs+gcbd+gcgb)*numberParallel;
2336 (+gcbd+gcgd)*numberParallel;
2343 (+gcbs+gcgs)*numberParallel;
2410 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
2411 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
2412 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
2413 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
2414 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
2450 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
2451 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
2452 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*
numberParallel;
2454 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
2455 l_dcapgddvgd*l_vgddot)*numberParallel;
2457 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
2458 l_dcapgddvgs*l_vgddot)*numberParallel;
2460 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
2461 l_dcapgddvgb*l_vgddot)*numberParallel;
2464 (l_capgs + l_capgd + l_capgb)*numberParallel;
2481 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*numberParallel;
2483 (
gbs+
gbd+l_dcapgbdvgb*l_vgbdot)*numberParallel;
2485 (
gbd-l_dcapgbdvgd*l_vgbdot)*numberParallel;
2487 (
gbs-l_dcapgbdvgs*l_vgbdot )*numberParallel;
2493 (l_capbs+l_capgb+l_capbd)*numberParallel;
2502 (
gbs+
gbd)*numberParallel;
2515 (-
gbd+
Gmbs+l_dcapgddvgb*l_vgddot)*numberParallel;
2519 (-
gds-
nrmsum+l_dcapgddvgs*l_vgddot)*numberParallel;
2527 (l_capgd+l_capbd)*numberParallel;
2534 (
Gm)*numberParallel;
2550 (
gbs+
Gmbs-l_dcapgsdvgb*l_vgsdot)*numberParallel;
2552 (
gds+
revsum-l_dcapgsdvgd*l_vgsdot)*numberParallel;
2562 += (l_capgs+l_capbs)*numberParallel;
2567 (
Gm)*numberParallel;
2610 bool bsuccess =
true;
2720 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2891 Xyce::dout() <<
"HOMOTOPY INFO: Von = " << Von <<std::endl;
2892 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
2894 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " << vds << std::endl;
2895 Xyce::dout() <<
"HOMOTOPY INFO: before vgs = " <<
vgs << std::endl;
2935 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2937 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << vds << std::endl;
2938 Xyce::dout() <<
"HOMOTOPY INFO: after vgs = " <<
vgs << std::endl;
2942 if ((
mode==1?vbs:
vbd) <= 0 ) {
2946 sarg=sarg-(
mode==1?vbs:
vbd)/(sarg+sarg);
2947 sarg=std::max(0.0,sarg);
2951 Vdsat=std::max(vgst,0.0);
2974 if (vgst <= (vds*
mode))
2976 cdrain=betap*vgst*vgst*.5;
2989 (vgst-.5*(vds*mode));
2994 (vgst-.5*(vds*mode));
3051 sarg = sargsw = 1/sqrt(arg);
3070 sargsw = 1/sqrt(arg);
3110 sarg = sargsw = 1/sqrt(arg);
3124 sargsw = 1/sqrt(arg);
3258 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3259 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3260 Xyce::dout() <<
" capgd = " <<
capgd <<
" capgd_old = " << capgd_old << std::endl;
3261 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3272 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3273 Xyce::dout() <<
"Capgd = " <<
Capgd << std::endl;
3274 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3275 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3276 Xyce::dout() <<
"capgd = " <<
capgd << std::endl;
3277 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3429 double ratio,ratio4;
3437 double gmanew,gmaold;
3442 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3444 Xyce::dout() << subsection_divider << std::endl;
3445 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3446 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3447 Xyce::dout() << std::endl;
3451 if (temp_tmp != -999.0)
temp = temp_tmp;
3461 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3463 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
3464 Xyce::dout() <<
"tnom = " << tnom << std::endl;
3465 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3474 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3478 Xyce::dout() <<
"vt = " <<
vt << std::endl;
3479 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3480 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
3481 Xyce::dout() <<
"kt = " << kt << std::endl;
3482 Xyce::dout() <<
"egfet = " << egfet << std::endl;
3483 Xyce::dout() <<
"arg = " << arg << std::endl;
3484 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
3496 ratio4 = ratio * sqrt(ratio);
3500 tPhi = fact2 * phio + pbfact;
3529 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3531 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3532 Xyce::dout() <<
" phio = " << phio << std::endl;
3533 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3534 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3535 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3536 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3537 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3538 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3539 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3540 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3541 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3542 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3543 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3544 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3545 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3546 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3547 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3548 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3670 double vgs1, vgd1, vbs1,vgb1, vds1;
3773 noiseData.
resize(numSources);
3784 std::string(
"_1overf");
3818 double coxSquared=0.0;
3821 coxSquared = 3.9 * 8.854214871e-12 / 1e-7;
3827 coxSquared *= coxSquared;
3845 (2.0/3.0 * fabs(
gm)),
temp);
3880 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
3913 wkfng = 3.25 + .5 *
egfet1 - fermig;
3915 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
3918 gamma = sqrt(2 * 11.70 * 8.854214871e-12 *
3951 std::vector<Instance*>::iterator iter;
3955 for (iter=first; iter!=last; ++iter)
3957 (*iter)->processParams();
3975 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
3977 tnom(getDeviceOptions().tnom),
3979 jctSatCurDensity(0.0),
3981 drainResistance(0.0),
3982 sourceResistance(0.0),
3983 sheetResistance(0.0),
3984 transconductance(0.0),
3985 gateSourceOverlapCapFactor(0.0),
3986 gateDrainOverlapCapFactor(0.0),
3987 gateBulkOverlapCapFactor(0.0),
3988 oxideCapFactor(0.0),
3993 sideWallCapFactor(0.0),
3994 bulkJctPotential(0.0),
3995 bulkJctBotGradingCoeff(0.0),
3996 bulkJctSideGradingCoeff(0.0),
3997 fwdCapDepCoeff(0.0),
4001 substrateDoping(0.0),
4003 surfaceStateDensity(0.0),
4004 oxideThickness(0.0),
4005 surfaceMobility(0.0),
4010 bulkCapFactorGiven(0),
4011 sideWallCapFactorGiven(0)
4018 else if (
getType() ==
"PMOS") {
4053 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
4055 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
4073 std::vector<Instance*>::iterator iter;
4077 for (iter=first; iter!=last; ++iter)
4094 std::vector<Instance*>::const_iterator iter;
4100 os <<
" name model name Parameters" << std::endl;
4101 for (i=0, iter=first; iter!=last; ++iter, ++i)
4103 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
4128 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
4162 (*maskVectorPtr)[
li_Gate] = 0.0;
4163 (*maskVectorPtr)[
li_Bulk] = 0.0;
4181 bool bsuccess =
true;
4190 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
4193 bsuccess = bsuccess && btmp;
4278 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
4286 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
4287 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
4301 ceqbs = Dtype*(mi.
cbs+mi.
capbs*vbsdot);
4302 ceqbd = Dtype*(mi.
cbd+mi.
capbd*vbddot);
4303 ceqgb = Dtype*(mi.
Capgb*vgbdot);
4304 ceqgs = Dtype*(mi.
Capgs*vgsdot);
4305 ceqgd = Dtype*(mi.
Capgd*vgddot);
4309 ceqbs = Dtype*(mi.
cbs);
4310 ceqbd = Dtype*(mi.
cbd);
4321 ceqbs = Dtype*(mi.
cbs);
4322 ceqbd = Dtype*(mi.
cbd);
4335 coef = (ceqgs+ceqgd+ceqgb);
4341 coef = ceqbs + ceqbd - ceqgb;
4388 Qeqbs = Dtype*(mi.
qbs);
4389 Qeqbd = Dtype*(mi.
qbd);
4392 Qeqgb = Dtype*(mi.
qgb);
4393 Qeqgs = Dtype*(mi.
qgs);
4394 Qeqgd = Dtype*(mi.
qgd);
4396 coef = (Qeqgs+Qeqgd+Qeqgb);
4399 coef = Qeqbs + Qeqbd - Qeqgb;
4402 coef = -(Qeqbd + Qeqgd);
4405 coef = -(Qeqbs + Qeqgs);
4413 double coef_Jdxp4 = Dtype*(
4417 double coef_Jdxp5 = Dtype*(
4423 double coef_Jdxp6 = Dtype*(
4438 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
4450 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
4457 double coef_Jdxp4 = Dtype*(
4462 double coef_Jdxp5 = Dtype*(
4467 double coef_Jdxp6 = Dtype*
4508 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
4526 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4527 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4528 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4529 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4530 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4568 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4569 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4570 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4572 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4575 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4578 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4601 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4633 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4666 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
4810 int sizeInstances = instanceContainer_.size();
4811 for (
int i=0; i<sizeInstances; ++i)
4813 Instance & mi = *(instanceContainer_.at(i));
4818 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4819 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4820 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4821 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4822 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4861 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4862 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4863 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4865 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4868 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4871 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4894 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4926 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4959 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
5103 .registerDevice(
"m", 1)
5104 .registerModelType(
"pmos", 1)
5105 .registerModelType(
"nmos", 1);
const InstanceName & getName() const
static std::vector< int > jacMap_SC
double * f_GateEquGateNodePtr
int ADrainPrimeEquGateNodeOffset
int ABulkEquBulkNodeOffset
double * f_SourceEquSourceNodePtr
static void loadModelParameters(ParametricData< Model > &model_parameters)
double * q_SourcePrimeEquSourceNodePtr
double * f_BulkEquGateNodePtr
static void initThermalModel(ParametricData< T > ¶metric_data)
Add the parameter "TEMPMODEL" to the parametric_data.
double * currStoVectorRawPtr
double * f_DrainPrimedotEquVDrainPrimedotNodePtr
int AGateEquDrainPrimeNodeOffset
int ASourcePrimeEquVSourcePrimedotNodeOffset
double * f_GateEquVDrainPrimedotNodePtr
bool updateDependentParameters()
double * q_BulkEquVGatedotNodePtr
int AGateEquVGatedotNodeOffset
static std::vector< std::vector< int > > jacStamp_DC_SC
double * q_GateEquVGatedotNodePtr
const std::vector< std::vector< int > > & jacobianStamp() const
int AGateEquVDrainPrimedotNodeOffset
double * f_SourcePrimeEquBulkNodePtr
void setupNoiseSources(Xyce::Analysis::NoiseData &noiseData)
const DeviceOptions & deviceOptions_
double * f_SourcePrimeEquVSourcePrimedotNodePtr
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
int ASourcePrimeEquDrainPrimeNodeOffset
int AGatedotEquVGatedotNodeOffset
double * q_DrainPrimeEquVDrainPrimedotNodePtr
double * daeQVectorRawPtr
int ASourcedotEquVSourceNodeOffset
int AGateEquGateNodeOffset
double * q_DrainPrimeEquSourcePrimeNodePtr
double * q_DrainPrimeEquGateNodePtr
double * dFdxdVpVectorRawPtr
double * f_SourcedotEquVSourcedotNodePtr
Linear::Vector * nextSolVectorPtr
int ABulkEquSourcePrimeNodeOffset
virtual std::ostream & printOutInstances(std::ostream &os) const
double pnjlim(double vnew, double vold, double vt, double vcrit, int *icheck)
std::vector< int > devConMap
bool updateTemperature(const double &temp_tmp)
int ADrainPrimeEquDrainNodeOffset
void qmeyer(double vgs, double vgd, double vgb, double von, double vdsat, double &capgs, double &capgd, double &capgb, double phi, double cox)
double * f_SourcePrimeEquVGatedotNodePtr
int ADraindotEquVDraindotNodeOffset
bool given(const std::string ¶meter_name) const
Pure virtual class to augment a linear system.
Parameter may be specified as time dependent expression from netlist.
double * q_DrainPrimeEquDrainPrimeNodePtr
double * f_GateEquVSourcePrimedotNodePtr
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * f_BulkEquVGatedotNodePtr
int AGateEquVSourcePrimedotNodeOffset
const std::string & getEncodedName() const
Return the instance name encoded as: [s:]*xname [s:]*Ytype!name [s:]*Utype!name!count.
double * currStaVectorRawPtr
int ADrainEquDrainNodeOffset
double * q_DrainEquDrainPrimeNodePtr
double * q_GateEquVBulkdotNodePtr
double * f_BulkEquSourcePrimeNodePtr
int ABulkdotEquVBulkdotNodeOffset
void setNumStoreVars(int num_store_vars)
bool sideWallCapFactorGiven
double * q_SourcedotEquVSourceNodePtr
double * q_BulkdotEquVBulkNodePtr
double getRandomPerturbation()
double * f_SourcePrimedotEquVSourcePrimeNodePtr
static std::vector< std::vector< int > > jacMap2_SC
std::vector< double > gainScale
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
void makeVector(const std::string &cname, int len)
Allows the parameter to be specified as a vector.
std::vector< int > li_Neg
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
std::vector< int > li_Pos
double * q_BulkEquDrainPrimeNodePtr
Parameter is subject to being set to minimum junction capacitance.
int ADrainPrimeEquVDrainPrimedotNodeOffset
int ABulkdotEquVBulkNodeOffset
bool processInstanceParams()
processInstanceParams
double * q_BulkEquSourcePrimeNodePtr
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
Parameter is subject to being set to minimum lead resistance.
int ABulkEquVSourcePrimedotNodeOffset
bool updateIntermediateVars()
int ABulkEquVBulkdotNodeOffset
double * q_DrainEquDrainNodePtr
static std::vector< std::vector< int > > jacStamp_SC
double fetlim(double vnew, double vold, double vto)
double * f_GateEquBulkNodePtr
double * q_BulkEquBulkNodePtr
double gateDrainOverlapCapFactor
double * f_DraindotEquVDraindotNodePtr
double * f_DrainPrimeEquDrainPrimeNodePtr
virtual bool loadDAEVectors(double *solVec, double *fVec, double *qVec, double *bVec, double *storeLeadF, double *storeLeadQ, double *leadF, double *leadQ, double *junctionV)
Populates the device's ExternData object with these pointers.
double * q_GatedotEquVGateNodePtr
int ADrainPrimeEquBulkNodeOffset
int ADrainPrimeEquVBulkdotNodeOffset
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
double * storeLeadCurrQCompRawPtr
int ASourcePrimeEquBulkNodeOffset
bool processParams()
processParams
int getNumStoreVars() const
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
double contVgst(double vgst, double alpha, double vgstConst=3.0)
std::vector< Param > params
Parameters from the line.
double * f_DrainEquDrainPrimeNodePtr
std::vector< double > noiseDens
double * f_GatedotEquVGatedotNodePtr
bool updatePrimaryState()
double * f_DrainPrimeEquVGatedotNodePtr
static std::vector< std::vector< int > > jacMap2_DC_SC
double * f_BulkdotEquVBulkNodePtr
double * q_SourcePrimedotEquVSourcePrimeNodePtr
std::vector< std::string > noiseNames
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
std::vector< Instance * > instanceContainer
double * daeFVectorRawPtr
double * q_SourcePrimeEquGateNodePtr
double * q_BulkEquVDrainPrimedotNodePtr
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
int ADrainEquDrainPrimeNodeOffset
double * q_DrainPrimedotEquVDrainPrimedotNodePtr
double GateSourceOverlapCap
void getNoiseSources(Xyce::Analysis::NoiseData &noiseData)
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
double * f_DrainPrimeEquVDrainPrimedotNodePtr
double * q_SourceEquSourcePrimeNodePtr
double * q_SourcePrimeEquBulkNodePtr
double * q_GateEquVSourcePrimedotNodePtr
double * f_DraindotEquVDrainNodePtr
const DeviceOptions & getDeviceOptions() const
double * q_GateEquVDrainPrimedotNodePtr
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
int ASourcePrimeEquVGatedotNodeOffset
double * nextStoVectorRawPtr
int AGateEquVBulkdotNodeOffset
double * q_DrainPrimeEquBulkNodePtr
int ASourcePrimeEquGateNodeOffset
double * f_GateEquVBulkdotNodePtr
double * f_BulkEquVBulkdotNodePtr
int ADrainPrimeEquVGatedotNodeOffset
double * q_DraindotEquVDrainNodePtr
int ABulkEquDrainPrimeNodeOffset
int getNumNoiseSources() const
double * f_GateEquVGatedotNodePtr
void qmeyerderivs(double vgs, double vgd, double vgb, double von, double vdsat, double &dcapgsdvgs, double &dcapgsdvgb, double &dcapgsdvgd, double &dcapgddvgs, double &dcapgddvgb, double &dcapgddvgd, double &dcapgbdvgs, double &dcapgbdvgb, double &dcapgbdvgd, double phi, double cox, int Dtype)
int ABulkEquVGatedotNodeOffset
Linear::Vector * deviceErrorWeightMask_
double limvds(double vnew, double vold)
static std::vector< int > jacMap
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
int ASourcePrimeEquSourcePrimeNodeOffset
double * f_SourceEquSourcePrimeNodePtr
int ASourcePrimeEquVBulkdotNodeOffset
Linear::Matrix * dFdxMatrixPtr
const DeviceOptions & getDeviceOptions() const
Returns the device options given during device construction.
int ABulkEquGateNodeOffset
int ADrainPrimedotEquVDrainPrimedotNodeOffset
double * q_DrainPrimeEquDrainNodePtr
double * q_BulkEquVBulkdotNodePtr
int ADraindotEquVDrainNodeOffset
double * f_DrainPrimeEquGateNodePtr
The Device class is an interface for device implementations.
int AGateEquBulkNodeOffset
double * q_DrainPrimedotEquVDrainPrimeNodePtr
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * f_SourcePrimeEquDrainPrimeNodePtr
const SolverState & solverState_
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
double * q_BulkEquGateNodePtr
int getGainScaleBlockID(int numBlocks)
double * dQdxdVpVectorRawPtr
Class Configuration contains device configuration data.
int ASourceEquSourcePrimeNodeOffset
int AGatedotEquVGateNodeOffset
std::vector< double > lnNoiseDens
int ADrainPrimedotEquVDrainPrimeNodeOffset
static std::vector< std::vector< int > > jacStamp
bool interpolateTNOM(double)
double * q_GateEquSourcePrimeNodePtr
double * f_SourcePrimeEquSourceNodePtr
static std::vector< int > jacMap_DC_SC
double * q_GateEquBulkNodePtr
double surfaceStateDensity
void jacStampMap(const JacobianStamp &stamp_parent, IdVector &map_parent, JacobianStamp &map2_parent, JacobianStamp &stamp, IdVector &map, JacobianStamp &map2, int from, int to, int original_size)
double bulkJctSideGradingCoeff
double * q_SourcePrimeEquVGatedotNodePtr
double * f_BulkEquBulkNodePtr
double bulkJctBotGradingCoeff
const SolverState & getSolverState() const
double * f_SourcedotEquVSourceNodePtr
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
Linear::Vector * nextStoVectorPtr
int ASourceEquSourceNodeOffset
Linear::Vector * currStaVectorPtr
static std::vector< std::vector< int > > jacMap2_DC
double * nextStaVectorRawPtr
#define Xyce_NONPOINTER_MATRIX_LOAD
double * f_GateEquSourcePrimeNodePtr
double * f_BulkEquVSourcePrimedotNodePtr
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
double * f_BulkEquDrainPrimeNodePtr
void noiseSupport(double &noise, double &lnNoise, const int type, const double param, const double temp)
int ABulkEquVDrainPrimedotNodeOffset
double * q_SourcePrimedotEquVSourcePrimedotNodePtr
double * f_GateEquDrainPrimeNodePtr
double * q_BulkdotEquVBulkdotNodePtr
const std::string & getType() const
double contVds(double vds, double alpha, double min=0.3)
double * q_GatedotEquVGatedotNodePtr
static std::vector< int > jacMap_DC
double * f_DrainPrimeEquSourcePrimeNodePtr
double * q_SourceEquSourceNodePtr
double * q_DrainPrimeEquVGatedotNodePtr
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
double * f_BulkEquVDrainPrimedotNodePtr
Linear::Vector * currStoVectorPtr
double * q_GateEquDrainPrimeNodePtr
double * f_GatedotEquVGateNodePtr
const ExternData & extData
double * f_DrainPrimedotEquVDrainPrimeNodePtr
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
double * f_SourcePrimeEquSourcePrimeNodePtr
ModelBlock represents a .MODEL line from the netlist.
double * q_SourcePrimeEquDrainPrimeNodePtr
double * f_DrainPrimeEquBulkNodePtr
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
double * f_SourcePrimedotEquVSourcePrimedotNodePtr
int AGateEquSourcePrimeNodeOffset
int ASourcePrimeEquSourceNodeOffset
std::vector< Param > params
double * q_SourcePrimeEquVSourcePrimedotNodePtr
double * q_GateEquGateNodePtr
double * f_DrainPrimeEquVBulkdotNodePtr
Linear::Matrix * dQdxMatrixPtr
void loadErrorWeightMask()
int ADrainPrimeEquSourcePrimeNodeOffset
double * q_DraindotEquVDraindotNodePtr
double gateBulkOverlapCapFactor
int ASourcePrimedotEquVSourcePrimeNodeOffset
static std::vector< std::vector< int > > jacMap2
static std::vector< std::vector< int > > jacStamp_DC
double * q_SourcePrimeEquSourcePrimeNodePtr
double * f_BulkdotEquVBulkdotNodePtr
int ASourcePrimedotEquVSourcePrimedotNodeOffset
double * q_BulkEquVSourcePrimedotNodePtr
double * q_DrainPrimeEquVBulkdotNodePtr
Linear::Vector * flagSolVectorPtr
double * q_SourcePrimeEquVBulkdotNodePtr
double * f_DrainEquDrainNodePtr
int ASourcedotEquVSourcedotNodeOffset
double * f_SourcePrimeEquVBulkdotNodePtr
double * f_SourcePrimeEquGateNodePtr
const SolverState & getSolverState() const
Returns the solver state given during device construction.
double * f_DrainPrimeEquDrainNodePtr
double * q_SourcedotEquVSourcedotNodePtr
void setModParams(const std::vector< Param > ¶ms)
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
int ADrainPrimeEquDrainPrimeNodeOffset
double gateSourceOverlapCapFactor
double GateDrainOverlapCap
int numLeadCurrentStoreVars
double GateBulkOverlapCap