46 #include <Xyce_config.h>
61 #include <N_ERH_ErrorMgr.h>
65 #include <N_LAS_Matrix.h>
66 #include <N_LAS_Vector.h>
67 #include <N_UTL_FeatureTest.h>
68 #include <N_UTL_Math.h>
82 .setDescription(
"Device temperature"),
85 .setOriginalValueStored(
true)
88 .setDescription(
"Channel length");
91 .setOriginalValueStored(
true)
94 .setDescription(
"Channel width");
99 .setDescription(
"Drain diffusion area");
104 .setDescription(
"Source diffusion area");
109 .setDescription(
"Multiplier for RSH to yield parasitic resistance of drain");
114 .setDescription(
"Multiplier for RSH to yield parasitic resistance of source");
119 .setDescription(
"Drain diffusion perimeter");
124 .setDescription(
"Source diffusion perimeter");
129 .setDescription(
"Multiplier for M devices connected in parallel");
136 .setDescription(
"Initial condition on Drain-Source voltage");
142 .setDescription(
"Initial condition on Gate-Source voltage");
148 .setDescription(
"Initial condition on Bulk-Source voltage");
156 .setDescription(
"Initial condition of no voltage drops across device");
165 .setDescription(
"Default channel length");
170 .setDescription(
"Default channel width");
175 .setDescription(
"Zero-bias threshold voltage");
180 .setDescription(
"Transconductance coefficient");
185 .setDescription(
"Bulk threshold parameter");
190 .setDescription(
"Surface potential");
196 .setDescription(
"Drain ohmic resistance");
202 .setDescription(
"Source ohmic resistance");
209 .setDescription(
"Zero-bias bulk-drain p-n capacitance");
216 .setDescription(
"Zero-bias bulk-source p-n capacitance");
221 .setDescription(
"Bulk p-n saturation current");
226 .setDescription(
"Bulk p-n bottom potential");
231 .setDescription(
"Gate-source overlap capacitance/channel width");
236 .setDescription(
"Gate-drain overlap capacitance/channel width");
241 .setDescription(
"Gate-bulk overlap capacitance/channel length");
246 .setDescription(
"Drain,source diffusion sheet resistance");
252 .setDescription(
"Bulk p-n zero-bias bottom capacitance/area");
257 .setDescription(
"Bulk p-n bottom grading coefficient");
263 .setDescription(
"Bulk p-n zero-bias sidewall capacitance/area");
268 .setDescription(
"Bulk p-n sidewall grading coefficient");
273 .setDescription(
"Bulk p-n saturation current density");
276 .setOriginalValueStored(
true)
279 .setDescription(
"Gate oxide thickness");
284 .setDescription(
"Lateral diffusion length");
289 .setDescription(
"Surface mobility");
294 .setDescription(
"Surface mobility");
299 .setDescription(
"Bulk p-n forward-bias capacitance coefficient");
304 .setDescription(
"Substrate doping density");
309 .setDescription(
"Surface state density");
314 .setDescription(
"Static feedback");
319 .setDescription(
"Width effect on threshold");
324 .setDescription(
"Fast surface state density");
329 .setDescription(
"Mobility modulation");
334 .setDescription(
"Maximum drift velocity");
339 .setDescription(
"Saturation field factor");
344 .setDescription(
"Metallurgical junction depth");
349 .setDescription(
"Parameter measurement temperature");
354 .setDescription(
"Flicker noise coefficient");
359 .setDescription(
"Flicker noise exponent");
365 .setDescription(
"Gate material type (-1 = same as substrate,0 = aluminum,1 = opposite of substrate)");
462 UserError0(*
this) <<
"Effective channel length less than zero.";
486 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
494 l(getDeviceOptions().defl),
495 w(getDeviceOptions().defw),
497 drainArea(getDeviceOptions().defad),
498 sourceArea(getDeviceOptions().defas),
502 sourcePerimeter(0.0),
503 sourceConductance(0.0),
504 drainConductance(0.0),
505 temp(getDeviceOptions().temp.getImmutableValue<double>()),
507 tTransconductance(0.0),
558 GateSourceOverlapCap(0),
559 GateDrainOverlapCap(0),
560 GateBulkOverlapCap(0),
572 ADrainEquDrainNodeOffset(-1),
573 ADrainEquDrainPrimeNodeOffset(-1),
575 AGateEquGateNodeOffset(-1),
576 AGateEquBulkNodeOffset(-1),
577 AGateEquDrainPrimeNodeOffset(-1),
578 AGateEquSourcePrimeNodeOffset(-1),
580 ASourceEquSourceNodeOffset(-1),
581 ASourceEquSourcePrimeNodeOffset(-1),
583 ABulkEquGateNodeOffset(-1),
584 ABulkEquBulkNodeOffset(-1),
585 ABulkEquDrainPrimeNodeOffset(-1),
586 ABulkEquSourcePrimeNodeOffset(-1),
588 ADrainPrimeEquDrainNodeOffset(-1),
589 ADrainPrimeEquGateNodeOffset(-1),
590 ADrainPrimeEquBulkNodeOffset(-1),
591 ADrainPrimeEquDrainPrimeNodeOffset(-1),
592 ADrainPrimeEquSourcePrimeNodeOffset(-1),
594 ASourcePrimeEquGateNodeOffset(-1),
595 ASourcePrimeEquSourceNodeOffset(-1),
596 ASourcePrimeEquBulkNodeOffset(-1),
597 ASourcePrimeEquDrainPrimeNodeOffset(-1),
598 ASourcePrimeEquSourcePrimeNodeOffset(-1),
603 f_DrainEquDrainNodePtr(0),
604 f_DrainEquDrainPrimeNodePtr(0),
606 f_GateEquGateNodePtr(0),
607 f_GateEquBulkNodePtr(0),
608 f_GateEquDrainPrimeNodePtr(0),
609 f_GateEquSourcePrimeNodePtr(0),
611 f_SourceEquSourceNodePtr(0),
612 f_SourceEquSourcePrimeNodePtr(0),
614 f_BulkEquGateNodePtr(0),
615 f_BulkEquBulkNodePtr(0),
616 f_BulkEquDrainPrimeNodePtr(0),
617 f_BulkEquSourcePrimeNodePtr(0),
619 f_DrainPrimeEquDrainNodePtr(0),
620 f_DrainPrimeEquGateNodePtr(0),
621 f_DrainPrimeEquBulkNodePtr(0),
622 f_DrainPrimeEquDrainPrimeNodePtr(0),
623 f_DrainPrimeEquSourcePrimeNodePtr(0),
625 f_SourcePrimeEquGateNodePtr(0),
626 f_SourcePrimeEquSourceNodePtr(0),
627 f_SourcePrimeEquBulkNodePtr(0),
628 f_SourcePrimeEquDrainPrimeNodePtr(0),
629 f_SourcePrimeEquSourcePrimeNodePtr(0),
632 q_DrainEquDrainNodePtr(0),
633 q_DrainEquDrainPrimeNodePtr(0),
635 q_GateEquGateNodePtr(0),
636 q_GateEquBulkNodePtr(0),
637 q_GateEquDrainPrimeNodePtr(0),
638 q_GateEquSourcePrimeNodePtr(0),
640 q_SourceEquSourceNodePtr(0),
641 q_SourceEquSourcePrimeNodePtr(0),
643 q_BulkEquGateNodePtr(0),
644 q_BulkEquBulkNodePtr(0),
645 q_BulkEquDrainPrimeNodePtr(0),
646 q_BulkEquSourcePrimeNodePtr(0),
648 q_DrainPrimeEquDrainNodePtr(0),
649 q_DrainPrimeEquGateNodePtr(0),
650 q_DrainPrimeEquBulkNodePtr(0),
651 q_DrainPrimeEquDrainPrimeNodePtr(0),
652 q_DrainPrimeEquSourcePrimeNodePtr(0),
654 q_SourcePrimeEquGateNodePtr(0),
655 q_SourcePrimeEquSourceNodePtr(0),
656 q_SourcePrimeEquBulkNodePtr(0),
657 q_SourcePrimeEquDrainPrimeNodePtr(0),
658 q_SourcePrimeEquSourcePrimeNodePtr(0),
815 const std::vector<int> & extLIDVecRef )
822 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
824 Xyce::dout() << section_divider << std::endl;
825 Xyce::dout() <<
" In Instance::register LIDs\n\n";
826 Xyce::dout() <<
" name = " <<
getName() << std::endl;
827 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
828 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
856 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
858 Xyce::dout() <<
"\n variable local indices:\n";
859 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
860 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
861 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
862 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
863 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
864 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
866 Xyce::dout() << section_divider << std::endl;
908 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
910 Xyce::dout() << std::endl;
911 Xyce::dout() << section_divider << std::endl;
912 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
913 Xyce::dout() <<
" name = " <<
getName() << std::endl;
914 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
934 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
936 Xyce::dout() <<
" State local indices:" << std::endl;
937 Xyce::dout() << std::endl;
946 Xyce::dout() << std::endl;
947 Xyce::dout() << section_divider << std::endl;
1013 std::vector<int> map;
1014 std::vector< std::vector<int> > map2;
1081 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1168 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
1177 Qeqbs = Dtype*(
qbs);
1178 Qeqbd = Dtype*(
qbd);
1181 Qeqgb = Dtype*(
qgb);
1182 Qeqgs = Dtype*(
qgs);
1183 Qeqgd = Dtype*(
qgd);
1186 coef = (Qeqgs+Qeqgd+Qeqgb);
1190 coef = Qeqbs + Qeqbd - Qeqgb;
1194 coef = -(Qeqbd + Qeqgd);
1198 coef = -(Qeqbs + Qeqgs);
1220 double gcgd, gcgs, gcgb, gcbs, gcbd;
1232 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
1240 double coef_Jdxp4 = Dtype*(
1246 double coef_Jdxp5 = Dtype*(
1279 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
1286 ceqbs = Dtype*(
cbs);
1287 ceqbd = Dtype*(
cbd);
1302 coef = (ceqgs+ceqgd+ceqgb);
1313 coef = ceqbs + ceqbd - ceqgb;
1333 double coef_Jdxp4 = Dtype*(
1338 double coef_Jdxp5 = Dtype*(
1345 double coef_Jdxp6 = Dtype*(
1429 +(gcbd+gcgd)*numberParallel;
1436 +(gcbs+gcgs)*numberParallel;
1468 (
gbs+
gbd)*numberParallel;
1507 bool bsuccess =
true;
1609 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
1793 double coeff0 = 0.0631353e0;
1794 double coeff1 = 0.8013292e0;
1795 double coeff2 = -0.01110777e0;
1894 <<
"HOMOTOPY INFO: before vds = " << vds << std::endl
1895 <<
"HOMOTOPY INFO: before vgs = " <<
vgs << std::endl;
1935 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1937 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << vds << std::endl;
1938 Xyce::dout() <<
"HOMOTOPY INFO: after vgs = " <<
vgs << std::endl;
1959 if ( (
mode==1?vbs:
vbd) <= 0.0 )
1962 sqphis = sqrt(
tPhi);
1965 sqphs3 =
tPhi*sqphis;
1967 sqphbs = sqrt(phibs);
1968 dsqdvb = -0.5/sqphbs;
1972 sqphis = sqrt(
tPhi);
1973 sqphs3 =
tPhi*sqphis;
1974 sqphbs = sqphis/(1.0+(
mode==1?vbs:
vbd)/
1976 phibs = sqphbs*sqphbs;
1977 dsqdvb = -phibs/(sqphs3+sqphs3);
1989 wponxj = wps*oneoverxj;
1990 wconxj = coeff0+coeff1*wponxj+coeff2*wponxj*wponxj;
1991 arga = wconxj+djonxj;
1992 argc = wponxj/(1.0+wponxj);
1993 argb = sqrt(1.0-argc*argc);
1994 fshort = 1.0-xjonxl*(arga*argb-djonxj);
1996 dadvb = (coeff1+coeff2*(wponxj+wponxj))*dwpdvb*oneoverxj;
1997 dbdvb = -argc*argc*(1.0-argc)*dwpdvb/(argb*wps);
1998 dfsdvb = -xjonxl*(dadvb*argb+arga*dbdvb);
2009 fbodys = 0.5*gammas/(sqphbs+sqphbs);
2012 onfbdy = 1.0/(1.0+fbody);
2013 dfbdvb = -fbodys*dsqdvb/sqphbs+fbodys*dfsdvb/fshort;
2015 dqbdvb = gammas*dsqdvb+
model_.
gamma*dfsdvb*sqphbs-
2036 cdonco = qbonco/(phibs+phibs);
2037 xn = 1.0+csonco+cdonco;
2039 dxndvb = dqbdvb/(phibs+phibs)-qbonco*dsqdvb/(phibs*sqphbs);
2041 dvodvb = dvtdvb+
vt*dxndvb;
2070 dfgdvd = -dfgdvg*dvtdvd;
2071 dfgdvb = -dfgdvg*dvtdvb;
2076 Vdsat = (vgsx-vth)*onfbdy;
2081 dvsdvd = -dvsdvg*dvtdvd;
2082 dvsdvb = -dvsdvg*dvtdvb-Vdsat*dfbdvb*onfbdy;
2088 arga = (vgsx-vth)*onfbdy;
2089 argb = sqrt(arga*arga+vdsc*vdsc);
2090 Vdsat = arga+vdsc-argb;
2091 dvsdga = (1.0-arga/argb)*onfbdy;
2092 dvsdvg = dvsdga-(1.0-vdsc/argb)*vdsc*dfgdvg*onfg;
2093 dvsdvd = -dvsdvg*dvtdvd;
2094 dvsdvb = -dvsdvg*dvtdvb-arga*dvsdga*dfbdvb;
2099 vdsx = std::min((
mode*vds),Vdsat);
2100 if ( vdsx == 0.0 )
goto line900;
2102 cdo = vgsx-vth-0.5*(1.0+fbody)*vdsx;
2103 dcodvb = -dvtdvb-0.5*dfbdvb*vdsx;
2111 gds = vgsx-vth-(1.0+fbody+dvtdvd)*vdsx;
2119 gm = Beta*
gm+dfgdvg*cd1;
2120 gds = Beta*
gds+dfgdvd*cd1;
2128 fdrain = 1.0/(1.0+vdsx*onvdsc);
2129 fd2 = fdrain*fdrain;
2130 arga = fd2*vdsx*onvdsc*onfg;
2131 dfddvg = -dfgdvg*arga;
2132 dfddvd = -dfgdvd*arga-fd2*onvdsc;
2133 dfddvb = -dfgdvb*arga;
2139 gmbs = fdrain*gmbs+dfddvb*
cdrain;
2147 if ( (
mode*vds) <= Vdsat )
goto line700;
2151 gdsat = cdsat*(1.0-fdrain)*onvdsc;
2152 gdsat = std::max(1.0e-12,gdsat);
2153 gdoncd = gdsat/cdsat;
2154 gdonfd = gdsat/(1.0-fdrain);
2155 gdonfg = gdsat*onfg;
2156 dgdvg = gdoncd*
gm-gdonfd*dfddvg+gdonfg*dfgdvg;
2157 dgdvd = gdoncd*
gds-gdonfd*dfddvd+gdonfg*dfgdvd;
2158 dgdvb = gdoncd*gmbs-gdonfd*dfddvb+gdonfg*dfgdvb;
2171 emoncd = emax/cdsat;
2172 emongd = emax/gdsat;
2173 demdvg = emoncd*
gm-emongd*dgdvg;
2174 demdvd = emoncd*
gds-emongd*dgdvd;
2175 demdvb = emoncd*gmbs-emongd*dgdvb;
2179 argb = sqrt(arga*arga+argc*((
mode*vds)-Vdsat));
2181 dldvd = argc/(argb+argb);
2183 ddldvg = dldem*demdvg;
2184 ddldvd = dldem*demdvd-dldvd;
2185 ddldvb = dldem*demdvb;
2190 dldvd = 0.5*delxl/((
mode*
vds)-Vdsat);
2204 ddldvg = ddldvg*arga;
2205 ddldvd = ddldvd*arga;
2206 ddldvb = ddldvb*arga;
2212 dlonxl = delxl*oneoverxl;
2213 xlfact = 1.0/(1.0-dlonxl);
2216 gm =
gm*xlfact+diddl*ddldvg;
2217 gds0 =
gds*xlfact+diddl*ddldvd;
2218 gmbs = gmbs*xlfact+diddl*ddldvb;
2219 gm =
gm+gds0*dvsdvg;
2220 gmbs = gmbs+gds0*dvsdvb;
2221 gds = gds0*dvsdvd+diddl*dldvd;
2227 if ( (
mode==1?
vgs:vgd) < Von )
2234 wfact = exp( ((
mode==1?
vgs:vgd)-Von)*ondvt );
2240 if ((
mode*vds) > Vdsat)
2242 gm =
gm+gds0*dvsdvg*wfact;
2244 gds =
gds*wfact+(gms-gmw)*dvodvd;
2245 gmbs = gmbs*wfact+(gms-gmw)*dvodvb-gmw*
2246 ((
mode==1?
vgs:vgd)-Von)*onxn*dxndvb;
2260 gds = Beta*(vgsx-vth);
2322 sarg = sargsw = 1/sqrt(arg);
2341 sargsw = 1/sqrt(arg);
2382 sarg = sargsw = 1/sqrt(arg);
2396 sargsw = 1/sqrt(arg);
2645 double ratio,ratio4;
2653 double gmanew,gmaold;
2658 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2660 Xyce::dout() << subsection_divider << std::endl;
2661 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
2662 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2663 Xyce::dout() << std::endl;
2667 if (temp_tmp != -999.0)
temp = temp_tmp;
2677 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2679 Xyce::dout() <<
"Temperature = "<<
temp << std::endl;
2680 Xyce::dout() <<
"tnom = " << tnom << std::endl;
2681 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2690 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
2694 Xyce::dout() <<
"vt = " <<
vt << std::endl;
2695 Xyce::dout() <<
"ratio = " << ratio << std::endl;
2696 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
2697 Xyce::dout() <<
"kt = " << kt << std::endl;
2698 Xyce::dout() <<
"egfet = " << egfet << std::endl;
2699 Xyce::dout() <<
"arg = " << arg << std::endl;
2700 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
2712 ratio4 = ratio * sqrt(ratio);
2716 tPhi = fact2 * phio + pbfact;
2913 double vgs1, vgd1, vbs1,vgb1, vds1;
3007 noiseData.
resize(numSources);
3018 std::string(
"_1overf");
3063 (2.0/3.0 * fabs(
gm)),
temp);
3099 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
3130 wkfng = 3.25 + .5 *
egfet1 - fermig;
3132 wkfngs = wkfng - (3.25 + .5 *
egfet1 +fermis);
3177 std::vector<Instance*>::iterator iter;
3181 for (iter=first; iter!=last; ++iter)
3183 (*iter)->processParams();
3201 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
3203 tnom(getDeviceOptions().tnom),
3205 jctSatCurDensity(0.0),
3207 drainResistance(0.0),
3208 sourceResistance(0.0),
3209 sheetResistance(0.0),
3210 transconductance(0.0),
3211 gateSourceOverlapCapFactor(0.0),
3212 gateDrainOverlapCapFactor(0.0),
3213 gateBulkOverlapCapFactor(0.0),
3214 oxideCapFactor(0.0),
3219 sideWallCapFactor(0.0),
3220 bulkJctPotential(0.0),
3221 bulkJctBotGradingCoeff(0.0),
3222 bulkJctSideGradingCoeff(0.0),
3223 fwdCapDepCoeff(0.0),
3226 substrateDoping(0.0),
3228 surfaceStateDensity(0.0),
3229 oxideThickness(0.0),
3230 surfaceMobility(0.0),
3233 coeffDepLayWidth(0.0),
3236 fastSurfaceStateDensity(0.0),
3245 bulkCapFactorGiven(0),
3246 sideWallCapFactorGiven(0)
3253 else if (
getType() ==
"PMOS") {
3288 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
3290 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
3308 std::vector<Instance*>::iterator iter;
3312 for (iter=first; iter!=last; ++iter)
3329 std::vector<Instance*>::const_iterator iter;
3335 os <<
" name model name Parameters" << std::endl;
3336 for (i=0, iter=first; iter!=last; ++iter, ++i)
3338 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
3363 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
3382 bool bsuccess =
true;
3392 double vgs1(0.0), vgd1(0.0), vbs1(0.0),vgb1(0.0), vds1(0.0);
3395 bsuccess = bsuccess && btmp;
3469 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
3478 double ceqbs(0.0),ceqbd(0.0),ceqgb(0.0), ceqgs(0.0), ceqgd(0.0);
3479 double Qeqbs(0.0),Qeqbd(0.0),Qeqgb(0.0), Qeqgs(0.0), Qeqgd(0.0);
3483 ceqbs = Dtype*(mi.
cbs);
3484 ceqbd = Dtype*(mi.
cbd);
3496 coef = (ceqgs+ceqgd+ceqgb);
3505 coef = ceqbs + ceqbd - ceqgb;
3518 Qeqbs = Dtype*(mi.
qbs);
3519 Qeqbd = Dtype*(mi.
qbd);
3522 Qeqgb = Dtype*(mi.
qgb);
3523 Qeqgs = Dtype*(mi.
qgs);
3524 Qeqgd = Dtype*(mi.
qgd);
3526 coef = (Qeqgs+Qeqgd+Qeqgb);
3530 coef = Qeqbs + Qeqbd - Qeqgb;
3534 coef = -(Qeqbd + Qeqgd);
3538 coef = -(Qeqbs + Qeqgs);
3546 double coef_Jdxp4 = Dtype*(
3550 double coef_Jdxp5 = Dtype*(
3556 double coef_Jdxp6 = Dtype*(
3569 double gcgd(0.0), gcgs(0.0), gcgb(0.0), gcbs(0.0), gcbd(0.0);
3581 gcgd = 0.0; gcgs = 0.0; gcgb = 0.0; gcbs = 0.0; gcbd = 0.0;
3588 double coef_Jdxp4 = Dtype*(
3593 double coef_Jdxp5 = Dtype*(
3598 double coef_Jdxp6 = Dtype*
3625 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
3773 int sizeInstances = instanceContainer_.size();
3774 for (
int i=0; i<sizeInstances; ++i)
3776 Instance & mi = *(instanceContainer_.at(i));
3892 .registerDevice(
"m", 3)
3893 .registerModelType(
"pmos", 3)
3894 .registerModelType(
"nmos", 3);
const InstanceName & getName() const
double defad
MOS drain diffusion area.
double * q_BulkEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacStamp
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
int ADrainPrimeEquBulkNodeOffset
double defw
MOS channel width.
static void initThermalModel(ParametricData< T > ¶metric_data)
Add the parameter "TEMPMODEL" to the parametric_data.
double * currStoVectorRawPtr
double * f_DrainPrimeEquDrainPrimeNodePtr
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
bool updateIntermediateVars()
bool updateDependentParameters()
double GateBulkOverlapCap
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
const DeviceOptions & deviceOptions_
double * q_BulkEquGateNodePtr
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
double * daeQVectorRawPtr
int ABulkEquDrainPrimeNodeOffset
int AGateEquBulkNodeOffset
static std::vector< std::vector< int > > jacMap2_DC_SC
double * q_SourcePrimeEquSourcePrimeNodePtr
int ASourcePrimeEquGateNodeOffset
double * dFdxdVpVectorRawPtr
double pnjlim(double vnew, double vold, double vt, double vcrit, int *icheck)
std::vector< int > devConMap
void qmeyer(double vgs, double vgd, double vgb, double von, double vdsat, double &capgs, double &capgd, double &capgb, double phi, double cox)
double * q_BulkEquDrainPrimeNodePtr
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.
std::vector< Instance * > instanceContainer
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
const std::string & getEncodedName() const
Return the instance name encoded as: [s:]*xname [s:]*Ytype!name [s:]*Utype!name!count.
double * currStaVectorRawPtr
double * f_SourcePrimeEquSourceNodePtr
static std::vector< std::vector< int > > jacStamp_DC
double gateBulkOverlapCapFactor
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
static void loadModelParameters(ParametricData< Model > &model_parameters)
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
void setNumStoreVars(int num_store_vars)
std::vector< double > gainScale_
MOSFET Devices, ArtificialParameters.
double getRandomPerturbation()
double * f_DrainEquDrainPrimeNodePtr
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...
int ADrainEquDrainNodeOffset
double * f_GateEquSourcePrimeNodePtr
int ADrainEquDrainPrimeNodeOffset
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 GateDrainOverlapCap
std::vector< int > li_Pos
Parameter is subject to being set to minimum junction capacitance.
void getNoiseSources(Xyce::Analysis::NoiseData &noiseData)
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
Parameter is subject to being set to minimum lead resistance.
double * q_GateEquSourcePrimeNodePtr
double fetlim(double vnew, double vold, double vto)
int ABulkEquSourcePrimeNodeOffset
double defl
MOS channel length.
double bulkJctBotGradingCoeff
double * f_SourcePrimeEquBulkNodePtr
double * f_SourcePrimeEquDrainPrimeNodePtr
double tnom
nominal temperature for device params.
double * f_SourcePrimeEquSourcePrimeNodePtr
double * storeLeadCurrQCompRawPtr
double * q_SourcePrimeEquSourceNodePtr
int ASourceEquSourcePrimeNodeOffset
int getNumStoreVars() const
double * f_GateEquGateNodePtr
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
double contVgst(double vgst, double alpha, double vgstConst=3.0)
std::vector< Param > params
Parameters from the line.
std::vector< double > noiseDens
double * q_DrainEquDrainNodePtr
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
std::vector< std::string > noiseNames
double * f_DrainEquDrainNodePtr
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
double * f_GateEquBulkNodePtr
bool processParams()
processParams
double * daeFVectorRawPtr
int ADrainPrimeEquDrainNodeOffset
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
virtual std::ostream & printOutInstances(std::ostream &os) const
double * f_DrainPrimeEquBulkNodePtr
const DeviceOptions & getDeviceOptions() const
double * f_BulkEquBulkNodePtr
double * q_DrainPrimeEquDrainPrimeNodePtr
double * f_BulkEquDrainPrimeNodePtr
double * nextStoVectorRawPtr
int getNumNoiseSources() const
double * f_SourceEquSourcePrimeNodePtr
double * q_DrainEquDrainPrimeNodePtr
double limvds(double vnew, double vold)
double * f_GateEquDrainPrimeNodePtr
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
double * q_SourcePrimeEquGateNodePtr
Linear::Matrix * dFdxMatrixPtr
const DeviceOptions & getDeviceOptions() const
Returns the device options given during device construction.
double * q_BulkEquBulkNodePtr
static std::vector< std::vector< int > > jacStamp_DC_SC
bool updateTemperature(const double &temp_tmp)
double GateSourceOverlapCap
int ABulkEquBulkNodeOffset
The Device class is an interface for device implementations.
double * f_SourcePrimeEquGateNodePtr
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
static std::vector< std::vector< int > > jacMap2
static std::vector< int > jacMap
double * f_SourceEquSourceNodePtr
double defas
MOS source diffusion area.
int AGateEquDrainPrimeNodeOffset
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
const SolverState & solverState_
int getGainScaleBlockID(int numBlocks)
double * dQdxdVpVectorRawPtr
Class Configuration contains device configuration data.
double * q_DrainPrimeEquBulkNodePtr
std::vector< double > lnNoiseDens
void setupNoiseSources(Xyce::Analysis::NoiseData &noiseData)
static std::vector< int > jacMap_SC
int ABulkEquGateNodeOffset
bool interpolateTNOM(double)
double * f_DrainPrimeEquGateNodePtr
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 gateSourceOverlapCapFactor
double fastSurfaceStateDensity
double * f_DrainPrimeEquSourcePrimeNodePtr
int ASourcePrimeEquSourceNodeOffset
const SolverState & getSolverState() const
int ASourcePrimeEquBulkNodeOffset
double * q_DrainPrimeEquDrainNodePtr
static std::vector< std::vector< int > > jacStamp_SC
Linear::Vector * nextStoVectorPtr
double * q_SourcePrimeEquDrainPrimeNodePtr
Linear::Vector * currStaVectorPtr
double * q_SourceEquSourceNodePtr
int ADrainPrimeEquDrainPrimeNodeOffset
static std::vector< int > jacMap_DC_SC
double * nextStaVectorRawPtr
#define Xyce_NONPOINTER_MATRIX_LOAD
double * q_GateEquBulkNodePtr
void noiseSupport(double &noise, double &lnNoise, const int type, const double param, const double temp)
bool sideWallCapFactorGiven
const std::string & getType() const
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
double gmin
minimum allowed conductance.
double * f_BulkEquGateNodePtr
double contVds(double vds, double alpha, double min=0.3)
double bulkJctSideGradingCoeff
double * q_GateEquDrainPrimeNodePtr
double * q_DrainPrimeEquSourcePrimeNodePtr
double * q_GateEquGateNodePtr
Linear::Vector * currStoVectorPtr
static std::vector< int > jacMap_DC
int AGateEquSourcePrimeNodeOffset
const ExternData & extData
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
int ASourceEquSourceNodeOffset
const std::vector< std::vector< int > > & jacobianStamp() const
ModelBlock represents a .MODEL line from the netlist.
int ADrainPrimeEquGateNodeOffset
int ADrainPrimeEquSourcePrimeNodeOffset
int AGateEquGateNodeOffset
double * q_SourceEquSourcePrimeNodePtr
Manages parameter binding for class C.
double * q_DrainPrimeEquGateNodePtr
int ASourcePrimeEquSourcePrimeNodeOffset
InstanceBlock represent a device instance line from the netlist.
static std::vector< std::vector< int > > jacMap2_SC
Util::Param temp
operating temperature of ckt.
std::vector< Param > params
int ASourcePrimeEquDrainPrimeNodeOffset
Linear::Matrix * dQdxMatrixPtr
double * f_DrainPrimeEquDrainNodePtr
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
double surfaceStateDensity
bool updatePrimaryState()
double * f_BulkEquSourcePrimeNodePtr
double * q_SourcePrimeEquBulkNodePtr
Linear::Vector * flagSolVectorPtr
static std::vector< std::vector< int > > jacMap2_DC
bool processInstanceParams()
processInstanceParams
const SolverState & getSolverState() const
Returns the solver state given during device construction.
void setModParams(const std::vector< Param > ¶ms)
double gateDrainOverlapCapFactor
double * nextSolVectorRawPtr
int numLeadCurrentStoreVars