46 #include <Xyce_config.h>
49 #include <N_UTL_Math.h>
60 #include <N_ERH_ErrorMgr.h>
64 #include <N_LAS_Matrix.h>
65 #include <N_LAS_Vector.h>
66 #include <N_UTL_FeatureTest.h>
80 .setDescription(
"Device temperature");
83 .setOriginalValueStored(
true)
86 .setDescription(
"Channel length");
89 .setOriginalValueStored(
true)
92 .setDescription(
"Channel width");
97 .setDescription(
"Drain diffusion area");
102 .setDescription(
"Source diffusion area");
107 .setDescription(
"Multiplier for RSH to yield parasitic resistance of drain");
112 .setDescription(
"Multiplier for RSH to yield parasitic resistance of source");
117 .setDescription(
"Drain diffusion perimeter");
122 .setDescription(
"Source diffusion perimeter");
127 .setDescription(
"Multiplier for M devices connected in parallel");
134 .setDescription(
"Initial condition on Drain-Source voltage");
140 .setDescription(
"Initial condition on Gate-Source voltage");
146 .setDescription(
"Initial condition on Bulk-Source voltage");
154 .setDescription(
"Initial condition of no voltage drops across device");
162 .setDescription(
"Zero-bias threshold voltage");
167 .setDescription(
"Saturation voltage factor");
172 .setDescription(
"Saturation voltage coeff.");
177 .setDescription(
"Saturation current factor");
182 .setDescription(
"Saturation current coeff.");
187 .setDescription(
"Threshold voltage coeff.");
192 .setDescription(
"Sat. current modification par.");
197 .setDescription(
"Bulk threshold parameter");
202 .setDescription(
"Bulk threshold parameter 1");
207 .setDescription(
"Static feedback effect par.");
212 .setDescription(
"Surface potential");
218 .setDescription(
"Channel length modulation param.");
224 .setDescription(
"Channel length modulation param. 0");
230 .setDescription(
"Channel length modulation param. 1");
236 .setDescription(
"Drain ohmic resistance");
242 .setDescription(
"Source ohmic resistance");
249 .setDescription(
"Zero-bias bulk-drain p-n capacitance");
256 .setDescription(
"Zero-bias bulk-source p-n capacitance");
261 .setDescription(
"Bulk p-n saturation current");
266 .setDescription(
"Bulk p-n bottom potential");
271 .setDescription(
"Gate-source overlap capacitance/channel width");
276 .setDescription(
"Gate-drain overlap capacitance/channel width");
281 .setDescription(
"Gate-bulk overlap capacitance/channel length");
286 .setDescription(
"Drain,source diffusion sheet resistance");
292 .setDescription(
"Bulk p-n zero-bias bottom capacitance/area");
297 .setDescription(
"Bulk p-n bottom grading coefficient");
303 .setDescription(
"Bulk p-n zero-bias sidewall capacitance/area");
308 .setDescription(
"Bulk p-n sidewall grading coefficient");
313 .setDescription(
"Bulk p-n saturation current density");
316 .setOriginalValueStored(
true)
319 .setDescription(
"Gate oxide thickness");
324 .setDescription(
"Lateral diffusion length");
329 .setDescription(
"Surface mobility");
334 .setDescription(
"Surface mobility");
339 .setDescription(
"Bulk p-n forward-bias capacitance coefficient");
344 .setDescription(
"Substrate doping density");
349 .setDescription(
"Surface state density");
354 .setDescription(
"Parameter measurement temperature");
359 .setDescription(
"Flicker noise coefficient");
364 .setDescription(
"Flicker noise exponent");
370 .setDescription(
"Gate material type (-1 = same as substrate,0 = aluminum,1 = opposite of substrate)");
402 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
404 Xyce::dout() <<
" L = " <<
l << std::endl;
405 Xyce::dout() <<
" W = " <<
w<< std::endl;
406 Xyce::dout() <<
" drainArea = " <<
drainArea<< std::endl;
407 Xyce::dout() <<
" sourceArea = " <<
sourceArea<< std::endl;
408 Xyce::dout() <<
" drainSquares = " <<
drainSquares<< std::endl;
409 Xyce::dout() <<
" sourceSquares = " <<
sourceSquares<< std::endl;
410 Xyce::dout() <<
" drainPerimeter = " <<
drainPerimeter<< std::endl;
414 Xyce::dout() <<
" temp = " <<
temp<< std::endl;
436 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
444 l(getDeviceOptions().defl),
445 w(getDeviceOptions().defw),
447 drainArea(getDeviceOptions().defad),
448 sourceArea(getDeviceOptions().defas),
452 sourcePerimeter(0.0),
453 sourceConductance(0.0),
454 drainConductance(0.0),
455 temp(getDeviceOptions().temp.getImmutableValue<double>()),
509 GateSourceOverlapCap(0),
510 GateDrainOverlapCap(0),
511 GateBulkOverlapCap(0),
523 ADrainEquDrainNodeOffset(-1),
524 ADrainEquDrainPrimeNodeOffset(-1),
526 AGateEquGateNodeOffset(-1),
527 AGateEquBulkNodeOffset(-1),
528 AGateEquDrainPrimeNodeOffset(-1),
529 AGateEquSourcePrimeNodeOffset(-1),
531 ASourceEquSourceNodeOffset(-1),
532 ASourceEquSourcePrimeNodeOffset(-1),
534 ABulkEquGateNodeOffset(-1),
535 ABulkEquBulkNodeOffset(-1),
536 ABulkEquDrainPrimeNodeOffset(-1),
537 ABulkEquSourcePrimeNodeOffset(-1),
539 ADrainPrimeEquDrainNodeOffset(-1),
540 ADrainPrimeEquGateNodeOffset(-1),
541 ADrainPrimeEquBulkNodeOffset(-1),
542 ADrainPrimeEquDrainPrimeNodeOffset(-1),
543 ADrainPrimeEquSourcePrimeNodeOffset(-1),
545 ASourcePrimeEquGateNodeOffset(-1),
546 ASourcePrimeEquSourceNodeOffset(-1),
547 ASourcePrimeEquBulkNodeOffset(-1),
548 ASourcePrimeEquDrainPrimeNodeOffset(-1),
549 ASourcePrimeEquSourcePrimeNodeOffset(-1),
554 f_DrainEquDrainNodePtr(0),
555 f_DrainEquDrainPrimeNodePtr(0),
557 f_GateEquGateNodePtr(0),
558 f_GateEquBulkNodePtr(0),
559 f_GateEquDrainPrimeNodePtr(0),
560 f_GateEquSourcePrimeNodePtr(0),
562 f_SourceEquSourceNodePtr(0),
563 f_SourceEquSourcePrimeNodePtr(0),
565 f_BulkEquGateNodePtr(0),
566 f_BulkEquBulkNodePtr(0),
567 f_BulkEquDrainPrimeNodePtr(0),
568 f_BulkEquSourcePrimeNodePtr(0),
570 f_DrainPrimeEquDrainNodePtr(0),
571 f_DrainPrimeEquGateNodePtr(0),
572 f_DrainPrimeEquBulkNodePtr(0),
573 f_DrainPrimeEquDrainPrimeNodePtr(0),
574 f_DrainPrimeEquSourcePrimeNodePtr(0),
576 f_SourcePrimeEquGateNodePtr(0),
577 f_SourcePrimeEquSourceNodePtr(0),
578 f_SourcePrimeEquBulkNodePtr(0),
579 f_SourcePrimeEquDrainPrimeNodePtr(0),
580 f_SourcePrimeEquSourcePrimeNodePtr(0),
583 q_DrainEquDrainNodePtr(0),
584 q_DrainEquDrainPrimeNodePtr(0),
586 q_GateEquGateNodePtr(0),
587 q_GateEquBulkNodePtr(0),
588 q_GateEquDrainPrimeNodePtr(0),
589 q_GateEquSourcePrimeNodePtr(0),
591 q_SourceEquSourceNodePtr(0),
592 q_SourceEquSourcePrimeNodePtr(0),
594 q_BulkEquGateNodePtr(0),
595 q_BulkEquBulkNodePtr(0),
596 q_BulkEquDrainPrimeNodePtr(0),
597 q_BulkEquSourcePrimeNodePtr(0),
599 q_DrainPrimeEquDrainNodePtr(0),
600 q_DrainPrimeEquGateNodePtr(0),
601 q_DrainPrimeEquBulkNodePtr(0),
602 q_DrainPrimeEquDrainPrimeNodePtr(0),
603 q_DrainPrimeEquSourcePrimeNodePtr(0),
605 q_SourcePrimeEquGateNodePtr(0),
606 q_SourcePrimeEquSourceNodePtr(0),
607 q_SourcePrimeEquBulkNodePtr(0),
608 q_SourcePrimeEquDrainPrimeNodePtr(0),
609 q_SourcePrimeEquSourcePrimeNodePtr(0),
788 UserError0(*
this) <<
"Effective channel length less than zero.";
821 const std::vector<int> & extLIDVecRef )
828 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
830 Xyce::dout() << section_divider << std::endl;
831 Xyce::dout() <<
" In Instance::register LIDs\n\n";
832 Xyce::dout() <<
" name = " <<
getName() << std::endl;
833 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
834 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
862 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
864 Xyce::dout() <<
"\n variable local indices:\n";
865 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
866 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
867 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
868 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
869 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
870 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
872 Xyce::dout() << section_divider << std::endl;
914 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
916 Xyce::dout() << std::endl;
917 Xyce::dout() << section_divider << std::endl;
918 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
919 Xyce::dout() <<
" name = " <<
getName() << std::endl;
920 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
939 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
941 Xyce::dout() <<
" State local indices:" << std::endl;
942 Xyce::dout() << std::endl;
944 Xyce::dout() <<
" li_state_qgs = " <<
li_state_qgs <<std::endl;
945 Xyce::dout() <<
" li_state_capgs = " <<
li_state_capgs<<std::endl;
946 Xyce::dout() <<
" li_state_capgd = " <<
li_state_capgd<<std::endl;
947 Xyce::dout() <<
" li_state_capgb = " <<
li_state_capgb<<std::endl;
948 Xyce::dout() <<
" li_state_qgd = " <<
li_state_qgd<<std::endl;
949 Xyce::dout() <<
" li_state_qgb = " <<
li_state_qgb<<std::endl;
950 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs<<std::endl;
951 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd<<std::endl;
952 Xyce::dout() << std::endl;
953 Xyce::dout() << section_divider << std::endl;
1020 std::vector<int> map;
1021 std::vector< std::vector<int> > map2;
1089 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1174 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
1183 Qeqbs = Dtype*(
qbs);
1184 Qeqbd = Dtype*(
qbd);
1187 Qeqgb = Dtype*(
qgb);
1188 Qeqgs = Dtype*(
qgs);
1189 Qeqgd = Dtype*(
qgd);
1192 coef = (Qeqgs+Qeqgd+Qeqgb);
1196 coef = Qeqbs + Qeqbd - Qeqgb;
1200 coef = -(Qeqbd + Qeqgd);
1204 coef = -(Qeqbs + Qeqgs);
1232 double gcgd, gcgs, gcgb, gcbs, gcbd;
1244 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1252 double coef_Jdxp4 = Dtype*(
1258 double coef_Jdxp5 = Dtype*(
1291 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
1298 ceqbs = Dtype*(
cbs);
1299 ceqbd = Dtype*(
cbd);
1314 coef = (ceqgs+ceqgd+ceqgb);
1325 coef = ceqbs + ceqbd - ceqgb;
1345 double coef_Jdxp4 = Dtype*(
1350 double coef_Jdxp5 = Dtype*(
1357 double coef_Jdxp6 = Dtype*(
1454 +(gcbd+gcgd)*numberParallel;
1461 +(gcbs+gcgs)*numberParallel;
1493 (
gbs+
gbd)*numberParallel;
1532 bool bsuccess =
true;
1551 double capgs_old(0.0);
1552 double capgd_old(0.0);
1553 double capgb_old(0.0);
1558 double vgs_save(0.0);
1559 double vgd_save(0.0);
1560 double vds_save(0.0);
1635 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
1703 Xyce::dout() <<
" checking whether to limit voltages "<< std::endl;
1704 Xyce::dout() <<
" Von = " << Von << std::endl;
1705 Xyce::dout() <<
" Blim: vgd = " <<
vgd <<
" vgd old = " <<
vgd_old << std::endl;
1706 Xyce::dout() <<
" Blim: vgs = " <<
vgs <<
" vgs_old = " <<
vgs_old << std::endl;
1707 Xyce::dout() <<
" Blim: vds = " << vds <<
" vds_old = " <<
vds_old << std::endl;
1708 Xyce::dout() <<
" Blim: vbs = " <<
vbs <<
" vbs_old = " <<
vbs_old << std::endl;
1709 Xyce::dout() <<
" Blim: vbd = " <<
vbd <<
" vbd_old = " <<
vbd_old << std::endl;
1746 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1748 Xyce::dout() <<
" Alim: vgd = " <<
vgd << std::endl;
1749 Xyce::dout() <<
" Alim: vgs = " <<
vgs << std::endl;
1750 Xyce::dout() <<
" Alim: vds = " << vds << std::endl;
1751 Xyce::dout() <<
" Alim: vbs = " <<
vbs << std::endl;
1752 Xyce::dout() <<
" Alim: vbd = " <<
vbd << std::endl;
1768 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1772 Xyce::dout() <<
" Something modified the voltages. " << std::endl;
1773 Xyce::dout() <<
" Voltage before after diff " << std::endl;
1775 Xyce::dout() <<
" vds " <<
vds_orig <<
" " << vds <<
" " << vds-
vds_orig << std::endl;
1776 Xyce::dout() <<
" vbs " <<
vbs_orig <<
" " << vbs <<
" " << vbs-
vbs_orig << std::endl;
1828 double vdshere, vbsvbd;
1829 double idsat, lambda, vonbm;
1830 double vdst, vdst2, ivdst1, vdstg;
1878 sarg = sqrt(
tPhi - vbsvbd);
1883 sarg = sarg - vbsvbd / (sarg+sarg);
1884 sarg = std::max (0.0,sarg);
1887 vdshere = vds *
mode;
1891 vgon = (mode==1?
vgs:
vgd) - Von;
1910 if ((mode==1?vbs:
vbd) <= 0 )
1921 idsat = betac * exp(sarg *
model_.
nc);
1925 cdrain = idsat * (1 + lambda * vdshere);
1932 if (
vdsat > vdshere)
1935 vdst = vdshere /
vdsat;
1936 vdst2 = (2 - vdst) * vdst;
1938 ivdst1 =
cdrain * (2 - vdst - vdst);
1940 gm = gm * vdst2 + ivdst1 * vdstg;
1942 gmbs = gmbs * vdst2 + ivdst1 * vdstg * vonbm;
1997 sarg = sargsw = 1/sqrt(arg);
2016 sargsw = 1/sqrt(arg);
2057 sarg = sargsw = 1/sqrt(arg);
2071 sargsw = 1/sqrt(arg);
2321 double ratio,ratio4;
2329 double gmanew,gmaold;
2343 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2345 Xyce::dout() << subsection_divider << std::endl;
2346 Xyce::dout() <<
" Begin of updateTemperature. \n";
2347 Xyce::dout() << std::endl;
2351 if (temp_tmp != -999.0)
temp = temp_tmp;
2361 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2363 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
2364 Xyce::dout() <<
"tnom = " << tnom << std::endl;
2365 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2374 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
2383 pbfact1 = -2*vtnom *(1.5*log(fact1)+
CONSTQ*arg1);
2387 Xyce::dout() <<
"vt = " <<
vt << std::endl;
2388 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2389 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
2390 Xyce::dout() <<
"kt = " << kt << std::endl;
2391 Xyce::dout() <<
"egfet = " << egfet << std::endl;
2392 Xyce::dout() <<
"arg = " << arg << std::endl;
2393 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
2406 ratio4 = ratio * sqrt(ratio);
2411 tPhi = fact2 * phio + pbfact;
2420 exp(-egfet/
vt+egfet1/vtnom);
2422 exp(-egfet/
vt+egfet1/vtnom);
2589 bool bsuccess =
true;
2596 double vgs1, vgd1, vbs1,vgb1, vds1;
2687 noiseData.
resize(numSources);
2698 std::string(
"_1overf");
2743 (2.0/3.0 * fabs(
gm)),
temp);
2779 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
2782 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
2784 Xyce::dout() <<
" fact1 = " <<
fact1 << std::endl;
2785 Xyce::dout() <<
" vtnom = " <<
vtnom << std::endl;
2786 Xyce::dout() <<
" kt1 = " << kt1 << std::endl;
2787 Xyce::dout() <<
" egfet1 = " <<
egfet1 << std::endl;
2788 Xyce::dout() <<
" arg1 = " << arg1 << std::endl;
2789 Xyce::dout() <<
" pbfact1 = " <<
pbfact1 << std::endl;
2820 wkfng = 3.25 + .5 *
egfet1 - fermig;
2822 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
2842 coeffDepLayWidth = sqrt(alpha);
2888 wkfng = 3.25 + .5 *
egfet1 - fermig;
2890 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
2899 if(!
given(
"GAMMA1"))
2937 std::vector<Instance*>::iterator iter;
2941 for (iter=first; iter!=last; ++iter)
2943 (*iter)->processParams();
2961 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
2963 tnom(getDeviceOptions().tnom),
2965 jctSatCurDensity(0.0),
2967 drainResistance(0.0),
2968 sourceResistance(0.0),
2969 sheetResistance(0.0),
2976 gateSourceOverlapCapFactor(0.0),
2977 gateDrainOverlapCapFactor(0.0),
2978 gateBulkOverlapCapFactor(0.0),
2979 oxideCapFactor(0.0),
2984 sideWallCapFactor(0.0),
2985 bulkJctPotential(0.0),
2986 bulkJctBotGradingCoeff(0.0),
2987 bulkJctSideGradingCoeff(0.0),
2988 fwdCapDepCoeff(0.0),
2996 substrateDoping(0.0),
2998 surfaceStateDensity(0.0),
2999 oxideThickness(0.0),
3000 surfaceMobility(0.0),
3001 lambdaGiven (false),
3002 lambda0Given (false),
3003 lambda1Given (false),
3006 bulkCapFactorGiven(false),
3007 sideWallCapFactorGiven(false)
3015 else if (
getType() ==
"PMOS") {
3056 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
3058 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
3076 std::vector<Instance*>::iterator iter;
3080 for (iter=first; iter!=last; ++iter)
3097 std::vector<Instance*>::const_iterator iter;
3103 os <<
" name model name Parameters" << std::endl;
3104 for (i=0, iter=first; iter!=last; ++iter, ++i)
3106 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
3131 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
3150 bool bsuccess =
true;
3159 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
3162 bsuccess = bsuccess && btmp;
3235 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
3244 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
3245 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
3248 ceqbs = Dtype*(mi.
cbs);
3249 ceqbd = Dtype*(mi.
cbd);
3261 coef = (ceqgs+ceqgd+ceqgb);
3269 coef = ceqbs + ceqbd - ceqgb;
3279 Qeqbs = Dtype*(mi.
qbs);
3280 Qeqbd = Dtype*(mi.
qbd);
3283 Qeqgb = Dtype*(mi.
qgb);
3284 Qeqgs = Dtype*(mi.
qgs);
3285 Qeqgd = Dtype*(mi.
qgd);
3287 coef = (Qeqgs+Qeqgd+Qeqgb);
3290 coef = Qeqbs + Qeqbd - Qeqgb;
3293 coef = -(Qeqbd + Qeqgd);
3296 coef = -(Qeqbs + Qeqgs);
3303 double coef_Jdxp4 = Dtype*(
3307 double coef_Jdxp5 = Dtype*(
3313 double coef_Jdxp6 = Dtype*(
3329 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
3341 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
3348 double coef_Jdxp4 = Dtype*(
3353 double coef_Jdxp5 = Dtype*(
3358 double coef_Jdxp6 = Dtype*
3403 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
3552 bool bsuccess =
true;
3554 for (InstanceVector::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
3691 .registerDevice(
"m", 6)
3692 .registerModelType(
"pmos", 6)
3693 .registerModelType(
"nmos", 6);
const InstanceName & getName() const
int ADrainPrimeEquDrainNodeOffset
double * f_BulkEquSourcePrimeNodePtr
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
double * f_GateEquBulkNodePtr
double * f_DrainEquDrainNodePtr
double * q_DrainPrimeEquSourcePrimeNodePtr
static void initThermalModel(ParametricData< T > ¶metric_data)
Add the parameter "TEMPMODEL" to the parametric_data.
double * currStoVectorRawPtr
double * q_SourcePrimeEquGateNodePtr
static std::vector< int > jacMap_DC_SC
bool updateDependentParameters()
bool processParams()
processParams
void getNoiseSources(Xyce::Analysis::NoiseData &noiseData)
int ASourceEquSourcePrimeNodeOffset
double gateDrainOverlapCapFactor
const DeviceOptions & deviceOptions_
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
double * daeQVectorRawPtr
double * q_SourceEquSourceNodePtr
double * f_SourceEquSourceNodePtr
double * f_DrainPrimeEquGateNodePtr
double gateSourceOverlapCapFactor
int ABulkEquBulkNodeOffset
const std::vector< std::vector< int > > & jacobianStamp() const
double * dFdxdVpVectorRawPtr
Linear::Vector * nextSolVectorPtr
double pnjlim(double vnew, double vold, double vt, double vcrit, int *icheck)
std::vector< int > devConMap
double * f_GateEquSourcePrimeNodePtr
double * q_DrainPrimeEquDrainPrimeNodePtr
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
void qmeyer(double vgs, double vgd, double vgb, double von, double vdsat, double &capgs, double &capgd, double &capgb, double phi, double cox)
bool given(const std::string ¶meter_name) const
double surfaceStateDensity
int ADrainEquDrainNodeOffset
double * f_SourcePrimeEquDrainPrimeNodePtr
Pure virtual class to augment a linear system.
double * q_BulkEquDrainPrimeNodePtr
Parameter may be specified as time dependent expression from netlist.
int ASourcePrimeEquBulkNodeOffset
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
int ASourcePrimeEquGateNodeOffset
double * f_SourcePrimeEquSourcePrimeNodePtr
double * q_DrainEquDrainNodePtr
const std::string & getEncodedName() const
Return the instance name encoded as: [s:]*xname [s:]*Ytype!name [s:]*Utype!name!count.
double * currStaVectorRawPtr
static std::vector< int > jacMap_SC
virtual std::ostream & printOutInstances(std::ostream &os) const
double * q_DrainPrimeEquGateNodePtr
int ABulkEquDrainPrimeNodeOffset
void setNumStoreVars(int num_store_vars)
static std::vector< std::vector< int > > jacStamp_SC
double getRandomPerturbation()
std::vector< double > gainScale
double * f_SourcePrimeEquSourceNodePtr
void makeVector(const std::string &cname, int len)
Allows the parameter to be specified as a vector.
static std::vector< std::vector< int > > jacStamp_DC_SC
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
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
static std::vector< int > jacMap_DC
bool processInstanceParams()
processInstanceParams
Parameter is subject to being set to minimum junction capacitance.
bool updateTemperature(const double &temp_tmp)
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.
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
bool updateIntermediateVars()
Parameter is subject to being set to minimum lead resistance.
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
double fetlim(double vnew, double vold, double vto)
int ABulkEquSourcePrimeNodeOffset
double * f_DrainPrimeEquSourcePrimeNodePtr
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
double * storeLeadCurrQCompRawPtr
int ASourcePrimeEquSourceNodeOffset
int ASourcePrimeEquSourcePrimeNodeOffset
int getNumStoreVars() const
double * f_GateEquDrainPrimeNodePtr
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
double contVgst(double vgst, double alpha, double vgstConst=3.0)
std::vector< Param > params
Parameters from the line.
std::vector< double > noiseDens
void setupNoiseSources(Xyce::Analysis::NoiseData &noiseData)
std::vector< std::string > noiseNames
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
double * daeFVectorRawPtr
bool sideWallCapFactorGiven
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
double * q_GateEquDrainPrimeNodePtr
double * q_DrainPrimeEquDrainNodePtr
const DeviceOptions & getDeviceOptions() const
double * nextStoVectorRawPtr
double * f_DrainPrimeEquDrainPrimeNodePtr
double * q_SourceEquSourcePrimeNodePtr
std::vector< Instance * > instanceContainer
double * f_DrainEquDrainPrimeNodePtr
int ABulkEquGateNodeOffset
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
double limvds(double vnew, double vold)
static std::vector< std::vector< int > > jacMap2_SC
int ADrainEquDrainPrimeNodeOffset
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
double gateBulkOverlapCapFactor
Linear::Matrix * dFdxMatrixPtr
const DeviceOptions & getDeviceOptions() const
Returns the device options given during device construction.
int AGateEquSourcePrimeNodeOffset
The Device class is an interface for device implementations.
static std::vector< std::vector< int > > jacMap2_DC_SC
double * f_BulkEquDrainPrimeNodePtr
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * q_DrainPrimeEquBulkNodePtr
double * f_SourcePrimeEquBulkNodePtr
double * q_GateEquGateNodePtr
int ADrainPrimeEquDrainPrimeNodeOffset
int ADrainPrimeEquSourcePrimeNodeOffset
static std::vector< std::vector< int > > jacStamp_DC
int AGateEquGateNodeOffset
const SolverState & solverState_
int getGainScaleBlockID(int numBlocks)
double * dQdxdVpVectorRawPtr
Class Configuration contains device configuration data.
static std::vector< std::vector< int > > jacMap2
std::vector< double > lnNoiseDens
double * q_BulkEquGateNodePtr
double GateSourceOverlapCap
double * q_BulkEquSourcePrimeNodePtr
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
bool interpolateTNOM(double)
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 * f_BulkEquGateNodePtr
const SolverState & getSolverState() const
bool updatePrimaryState()
double GateDrainOverlapCap
double * q_BulkEquBulkNodePtr
Linear::Vector * nextStoVectorPtr
Linear::Vector * currStaVectorPtr
double * nextStaVectorRawPtr
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
#define Xyce_NONPOINTER_MATRIX_LOAD
void noiseSupport(double &noise, double &lnNoise, const int type, const double param, const double temp)
int AGateEquBulkNodeOffset
double * f_GateEquGateNodePtr
const std::string & getType() const
double * f_DrainPrimeEquBulkNodePtr
double contVds(double vds, double alpha, double min=0.3)
double * f_SourceEquSourcePrimeNodePtr
double * q_DrainEquDrainPrimeNodePtr
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
static std::vector< std::vector< int > > jacStamp
int getNumNoiseSources() const
static std::vector< std::vector< int > > jacMap2_DC
int ADrainPrimeEquBulkNodeOffset
int AGateEquDrainPrimeNodeOffset
Linear::Vector * currStoVectorPtr
static void loadModelParameters(ParametricData< Model > &model_parameters)
double * q_GateEquSourcePrimeNodePtr
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
Manages parameter binding for class C.
double * q_SourcePrimeEquBulkNodePtr
InstanceBlock represent a device instance line from the netlist.
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
double * q_GateEquBulkNodePtr
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
double * q_SourcePrimeEquSourceNodePtr
double * q_SourcePrimeEquDrainPrimeNodePtr
double GateBulkOverlapCap
int ASourcePrimeEquDrainPrimeNodeOffset
double bulkJctBotGradingCoeff
double * f_SourcePrimeEquGateNodePtr
Linear::Vector * flagSolVectorPtr
double * f_BulkEquBulkNodePtr
double * q_SourcePrimeEquSourcePrimeNodePtr
const SolverState & getSolverState() const
Returns the solver state given during device construction.
void setModParams(const std::vector< Param > ¶ms)
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
int ADrainPrimeEquGateNodeOffset
static std::vector< int > jacMap
int ASourceEquSourceNodeOffset
int numLeadCurrentStoreVars
double bulkJctSideGradingCoeff
double * f_DrainPrimeEquDrainNodePtr