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)");
421 UserError0(*
this) <<
"Effective channel length less than zero.";
446 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
454 l(getDeviceOptions().defl),
455 w(getDeviceOptions().defw),
457 drainArea(getDeviceOptions().defad),
458 sourceArea(getDeviceOptions().defas),
462 sourcePerimeter(0.0),
463 sourceConductance(0.0),
464 drainConductance(0.0),
465 temp(getDeviceOptions().temp.getImmutableValue<double>()),
467 tTransconductance(0.0),
518 GateSourceOverlapCap(0),
519 GateDrainOverlapCap(0),
520 GateBulkOverlapCap(0),
533 li_DrainPrimedot(-1),
535 li_SourcePrimedot(-1),
549 ADrainEquDrainNodeOffset(-1),
550 ADrainEquDrainPrimeNodeOffset(-1),
552 AGateEquGateNodeOffset(-1),
553 AGateEquBulkNodeOffset(-1),
554 AGateEquDrainPrimeNodeOffset(-1),
555 AGateEquSourcePrimeNodeOffset(-1),
557 AGateEquVGatedotNodeOffset(-1),
558 AGateEquVBulkdotNodeOffset(-1),
559 AGateEquVDrainPrimedotNodeOffset(-1),
560 AGateEquVSourcePrimedotNodeOffset(-1),
562 ASourceEquSourceNodeOffset(-1),
563 ASourceEquSourcePrimeNodeOffset(-1),
565 ABulkEquGateNodeOffset(-1),
566 ABulkEquBulkNodeOffset(-1),
567 ABulkEquDrainPrimeNodeOffset(-1),
568 ABulkEquSourcePrimeNodeOffset(-1),
570 ABulkEquVGatedotNodeOffset(-1),
571 ABulkEquVBulkdotNodeOffset(-1),
572 ABulkEquVDrainPrimedotNodeOffset(-1),
573 ABulkEquVSourcePrimedotNodeOffset(-1),
575 ADrainPrimeEquDrainNodeOffset(-1),
576 ADrainPrimeEquGateNodeOffset(-1),
577 ADrainPrimeEquBulkNodeOffset(-1),
578 ADrainPrimeEquDrainPrimeNodeOffset(-1),
579 ADrainPrimeEquSourcePrimeNodeOffset(-1),
581 ADrainPrimeEquVGatedotNodeOffset(-1),
582 ADrainPrimeEquVBulkdotNodeOffset(-1),
583 ADrainPrimeEquVDrainPrimedotNodeOffset(-1),
585 ASourcePrimeEquGateNodeOffset(-1),
586 ASourcePrimeEquSourceNodeOffset(-1),
587 ASourcePrimeEquBulkNodeOffset(-1),
588 ASourcePrimeEquDrainPrimeNodeOffset(-1),
589 ASourcePrimeEquSourcePrimeNodeOffset(-1),
591 ASourcePrimeEquVGatedotNodeOffset(-1),
592 ASourcePrimeEquVBulkdotNodeOffset(-1),
593 ASourcePrimeEquVSourcePrimedotNodeOffset(-1),
595 ADraindotEquVDrainNodeOffset(-1),
596 ADraindotEquVDraindotNodeOffset(-1),
597 AGatedotEquVGateNodeOffset(-1),
598 AGatedotEquVGatedotNodeOffset(-1),
599 ASourcedotEquVSourceNodeOffset(-1),
600 ASourcedotEquVSourcedotNodeOffset(-1),
601 ABulkdotEquVBulkNodeOffset(-1),
602 ABulkdotEquVBulkdotNodeOffset(-1),
603 ADrainPrimedotEquVDrainPrimeNodeOffset(-1),
604 ADrainPrimedotEquVDrainPrimedotNodeOffset(-1),
610 f_DrainEquDrainNodePtr(0),
611 f_DrainEquDrainPrimeNodePtr(0),
614 f_GateEquGateNodePtr(0),
615 f_GateEquBulkNodePtr(0),
616 f_GateEquDrainPrimeNodePtr(0),
617 f_GateEquSourcePrimeNodePtr(0),
619 f_GateEquVGatedotNodePtr(0),
620 f_GateEquVBulkdotNodePtr(0),
621 f_GateEquVDrainPrimedotNodePtr(0),
622 f_GateEquVSourcePrimedotNodePtr(0),
625 f_SourceEquSourceNodePtr(0),
626 f_SourceEquSourcePrimeNodePtr(0),
629 f_BulkEquGateNodePtr(0),
630 f_BulkEquBulkNodePtr(0),
631 f_BulkEquDrainPrimeNodePtr(0),
632 f_BulkEquSourcePrimeNodePtr(0),
634 f_BulkEquVGatedotNodePtr(0),
635 f_BulkEquVBulkdotNodePtr(0),
636 f_BulkEquVDrainPrimedotNodePtr(0),
637 f_BulkEquVSourcePrimedotNodePtr(0),
640 f_DrainPrimeEquDrainNodePtr(0),
641 f_DrainPrimeEquGateNodePtr(0),
642 f_DrainPrimeEquBulkNodePtr(0),
643 f_DrainPrimeEquDrainPrimeNodePtr(0),
644 f_DrainPrimeEquSourcePrimeNodePtr(0),
646 f_DrainPrimeEquVGatedotNodePtr(0),
647 f_DrainPrimeEquVBulkdotNodePtr(0),
648 f_DrainPrimeEquVDrainPrimedotNodePtr(0),
651 f_SourcePrimeEquGateNodePtr(0),
652 f_SourcePrimeEquSourceNodePtr(0),
653 f_SourcePrimeEquBulkNodePtr(0),
654 f_SourcePrimeEquDrainPrimeNodePtr(0),
655 f_SourcePrimeEquSourcePrimeNodePtr(0),
657 f_SourcePrimeEquVGatedotNodePtr(0),
658 f_SourcePrimeEquVBulkdotNodePtr(0),
659 f_SourcePrimeEquVSourcePrimedotNodePtr(0),
662 f_DraindotEquVDrainNodePtr(0),
663 f_DraindotEquVDraindotNodePtr(0),
664 f_GatedotEquVGateNodePtr(0),
665 f_GatedotEquVGatedotNodePtr(0),
666 f_SourcedotEquVSourceNodePtr(0),
667 f_SourcedotEquVSourcedotNodePtr(0),
668 f_BulkdotEquVBulkNodePtr(0),
669 f_BulkdotEquVBulkdotNodePtr(0),
670 f_DrainPrimedotEquVDrainPrimeNodePtr(0),
671 f_DrainPrimedotEquVDrainPrimedotNodePtr(0),
672 f_SourcePrimedotEquVSourcePrimeNodePtr(0),
673 f_SourcePrimedotEquVSourcePrimedotNodePtr(0),
677 q_DrainEquDrainNodePtr(0),
678 q_DrainEquDrainPrimeNodePtr(0),
681 q_GateEquGateNodePtr(0),
682 q_GateEquBulkNodePtr(0),
683 q_GateEquDrainPrimeNodePtr(0),
684 q_GateEquSourcePrimeNodePtr(0),
686 q_GateEquVGatedotNodePtr(0),
687 q_GateEquVBulkdotNodePtr(0),
688 q_GateEquVDrainPrimedotNodePtr(0),
689 q_GateEquVSourcePrimedotNodePtr(0),
692 q_SourceEquSourceNodePtr(0),
693 q_SourceEquSourcePrimeNodePtr(0),
696 q_BulkEquGateNodePtr(0),
697 q_BulkEquBulkNodePtr(0),
698 q_BulkEquDrainPrimeNodePtr(0),
699 q_BulkEquSourcePrimeNodePtr(0),
701 q_BulkEquVGatedotNodePtr(0),
702 q_BulkEquVBulkdotNodePtr(0),
703 q_BulkEquVDrainPrimedotNodePtr(0),
704 q_BulkEquVSourcePrimedotNodePtr(0),
707 q_DrainPrimeEquDrainNodePtr(0),
708 q_DrainPrimeEquGateNodePtr(0),
709 q_DrainPrimeEquBulkNodePtr(0),
710 q_DrainPrimeEquDrainPrimeNodePtr(0),
711 q_DrainPrimeEquSourcePrimeNodePtr(0),
713 q_DrainPrimeEquVGatedotNodePtr(0),
714 q_DrainPrimeEquVBulkdotNodePtr(0),
715 q_DrainPrimeEquVDrainPrimedotNodePtr(0),
718 q_SourcePrimeEquGateNodePtr(0),
719 q_SourcePrimeEquSourceNodePtr(0),
720 q_SourcePrimeEquBulkNodePtr(0),
721 q_SourcePrimeEquDrainPrimeNodePtr(0),
722 q_SourcePrimeEquSourcePrimeNodePtr(0),
724 q_SourcePrimeEquVGatedotNodePtr(0),
725 q_SourcePrimeEquVBulkdotNodePtr(0),
726 q_SourcePrimeEquVSourcePrimedotNodePtr(0),
729 q_DraindotEquVDrainNodePtr(0),
730 q_DraindotEquVDraindotNodePtr(0),
731 q_GatedotEquVGateNodePtr(0),
732 q_GatedotEquVGatedotNodePtr(0),
733 q_SourcedotEquVSourceNodePtr(0),
734 q_SourcedotEquVSourcedotNodePtr(0),
735 q_BulkdotEquVBulkNodePtr(0),
736 q_BulkdotEquVBulkdotNodePtr(0),
737 q_DrainPrimedotEquVDrainPrimeNodePtr(0),
738 q_DrainPrimedotEquVDrainPrimedotNodePtr(0),
739 q_SourcePrimedotEquVSourcePrimeNodePtr(0),
740 q_SourcePrimedotEquVSourcePrimedotNodePtr(0),
890 for (
int i=0; i < 12; i++)
955 for (
int i=0; i < 5; i++)
1008 for (
int i=6; i < 12; i++)
1011 for (
int j=0; j < 2; j++)
1074 for (
int i=0; i < 4; i++)
1128 for (
int i=6; i < 12; i++)
1131 for (
int j=0; j < 2; j++)
1187 for (
int i=0; i < 4; i++)
1241 for (
int i=6; i < 12; i++)
1244 for (
int j=0; j < 2; j++)
1358 const std::vector<int> & extLIDVecRef )
1374 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1376 Xyce::dout() << section_divider << std::endl;
1377 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1378 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1379 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1380 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1427 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1429 Xyce::dout() <<
"\n variable local indices:\n";
1430 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1431 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1432 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1433 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1434 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1435 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1437 Xyce::dout() <<
" li_Draindot = " <<
li_Draindot << std::endl;
1438 Xyce::dout() <<
" li_Gatedot = " <<
li_Gatedot << std::endl;
1439 Xyce::dout() <<
" li_Sourcedot = " <<
li_Sourcedot << std::endl;
1440 Xyce::dout() <<
" li_Bulkdot = " <<
li_Bulkdot << std::endl;
1444 Xyce::dout() << section_divider << std::endl;
1501 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1503 Xyce::dout() << std::endl;
1504 Xyce::dout() << section_divider << std::endl;
1505 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1506 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1507 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1527 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1529 Xyce::dout() <<
" State local indices:" << std::endl;
1530 Xyce::dout() << std::endl;
1540 Xyce::dout() << std::endl;
1541 Xyce::dout() << section_divider << std::endl;
1609 std::vector<int> map;
1610 std::vector< std::vector<int> > map2;
1719 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1930 double Qeqbs,Qeqbd,Qeqgb, Qeqgs, Qeqgd;
1941 Qeqbs = Dtype*(
qbs);
1942 Qeqbd = Dtype*(
qbd);
1945 Qeqgb = Dtype*(
qgb);
1946 Qeqgs = Dtype*(
qgs);
1947 Qeqgd = Dtype*(
qgd);
1950 coef = (Qeqgs+Qeqgd+Qeqgb);
1954 coef = Qeqbs + Qeqbd - Qeqgb;
1958 coef = -(Qeqbd + Qeqgd);
1962 coef = -(Qeqbs + Qeqgs);
1975 double gcgd, gcgs, gcgb, gcbs, gcbd;
1987 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1995 double coef_Jdxp4 = Dtype*(
2001 double coef_Jdxp5 = Dtype*(
2103 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
2125 ceqgb = Dtype*(
Capgb*vgbdot);
2126 ceqgs = Dtype*(
Capgs*vgsdot);
2127 ceqgd = Dtype*(
Capgd*vgddot);
2131 ceqbs = Dtype*(
cbs);
2132 ceqbd = Dtype*(
cbd);
2144 ceqbs = Dtype*(
cbs);
2145 ceqbd = Dtype*(
cbd);
2162 coef = (ceqgs+ceqgd+ceqgb);
2173 coef = ceqbs + ceqbd - ceqgb;
2212 double coef_Jdxp4 = Dtype*(
2217 double coef_Jdxp5 = Dtype*(
2224 double coef_Jdxp6 = Dtype*(
2343 (+gcbs+gcbd+gcgb)*numberParallel;
2353 (+gcbd+gcgd)*numberParallel;
2360 (+gcbs+gcgs)*numberParallel;
2427 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
2428 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
2429 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
2430 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
2431 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
2467 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
2468 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
2469 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*
numberParallel;
2471 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
2472 l_dcapgddvgd*l_vgddot)*numberParallel;
2474 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
2475 l_dcapgddvgs*l_vgddot)*numberParallel;
2477 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
2478 l_dcapgddvgb*l_vgddot)*numberParallel;
2481 (l_capgs + l_capgd + l_capgb)*numberParallel;
2498 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*numberParallel;
2500 (
gbs+
gbd+l_dcapgbdvgb*l_vgbdot)*numberParallel;
2502 (
gbd-l_dcapgbdvgd*l_vgbdot)*numberParallel;
2504 (
gbs-l_dcapgbdvgs*l_vgbdot )*numberParallel;
2510 (l_capbs+l_capgb+l_capbd)*numberParallel;
2519 (
gbs+
gbd)*numberParallel;
2532 (-
gbd+
Gmbs+l_dcapgddvgb*l_vgddot)*numberParallel;
2536 (-
gds-
nrmsum+l_dcapgddvgs*l_vgddot)*numberParallel;
2544 (l_capgd+l_capbd)*numberParallel;
2551 (
Gm)*numberParallel;
2567 (
gbs+
Gmbs-l_dcapgsdvgb*l_vgsdot)*numberParallel;
2569 (
gds+
revsum-l_dcapgsdvgd*l_vgsdot)*numberParallel;
2579 += (l_capgs+l_capbs)*numberParallel;
2584 (
Gm)*numberParallel;
2627 bool bsuccess =
true;
2737 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2908 Xyce::dout() <<
"HOMOTOPY INFO: Von = " << Von <<std::endl
2910 <<
"HOMOTOPY INFO: before vds = " << vds << std::endl
2911 <<
"HOMOTOPY INFO: before vgs = " <<
vgs << std::endl;
2951 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2953 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << vds << std::endl;
2954 Xyce::dout() <<
"HOMOTOPY INFO: after vgs = " <<
vgs << std::endl;
2958 if ((
mode==1?vbs:
vbd) <= 0 ) {
2962 sarg=sarg-(
mode==1?vbs:
vbd)/(sarg+sarg);
2963 sarg=std::max(0.0,sarg);
2967 Vdsat=std::max(vgst,0.0);
2990 if (vgst <= (vds*
mode))
2992 cdrain=betap*vgst*vgst*.5;
3005 (vgst-.5*(vds*mode));
3010 (vgst-.5*(vds*mode));
3067 sarg = sargsw = 1/sqrt(arg);
3086 sargsw = 1/sqrt(arg);
3126 sarg = sargsw = 1/sqrt(arg);
3140 sargsw = 1/sqrt(arg);
3274 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3275 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3276 Xyce::dout() <<
" capgd = " <<
capgd <<
" capgd_old = " << capgd_old << std::endl;
3277 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3288 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3289 Xyce::dout() <<
"Capgd = " <<
Capgd << std::endl;
3290 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3291 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3292 Xyce::dout() <<
"capgd = " <<
capgd << std::endl;
3293 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3445 double ratio,ratio4;
3453 double gmanew,gmaold;
3458 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3460 Xyce::dout() << subsection_divider << std::endl;
3461 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3462 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3463 Xyce::dout() << std::endl;
3467 if (temp_tmp != -999.0)
temp = temp_tmp;
3477 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3479 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
3480 Xyce::dout() <<
"tnom = " << tnom << std::endl;
3481 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3490 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3494 Xyce::dout() <<
"vt = " <<
vt << std::endl;
3495 Xyce::dout() <<
"ratio = " << ratio << std::endl;
3496 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
3497 Xyce::dout() <<
"kt = " << kt << std::endl;
3498 Xyce::dout() <<
"egfet = " << egfet << std::endl;
3499 Xyce::dout() <<
"arg = " << arg << std::endl;
3500 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
3512 ratio4 = ratio * sqrt(ratio);
3516 tPhi = fact2 * phio + pbfact;
3545 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3547 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3548 Xyce::dout() <<
" phio = " << phio << std::endl;
3549 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3550 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3551 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3552 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3553 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3554 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3555 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3556 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3557 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3558 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3559 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3560 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3561 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3562 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3563 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3564 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3686 double vgs1, vgd1, vbs1,vgb1, vds1;
3789 noiseData.
resize(numSources);
3800 std::string(
"_1overf");
3834 double coxSquared=0.0;
3837 coxSquared = 3.9 * 8.854214871e-12 / 1e-7;
3843 coxSquared *= coxSquared;
3861 (2.0/3.0 * fabs(
gm)),
temp);
3896 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
3929 wkfng = 3.25 + .5 *
egfet1 - fermig;
3931 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
3934 gamma = sqrt(2 * 11.70 * 8.854214871e-12 *
3967 std::vector<Instance*>::iterator iter;
3971 for (iter=first; iter!=last; ++iter)
3973 (*iter)->processParams();
3991 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
3993 tnom(getDeviceOptions().tnom),
3995 jctSatCurDensity(0.0),
3997 drainResistance(0.0),
3998 sourceResistance(0.0),
3999 sheetResistance(0.0),
4000 transconductance(0.0),
4001 gateSourceOverlapCapFactor(0.0),
4002 gateDrainOverlapCapFactor(0.0),
4003 gateBulkOverlapCapFactor(0.0),
4004 oxideCapFactor(0.0),
4009 sideWallCapFactor(0.0),
4010 bulkJctPotential(0.0),
4011 bulkJctBotGradingCoeff(0.0),
4012 bulkJctSideGradingCoeff(0.0),
4013 fwdCapDepCoeff(0.0),
4017 substrateDoping(0.0),
4019 surfaceStateDensity(0.0),
4020 oxideThickness(0.0),
4021 surfaceMobility(0.0),
4026 bulkCapFactorGiven(0),
4027 sideWallCapFactorGiven(0)
4034 else if (
getType() ==
"PMOS") {
4069 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
4071 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
4089 std::vector<Instance*>::iterator iter;
4093 for (iter=first; iter!=last; ++iter)
4110 std::vector<Instance*>::const_iterator iter;
4116 os <<
" name model name Parameters" << std::endl;
4117 for (i=0, iter=first; iter!=last; ++iter, ++i)
4119 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
4144 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
4178 (*maskVectorPtr)[
li_Gate] = 0.0;
4179 (*maskVectorPtr)[
li_Bulk] = 0.0;
4197 bool bsuccess =
true;
4206 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
4209 bsuccess = bsuccess && btmp;
4294 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
4302 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
4303 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
4317 ceqbs = Dtype*(mi.
cbs+mi.
capbs*vbsdot);
4318 ceqbd = Dtype*(mi.
cbd+mi.
capbd*vbddot);
4319 ceqgb = Dtype*(mi.
Capgb*vgbdot);
4320 ceqgs = Dtype*(mi.
Capgs*vgsdot);
4321 ceqgd = Dtype*(mi.
Capgd*vgddot);
4325 ceqbs = Dtype*(mi.
cbs);
4326 ceqbd = Dtype*(mi.
cbd);
4337 ceqbs = Dtype*(mi.
cbs);
4338 ceqbd = Dtype*(mi.
cbd);
4351 coef = (ceqgs+ceqgd+ceqgb);
4357 coef = ceqbs + ceqbd - ceqgb;
4404 Qeqbs = Dtype*(mi.
qbs);
4405 Qeqbd = Dtype*(mi.
qbd);
4408 Qeqgb = Dtype*(mi.
qgb);
4409 Qeqgs = Dtype*(mi.
qgs);
4410 Qeqgd = Dtype*(mi.
qgd);
4412 coef = (Qeqgs+Qeqgd+Qeqgb);
4415 coef = Qeqbs + Qeqbd - Qeqgb;
4418 coef = -(Qeqbd + Qeqgd);
4421 coef = -(Qeqbs + Qeqgs);
4429 double coef_Jdxp4 = Dtype*(
4433 double coef_Jdxp5 = Dtype*(
4439 double coef_Jdxp6 = Dtype*(
4454 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
4466 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
4473 double coef_Jdxp4 = Dtype*(
4478 double coef_Jdxp5 = Dtype*(
4483 double coef_Jdxp6 = Dtype*
4524 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
4542 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4543 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4544 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4545 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4546 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4584 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4585 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4586 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4588 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4591 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4594 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4617 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4649 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4682 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
4826 int sizeInstances = instanceContainer_.size();
4827 for (
int i=0; i<sizeInstances; ++i)
4829 Instance & mi = *(instanceContainer_.at(i));
4834 double l_capgs(0.0),l_capgd(0.0), l_capgb(0.0), l_capbd(0.0), l_capbs(0.0);
4835 double l_dcapgsdvgs(0.0),l_dcapgsdvgb(0.0),l_dcapgsdvgd(0.0);
4836 double l_dcapgbdvgs(0.0),l_dcapgbdvgb(0.0),l_dcapgbdvgd(0.0);
4837 double l_dcapgddvgs(0.0),l_dcapgddvgb(0.0),l_dcapgddvgd(0.0);
4838 double l_vgsdot(0.0), l_vgddot(0.0), l_vgbdot(0.0);
4877 ((l_dcapgsdvgs+l_dcapgsdvgb+l_dcapgsdvgd)*l_vgsdot +
4878 (l_dcapgbdvgs+l_dcapgbdvgb+l_dcapgbdvgd)*l_vgbdot +
4879 (l_dcapgddvgs+l_dcapgddvgb+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4881 (l_dcapgsdvgd*l_vgsdot + l_dcapgbdvgd*l_vgbdot +
4884 (l_dcapgsdvgs*l_vgsdot + l_dcapgbdvgs*l_vgbdot +
4887 (l_dcapgsdvgb*l_vgsdot + l_dcapgbdvgb*l_vgbdot +
4910 (l_dcapgbdvgb+l_dcapgbdvgs+l_dcapgbdvgd)*l_vgbdot*mi.
numberParallel;
4942 (mi.
Gm-(l_dcapgddvgb+l_dcapgddvgs+l_dcapgddvgd)*l_vgddot)*mi.
numberParallel;
4975 (mi.
Gm+(l_dcapgsdvgd+l_dcapgsdvgs+l_dcapgsdvgb)*l_vgsdot)*mi.
numberParallel;
5119 .registerDevice(
"m", 1)
5120 .registerModelType(
"pmos", 1)
5121 .registerModelType(
"nmos", 1);
const InstanceName & getName() const
static std::vector< int > jacMap_SC
double * f_GateEquGateNodePtr
double defad
MOS drain diffusion area.
int ADrainPrimeEquGateNodeOffset
int ABulkEquBulkNodeOffset
double * f_SourceEquSourceNodePtr
static void loadModelParameters(ParametricData< Model > &model_parameters)
double * q_SourcePrimeEquSourceNodePtr
double * f_BulkEquGateNodePtr
double defw
MOS channel width.
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
std::vector< double > gainScale_
MOSFET Devices, ArtificialParameters.
double * q_SourcedotEquVSourceNodePtr
double * q_BulkdotEquVBulkNodePtr
double getRandomPerturbation()
double * f_SourcePrimedotEquVSourcePrimeNodePtr
static std::vector< std::vector< int > > jacMap2_SC
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 defl
MOS channel length.
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 tnom
nominal temperature for device params.
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
double defas
MOS source diffusion area.
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 gmin
minimum allowed conductance.
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
bool initJctFlag_
true if on the first newton step of the first dcop solve of the first .STEP iteration. BJT, JFET, Diode, MOSFET, SW, Extern
int ASourcePrimeEquSourceNodeOffset
Util::Param temp
operating temperature of ckt.
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