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)");
416 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
418 Xyce::dout() <<
" L = " <<
l << std::endl;
419 Xyce::dout() <<
" W = " <<
w<< std::endl;
420 Xyce::dout() <<
" drainArea = " <<
drainArea<< std::endl;
421 Xyce::dout() <<
" sourceArea = " <<
sourceArea<< std::endl;
422 Xyce::dout() <<
" drainSquares = " <<
drainSquares<< std::endl;
423 Xyce::dout() <<
" sourceSquares = " <<
sourceSquares<< std::endl;
424 Xyce::dout() <<
" drainPerimeter = " <<
drainPerimeter<< std::endl;
428 Xyce::dout() <<
" temp = " <<
temp<< std::endl;
483 UserError0(*
this) <<
"Effective channel length less than zero.";
508 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
516 l(getDeviceOptions().defl),
517 w(getDeviceOptions().defw),
519 drainArea(getDeviceOptions().defad),
520 sourceArea(getDeviceOptions().defas),
524 sourcePerimeter(0.0),
525 sourceConductance(0.0),
526 drainConductance(0.0),
527 temp(getDeviceOptions().temp.getImmutableValue<double>()),
581 GateSourceOverlapCap(0),
582 GateDrainOverlapCap(0),
583 GateBulkOverlapCap(0),
595 ADrainEquDrainNodeOffset(-1),
596 ADrainEquDrainPrimeNodeOffset(-1),
598 AGateEquGateNodeOffset(-1),
599 AGateEquBulkNodeOffset(-1),
600 AGateEquDrainPrimeNodeOffset(-1),
601 AGateEquSourcePrimeNodeOffset(-1),
603 ASourceEquSourceNodeOffset(-1),
604 ASourceEquSourcePrimeNodeOffset(-1),
606 ABulkEquGateNodeOffset(-1),
607 ABulkEquBulkNodeOffset(-1),
608 ABulkEquDrainPrimeNodeOffset(-1),
609 ABulkEquSourcePrimeNodeOffset(-1),
611 ADrainPrimeEquDrainNodeOffset(-1),
612 ADrainPrimeEquGateNodeOffset(-1),
613 ADrainPrimeEquBulkNodeOffset(-1),
614 ADrainPrimeEquDrainPrimeNodeOffset(-1),
615 ADrainPrimeEquSourcePrimeNodeOffset(-1),
617 ASourcePrimeEquGateNodeOffset(-1),
618 ASourcePrimeEquSourceNodeOffset(-1),
619 ASourcePrimeEquBulkNodeOffset(-1),
620 ASourcePrimeEquDrainPrimeNodeOffset(-1),
621 ASourcePrimeEquSourcePrimeNodeOffset(-1),
626 f_DrainEquDrainNodePtr(0),
627 f_DrainEquDrainPrimeNodePtr(0),
629 f_GateEquGateNodePtr(0),
630 f_GateEquBulkNodePtr(0),
631 f_GateEquDrainPrimeNodePtr(0),
632 f_GateEquSourcePrimeNodePtr(0),
634 f_SourceEquSourceNodePtr(0),
635 f_SourceEquSourcePrimeNodePtr(0),
637 f_BulkEquGateNodePtr(0),
638 f_BulkEquBulkNodePtr(0),
639 f_BulkEquDrainPrimeNodePtr(0),
640 f_BulkEquSourcePrimeNodePtr(0),
642 f_DrainPrimeEquDrainNodePtr(0),
643 f_DrainPrimeEquGateNodePtr(0),
644 f_DrainPrimeEquBulkNodePtr(0),
645 f_DrainPrimeEquDrainPrimeNodePtr(0),
646 f_DrainPrimeEquSourcePrimeNodePtr(0),
648 f_SourcePrimeEquGateNodePtr(0),
649 f_SourcePrimeEquSourceNodePtr(0),
650 f_SourcePrimeEquBulkNodePtr(0),
651 f_SourcePrimeEquDrainPrimeNodePtr(0),
652 f_SourcePrimeEquSourcePrimeNodePtr(0),
655 q_DrainEquDrainNodePtr(0),
656 q_DrainEquDrainPrimeNodePtr(0),
658 q_GateEquGateNodePtr(0),
659 q_GateEquBulkNodePtr(0),
660 q_GateEquDrainPrimeNodePtr(0),
661 q_GateEquSourcePrimeNodePtr(0),
663 q_SourceEquSourceNodePtr(0),
664 q_SourceEquSourcePrimeNodePtr(0),
666 q_BulkEquGateNodePtr(0),
667 q_BulkEquBulkNodePtr(0),
668 q_BulkEquDrainPrimeNodePtr(0),
669 q_BulkEquSourcePrimeNodePtr(0),
671 q_DrainPrimeEquDrainNodePtr(0),
672 q_DrainPrimeEquGateNodePtr(0),
673 q_DrainPrimeEquBulkNodePtr(0),
674 q_DrainPrimeEquDrainPrimeNodePtr(0),
675 q_DrainPrimeEquSourcePrimeNodePtr(0),
677 q_SourcePrimeEquGateNodePtr(0),
678 q_SourcePrimeEquSourceNodePtr(0),
679 q_SourcePrimeEquBulkNodePtr(0),
680 q_SourcePrimeEquDrainPrimeNodePtr(0),
681 q_SourcePrimeEquSourcePrimeNodePtr(0),
836 const std::vector<int> & extLIDVecRef )
843 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
845 Xyce::dout() << section_divider << std::endl;
846 Xyce::dout() <<
" In Instance::register LIDs\n\n";
847 Xyce::dout() <<
" name = " <<
getName() << std::endl;
848 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
849 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
877 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
879 Xyce::dout() <<
"\n variable local indices:\n";
880 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
881 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
882 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
883 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
884 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
885 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
887 Xyce::dout() << section_divider << std::endl;
929 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
931 Xyce::dout() << std::endl;
932 Xyce::dout() << section_divider << std::endl;
933 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
934 Xyce::dout() <<
" name = " <<
getName() << std::endl;
935 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
954 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
956 Xyce::dout() <<
" State local indices:" << std::endl;
957 Xyce::dout() << std::endl;
959 Xyce::dout() <<
" li_state_qgs = " <<
li_state_qgs <<std::endl;
960 Xyce::dout() <<
" li_state_capgs = " <<
li_state_capgs<<std::endl;
961 Xyce::dout() <<
" li_state_capgd = " <<
li_state_capgd<<std::endl;
962 Xyce::dout() <<
" li_state_capgb = " <<
li_state_capgb<<std::endl;
963 Xyce::dout() <<
" li_state_qgd = " <<
li_state_qgd<<std::endl;
964 Xyce::dout() <<
" li_state_qgb = " <<
li_state_qgb<<std::endl;
965 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs<<std::endl;
966 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd<<std::endl;
967 Xyce::dout() << std::endl;
968 Xyce::dout() << section_divider << std::endl;
1035 std::vector<int> map;
1036 std::vector< std::vector<int> > map2;
1104 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1189 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
1198 Qeqbs = Dtype*(
qbs);
1199 Qeqbd = Dtype*(
qbd);
1202 Qeqgb = Dtype*(
qgb);
1203 Qeqgs = Dtype*(
qgs);
1204 Qeqgd = Dtype*(
qgd);
1207 coef = (Qeqgs+Qeqgd+Qeqgb);
1211 coef = Qeqbs + Qeqbd - Qeqgb;
1215 coef = -(Qeqbd + Qeqgd);
1219 coef = -(Qeqbs + Qeqgs);
1247 double gcgd, gcgs, gcgb, gcbs, gcbd;
1259 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1267 double coef_Jdxp4 = Dtype*(
1273 double coef_Jdxp5 = Dtype*(
1306 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
1313 ceqbs = Dtype*(
cbs);
1314 ceqbd = Dtype*(
cbd);
1329 coef = (ceqgs+ceqgd+ceqgb);
1340 coef = ceqbs + ceqbd - ceqgb;
1360 double coef_Jdxp4 = Dtype*(
1365 double coef_Jdxp5 = Dtype*(
1372 double coef_Jdxp6 = Dtype*(
1469 +(gcbd+gcgd)*numberParallel;
1476 +(gcbs+gcgs)*numberParallel;
1508 (
gbs+
gbd)*numberParallel;
1547 bool bsuccess =
true;
1566 double capgs_old(0.0);
1567 double capgd_old(0.0);
1568 double capgb_old(0.0);
1573 double vgs_save(0.0);
1574 double vgd_save(0.0);
1575 double vds_save(0.0);
1650 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
1718 Xyce::dout() <<
" checking whether to limit voltages "<< std::endl;
1719 Xyce::dout() <<
" Von = " << Von << std::endl;
1720 Xyce::dout() <<
" Blim: vgd = " <<
vgd <<
" vgd old = " <<
vgd_old << std::endl;
1721 Xyce::dout() <<
" Blim: vgs = " <<
vgs <<
" vgs_old = " <<
vgs_old << std::endl;
1722 Xyce::dout() <<
" Blim: vds = " << vds <<
" vds_old = " <<
vds_old << std::endl;
1723 Xyce::dout() <<
" Blim: vbs = " <<
vbs <<
" vbs_old = " <<
vbs_old << std::endl;
1724 Xyce::dout() <<
" Blim: vbd = " <<
vbd <<
" vbd_old = " <<
vbd_old << std::endl;
1761 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1763 Xyce::dout() <<
" Alim: vgd = " <<
vgd << std::endl;
1764 Xyce::dout() <<
" Alim: vgs = " <<
vgs << std::endl;
1765 Xyce::dout() <<
" Alim: vds = " << vds << std::endl;
1766 Xyce::dout() <<
" Alim: vbs = " <<
vbs << std::endl;
1767 Xyce::dout() <<
" Alim: vbd = " <<
vbd << std::endl;
1783 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1787 Xyce::dout() <<
" Something modified the voltages. " << std::endl;
1788 Xyce::dout() <<
" Voltage before after diff " << std::endl;
1790 Xyce::dout() <<
" vds " <<
vds_orig <<
" " << vds <<
" " << vds-
vds_orig << std::endl;
1791 Xyce::dout() <<
" vbs " <<
vbs_orig <<
" " << vbs <<
" " << vbs-
vbs_orig << std::endl;
1843 double vdshere, vbsvbd;
1844 double idsat, lambda, vonbm;
1845 double vdst, vdst2, ivdst1, vdstg;
1893 sarg = sqrt(
tPhi - vbsvbd);
1898 sarg = sarg - vbsvbd / (sarg+sarg);
1899 sarg = std::max (0.0,sarg);
1902 vdshere = vds *
mode;
1906 vgon = (mode==1?
vgs:
vgd) - Von;
1925 if ((mode==1?vbs:
vbd) <= 0 )
1936 idsat = betac * exp(sarg *
model_.
nc);
1940 cdrain = idsat * (1 + lambda * vdshere);
1947 if (
vdsat > vdshere)
1950 vdst = vdshere /
vdsat;
1951 vdst2 = (2 - vdst) * vdst;
1953 ivdst1 =
cdrain * (2 - vdst - vdst);
1955 gm = gm * vdst2 + ivdst1 * vdstg;
1957 gmbs = gmbs * vdst2 + ivdst1 * vdstg * vonbm;
2012 sarg = sargsw = 1/sqrt(arg);
2031 sargsw = 1/sqrt(arg);
2072 sarg = sargsw = 1/sqrt(arg);
2086 sargsw = 1/sqrt(arg);
2336 double ratio,ratio4;
2344 double gmanew,gmaold;
2358 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2360 Xyce::dout() << subsection_divider << std::endl;
2361 Xyce::dout() <<
" Begin of updateTemperature. \n";
2362 Xyce::dout() << std::endl;
2366 if (temp_tmp != -999.0)
temp = temp_tmp;
2376 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2378 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
2379 Xyce::dout() <<
"tnom = " << tnom << std::endl;
2380 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2389 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
2398 pbfact1 = -2*vtnom *(1.5*log(fact1)+
CONSTQ*arg1);
2402 Xyce::dout() <<
"vt = " <<
vt << std::endl;
2403 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2404 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
2405 Xyce::dout() <<
"kt = " << kt << std::endl;
2406 Xyce::dout() <<
"egfet = " << egfet << std::endl;
2407 Xyce::dout() <<
"arg = " << arg << std::endl;
2408 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
2421 ratio4 = ratio * sqrt(ratio);
2426 tPhi = fact2 * phio + pbfact;
2435 exp(-egfet/
vt+egfet1/vtnom);
2437 exp(-egfet/
vt+egfet1/vtnom);
2604 bool bsuccess =
true;
2611 double vgs1, vgd1, vbs1,vgb1, vds1;
2702 noiseData.
resize(numSources);
2713 std::string(
"_1overf");
2758 (2.0/3.0 * fabs(
gm)),
temp);
2794 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
2797 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
2799 Xyce::dout() <<
" fact1 = " <<
fact1 << std::endl;
2800 Xyce::dout() <<
" vtnom = " <<
vtnom << std::endl;
2801 Xyce::dout() <<
" kt1 = " << kt1 << std::endl;
2802 Xyce::dout() <<
" egfet1 = " <<
egfet1 << std::endl;
2803 Xyce::dout() <<
" arg1 = " << arg1 << std::endl;
2804 Xyce::dout() <<
" pbfact1 = " <<
pbfact1 << std::endl;
2835 wkfng = 3.25 + .5 *
egfet1 - fermig;
2837 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
2857 coeffDepLayWidth = sqrt(alpha);
2903 wkfng = 3.25 + .5 *
egfet1 - fermig;
2905 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
2914 if(!
given(
"GAMMA1"))
2952 std::vector<Instance*>::iterator iter;
2956 for (iter=first; iter!=last; ++iter)
2958 (*iter)->processParams();
2976 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
2978 tnom(getDeviceOptions().tnom),
2980 jctSatCurDensity(0.0),
2982 drainResistance(0.0),
2983 sourceResistance(0.0),
2984 sheetResistance(0.0),
2991 gateSourceOverlapCapFactor(0.0),
2992 gateDrainOverlapCapFactor(0.0),
2993 gateBulkOverlapCapFactor(0.0),
2994 oxideCapFactor(0.0),
2999 sideWallCapFactor(0.0),
3000 bulkJctPotential(0.0),
3001 bulkJctBotGradingCoeff(0.0),
3002 bulkJctSideGradingCoeff(0.0),
3003 fwdCapDepCoeff(0.0),
3011 substrateDoping(0.0),
3013 surfaceStateDensity(0.0),
3014 oxideThickness(0.0),
3015 surfaceMobility(0.0),
3016 lambdaGiven (false),
3017 lambda0Given (false),
3018 lambda1Given (false),
3021 bulkCapFactorGiven(false),
3022 sideWallCapFactorGiven(false)
3030 else if (
getType() ==
"PMOS") {
3071 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
3073 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
3091 std::vector<Instance*>::iterator iter;
3095 for (iter=first; iter!=last; ++iter)
3112 std::vector<Instance*>::const_iterator iter;
3118 os <<
" name model name Parameters" << std::endl;
3119 for (i=0, iter=first; iter!=last; ++iter, ++i)
3121 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
3146 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
3165 bool bsuccess =
true;
3174 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
3177 bsuccess = bsuccess && btmp;
3250 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
3259 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
3260 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
3263 ceqbs = Dtype*(mi.
cbs);
3264 ceqbd = Dtype*(mi.
cbd);
3276 coef = (ceqgs+ceqgd+ceqgb);
3284 coef = ceqbs + ceqbd - ceqgb;
3294 Qeqbs = Dtype*(mi.
qbs);
3295 Qeqbd = Dtype*(mi.
qbd);
3298 Qeqgb = Dtype*(mi.
qgb);
3299 Qeqgs = Dtype*(mi.
qgs);
3300 Qeqgd = Dtype*(mi.
qgd);
3302 coef = (Qeqgs+Qeqgd+Qeqgb);
3305 coef = Qeqbs + Qeqbd - Qeqgb;
3308 coef = -(Qeqbd + Qeqgd);
3311 coef = -(Qeqbs + Qeqgs);
3318 double coef_Jdxp4 = Dtype*(
3322 double coef_Jdxp5 = Dtype*(
3328 double coef_Jdxp6 = Dtype*(
3344 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
3356 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
3363 double coef_Jdxp4 = Dtype*(
3368 double coef_Jdxp5 = Dtype*(
3373 double coef_Jdxp6 = Dtype*
3418 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
3567 bool bsuccess =
true;
3569 for (InstanceVector::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
3706 .registerDevice(
"m", 6)
3707 .registerModelType(
"pmos", 6)
3708 .registerModelType(
"nmos", 6);
const InstanceName & getName() const
int ADrainPrimeEquDrainNodeOffset
double * f_BulkEquSourcePrimeNodePtr
double defad
MOS drain diffusion area.
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
double * f_GateEquBulkNodePtr
double * f_DrainEquDrainNodePtr
double * q_DrainPrimeEquSourcePrimeNodePtr
double defw
MOS channel width.
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)
std::vector< double > gainScale_
MOSFET Devices, ArtificialParameters.
static std::vector< std::vector< int > > jacStamp_SC
double getRandomPerturbation()
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 defl
MOS channel length.
double * f_DrainPrimeEquSourcePrimeNodePtr
double tnom
nominal temperature for device params.
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
double defas
MOS source diffusion area.
int ADrainPrimeEquDrainPrimeNodeOffset
int ADrainPrimeEquSourcePrimeNodeOffset
static std::vector< std::vector< int > > jacStamp_DC
int AGateEquGateNodeOffset
const SolverState & solverState_
bool artParameterFlag_
MOSFET Devices, ArtificialParameters.
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 gmin
minimum allowed conductance.
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
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
Util::Param temp
operating temperature of ckt.
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