45 #include <Xyce_config.h>
48 #include <N_UTL_Math.h>
60 #include <N_ERH_ErrorMgr.h>
61 #include <N_LAS_Matrix.h>
62 #include <N_LAS_Vector.h>
63 #include <N_UTL_FeatureTest.h>
64 #include <N_UTL_MachDepParams.h>
79 .setDescription(
"Channel length");
84 .setDescription(
"Channel width");
89 .setDescription(
"Drain diffusion area");
94 .setDescription(
"Source diffusion area");
99 .setDescription(
"Multiplier for RSH to yield parasitic resistance of drain");
104 .setDescription(
"Multiplier for RSH to yield parasitic resistance of source");
109 .setDescription(
"Drain diffusion perimeter");
114 .setDescription(
"Source diffusion perimeter");
119 .setDescription(
"Multiplier for M devices connected in parallel");
125 .setDescription(
"Device temperature");
133 .setDescription(
"Gate length of nominal device");
138 .setDescription(
"Gate width of nominal device");
143 .setDescription(
"Zero-bias threshold voltage");
148 .setDescription(
"Surface potential");
154 .setDescription(
"Drain ohmic resistance");
159 .setDescription(
"Gate ohmic resistance");
165 .setDescription(
"Source ohmic resistance");
172 .setDescription(
"Zero-bias bulk-drain p-n capacitance");
179 .setDescription(
"Zero-bias bulk-source p-n capacitance");
189 .setDescription(
"Bulk p-n saturation current");
194 .setDescription(
"Bulk p-n bottom potential");
199 .setDescription(
"Gate-source overlap capacitance/channel width");
204 .setDescription(
"Gate-drain overlap capacitance/channel width");
209 .setDescription(
"Gate-bulk overlap capacitance/channel length");
214 .setDescription(
"Drain,source diffusion sheet resistance");
220 .setDescription(
"Bulk p-n zero-bias bottom capacitance/area");
225 .setDescription(
"Bulk p-n bottom grading coefficient");
231 .setDescription(
"Bulk p-n zero-bias sidewall capacitance/area");
236 .setDescription(
"Bulk p-n sidewall grading coefficient");
241 .setDescription(
"Bulk p-n saturation current density");
246 .setDescription(
"Gate oxide thickness");
251 .setDescription(
"Lateral diffusion length");
256 .setDescription(
"Surface mobility");
261 .setDescription(
"Surface mobility");
266 .setDescription(
"Coefficient for forward-bias depletion capacitance formula");
271 .setDescription(
"Substrate doping density");
276 .setDescription(
"Surface state density");
281 .setDescription(
"Parameter measurement temperature");
286 .setDescription(
"Maximum drift velocity for carriers");
291 .setDescription(
"Metallurgical junction depth");
296 .setDescription(
"Output conductance parameter");
301 .setDescription(
"Transition width parameter");
306 .setDescription(
"Subthreshold ideality factor");
311 .setDescription(
"Knee shape parameter");
321 .setDescription(
"DIBL parameter");
326 .setDescription(
"DIBL parameter");
331 .setDescription(
"DIBL parameter");
336 .setDescription(
"Mobility degradation parameter");
341 .setDescription(
"Body effect constant in front of square root term");
346 .setDescription(
"Body effect constant in front of linear term");
351 .setDescription(
"Sensitivity of gS on device length");
356 .setDescription(
"Sensitivity of gS on device width");
361 .setDescription(
"Sensitivity of gL on device length");
366 .setDescription(
"Sensitivity of gL on device width");
431 .setDescription(
"Charge partitioning factor");
436 .setDescription(
"Transition width parameter used by the charge partitioning scheme");
441 .setDescription(
"Flat band voltage");
446 .setDescription(
"Parameter accounting for the threshold dependence on the channel potential");
487 .setDescription(
"Drift region resistance intercept parameter");
492 .setDescription(
"Drift region resistance slope parameter");
497 .setDescription(
"Drain-source shunt resistance");
502 .setDescription(
"Drain-Source diode saturation current");
507 .setDescription(
"Drain-source diode ohmic resistance");
512 .setDescription(
"Drain-source diode emission coefficient");
517 .setDescription(
"Drain-source diode transit time");
522 .setDescription(
"Drain-source diode junction capacitance");
527 .setDescription(
"Drain-source diode junction potential");
532 .setDescription(
"Drain-source diode grading coefficient");
537 .setDescription(
"Drain-source diode activation energy");
542 .setDescription(
"Drain-source diode sat. current temperature exponent");
547 .setDescription(
"Drain-source diode forward bias depletion capacitance");
553 .setDescription(
"Drain-source diode reverse breakdown voltage");
558 .setDescription(
"Drain-source diode current at breakdown voltage");
563 .setDescription(
"Drain-source diode high injection knee currrent");
568 .setDescription(
"Drain-source diode recombination saturation current");
573 .setDescription(
"Drain-source diode recombination emission coefficient");
578 .setDescription(
"Drain-source diode flicker noise coefficient");
583 .setDescription(
"Drain-source diode flicker noise exponent");
588 .setDescription(
"Drain-source diode nominal temperature");
594 .setDescription(
"Gate material type (-1 = same as substrate, 0 = aluminum,1 = opposite of substrate)");
599 .setDescription(
"Charge model storage selector");
604 .setDescription(
"Meyer-like capacitor model selector");
609 .setDescription(
"Charge partitioning scheme selector");
688 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
694 tnom(getDeviceOptions().tnom),
696 jctSatCurDensity(0.0),
698 drainResistance(0.0),
700 sourceResistance(0.0),
701 sheetResistance(0.0),
702 gateSourceOverlapCapFactor(0.0),
703 gateDrainOverlapCapFactor(0.0),
704 gateBulkOverlapCapFactor(0.0),
711 sideWallCapFactor(0.0),
712 bulkJctPotential(0.0),
713 bulkJctBotGradingCoeff(0.0),
714 bulkJctSideGradingCoeff(0.0),
719 substrateDoping(0.0),
720 surfaceStateDensity(0.0),
722 surfaceMobility(0.0),
723 surfaceMobility0(0.0),
727 bulkCapFactorGiven(0),
728 sideWallCapFactorGiven(0),
804 D1DIOconductance(0.0),
805 D1DIOemissionCoeff(0.0),
806 D1DIOtransitTime(0.0),
807 D1DIOjunctionCap(0.0),
808 D1DIOjunctionPot(0.0),
809 D1DIOgradingCoeff(0.0),
810 D1DIOactivationEnergy(0.0),
811 D1DIOsaturationCurrentExp(0.0),
812 D1DIOdepletionCapCoeff(0.0),
813 D1DIObreakdownVoltage(0.0),
814 D1DIObreakdownCurrent(0.0),
823 D1DIObreakdownVoltageGiven(0)
832 else if (
getType() ==
"PMOS") {
870 UserError0(*
this) <<
"Both uo and u0 have been specified and, which is not allowed";
872 UserWarning0(*
this) <<
"Surface mobility has been specified as u0 instead of uo, uo is the preferred syntax";
879 UserError0(*
this) <<
"ETA cannot be zero for level 18";
884 UserError0(*
this) <<
"Both driftParamA and driftParamB cannot be zero";
887 if(
cv != 1 &&
cv != 2)
889 UserError0(*
this) <<
"Model error: use cv=1 (Meyer's model) or cv=2 (Meyer-like Model)";
894 UserError0(*
this) <<
"Model error: use fpe=1 (and xqc), fpe=2 (and xqc,mcv) or fpe=3";
899 UserError0(*
this) <<
"Model error: charge conservation requires mcv > 1";
904 UserError0(*
this) <<
"Model error: charge conservation requires 0.5 <= xqc <= 1.0";
914 UserWarning0(*
this) <<
"grading coefficient too large, limited to 0.9";
921 UserWarning0(*
this) <<
"activation energy too small, limited to 0.1";
928 UserWarning0(*
this) <<
"coefficient Fc too large, limited to 0.95";
934 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
936 Xyce::dout() <<
" " << std::endl;
937 Xyce::dout() <<
"l0 " <<
l0 << std::endl;
938 Xyce::dout() <<
"w0 " <<
w0 << std::endl;
939 Xyce::dout() <<
"vt0 = " <<
vt0 << std::endl;
940 Xyce::dout() <<
"gamma = " <<
gamma << std::endl;
941 Xyce::dout() <<
"lambda = " <<
lambda << std::endl;
942 Xyce::dout() <<
"phi = " <<
phi << std::endl;
944 Xyce::dout() <<
"gateResistance = " <<
gateResistance << std::endl;
946 Xyce::dout() <<
"capBD = " <<
capBD << std::endl;
947 Xyce::dout() <<
"capBS = " <<
capBS << std::endl;
948 Xyce::dout() <<
"timeScale = " <<
timeScale << std::endl;
949 Xyce::dout() <<
"jctSatCur = " <<
jctSatCur << std::endl;
955 Xyce::dout() <<
"bulkCapFactor = " <<
bulkCapFactor << std::endl;
960 Xyce::dout() <<
"oxideThickness = " <<
oxideThickness << std::endl;
961 Xyce::dout() <<
"oxideCapFactor = " <<
oxideCapFactor << std::endl;
962 Xyce::dout() <<
"latDiff = " <<
latDiff << std::endl;
964 Xyce::dout() <<
"fwdCapDepCoeff = " <<
fwdCapDepCoeff << std::endl;
966 Xyce::dout() <<
"gateType = " <<
gateType << std::endl;
968 Xyce::dout() <<
"tnom = " <<
tnom << std::endl;
969 Xyce::dout() <<
"driftParamA = " <<
driftParamA << std::endl;
970 Xyce::dout() <<
"driftParamB = " <<
driftParamB << std::endl;
971 Xyce::dout() <<
"rdsshunt = " <<
rdsshunt << std::endl;
986 std::vector<Instance*>::iterator iter;
990 for (iter=first; iter!=last; ++iter)
1008 std::vector<Instance*>::const_iterator iter;
1014 os <<
" name model name Parameters" << std::endl;
1015 for (i=0, iter=first; iter!=last; ++iter, ++i)
1017 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1043 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1068 egfet1 = 1.16-(7.02e-4*tnom*
tnom)/(tnom+1108);
1090 wkfng = 3.25 + 0.5 *
egfet1 - fermig;
1092 wkfngs = wkfng - (3.25 + 0.5 *
egfet1 + fermis);
1126 if(fabs(
vfb) < 1e-12)
1163 std::vector<Instance*>::iterator iter;
1167 for (iter=first; iter!=last; ++iter)
1169 (*iter)->processParams();
1191 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
1200 l(getDeviceOptions().defl),
1201 w(getDeviceOptions().defw),
1202 drainArea(getDeviceOptions().defad),
1203 sourceArea(getDeviceOptions().defas),
1206 drainPerimeter(0.0),
1207 sourcePerimeter(0.0),
1211 draindriftCond(0.0),
1220 temp(getDeviceOptions().temp.getImmutableValue<double>()),
1239 draindriftVcrit(0.0),
1274 GateSourceOverlapCap(0),
1275 GateDrainOverlapCap(0),
1276 GateBulkOverlapCap(0),
1311 D1DIOcapCharge(0.0),
1312 D1DIOcapCurrent(0.0),
1348 li_SourcePrime (-1),
1358 ADrainEquDrainNodeOffset (-1),
1359 ADrainEquSourceNodeOffset (-1),
1360 ADrainEquDrainDriftNodeOffset (-1),
1361 ADrainEquD1PrimeNodeOffset (-1),
1363 AGateEquGateNodeOffset (-1),
1364 AGateEquGatePrimeNodeOffset (-1),
1366 ASourceEquDrainNodeOffset (-1),
1367 ASourceEquSourceNodeOffset (-1),
1368 ASourceEquSourcePrimeNodeOffset (-1),
1370 ABulkEquBulkNodeOffset (-1),
1371 ABulkEquDrainPrimeNodeOffset (-1),
1372 ABulkEquGatePrimeNodeOffset (-1),
1373 ABulkEquSourcePrimeNodeOffset (-1),
1375 ADrainPrimeEquBulkNodeOffset (-1),
1376 ADrainPrimeEquDrainPrimeNodeOffset (-1),
1377 ADrainPrimeEquGatePrimeNodeOffset (-1),
1378 ADrainPrimeEquSourcePrimeNodeOffset (-1),
1379 ADrainPrimeEquDrainDriftNodeOffset (-1),
1381 AGatePrimeEquGateNodeOffset (-1),
1382 AGatePrimeEquBulkNodeOffset (-1),
1383 AGatePrimeEquDrainPrimeNodeOffset (-1),
1384 AGatePrimeEquGatePrimeNodeOffset (-1),
1385 AGatePrimeEquSourcePrimeNodeOffset (-1),
1387 ASourcePrimeEquSourceNodeOffset (-1),
1388 ASourcePrimeEquBulkNodeOffset (-1),
1389 ASourcePrimeEquDrainPrimeNodeOffset (-1),
1390 ASourcePrimeEquGatePrimeNodeOffset (-1),
1391 ASourcePrimeEquSourcePrimeNodeOffset (-1),
1393 ADrainDriftEquDrainNodeOffset (-1),
1394 ADrainDriftEquDrainPrimeNodeOffset (-1),
1395 ADrainDriftEquDrainDriftNodeOffset (-1),
1397 AD1PrimeEquDrainNodeOffset (-1),
1398 AD1PrimeEquSourceNodeOffset (-1),
1399 AD1PrimeEquD1PrimeNodeOffset (-1),
1403 f_DrainEquDrainNodePtr(0),
1404 f_DrainEquSourceNodePtr(0),
1405 f_DrainEquDrainDriftNodePtr(0),
1406 f_DrainEquD1PrimeNodePtr(0),
1408 f_GateEquGateNodePtr(0),
1409 f_GateEquGatePrimeNodePtr(0),
1411 f_SourceEquDrainNodePtr(0),
1412 f_SourceEquSourceNodePtr(0),
1413 f_SourceEquSourcePrimeNodePtr(0),
1414 f_SourceEquD1PrimeNodePtr(0),
1416 f_BulkEquBulkNodePtr(0),
1417 f_BulkEquDrainPrimeNodePtr(0),
1418 f_BulkEquGatePrimeNodePtr(0),
1419 f_BulkEquSourcePrimeNodePtr(0),
1421 f_DrainPrimeEquBulkNodePtr(0),
1422 f_DrainPrimeEquDrainPrimeNodePtr(0),
1423 f_DrainPrimeEquGatePrimeNodePtr(0),
1424 f_DrainPrimeEquSourcePrimeNodePtr(0),
1425 f_DrainPrimeEquDrainDriftNodePtr(0),
1427 f_GatePrimeEquGateNodePtr(0),
1428 f_GatePrimeEquBulkNodePtr(0),
1429 f_GatePrimeEquDrainPrimeNodePtr(0),
1430 f_GatePrimeEquGatePrimeNodePtr(0),
1431 f_GatePrimeEquSourcePrimeNodePtr(0),
1433 f_SourcePrimeEquSourceNodePtr(0),
1434 f_SourcePrimeEquBulkNodePtr(0),
1435 f_SourcePrimeEquDrainPrimeNodePtr(0),
1436 f_SourcePrimeEquGatePrimeNodePtr(0),
1437 f_SourcePrimeEquSourcePrimeNodePtr(0),
1439 f_DrainDriftEquDrainNodePtr(0),
1440 f_DrainDriftEquDrainPrimeNodePtr(0),
1441 f_DrainDriftEquDrainDriftNodePtr(0),
1443 f_D1PrimeEquDrainNodePtr(0),
1444 f_D1PrimeEquSourceNodePtr(0),
1445 f_D1PrimeEquD1PrimeNodePtr(0),
1448 q_DrainEquDrainNodePtr(0),
1449 q_DrainEquSourceNodePtr(0),
1450 q_DrainEquDrainDriftNodePtr(0),
1451 q_DrainEquD1PrimeNodePtr(0),
1453 q_GateEquGateNodePtr(0),
1454 q_GateEquGatePrimeNodePtr(0),
1456 q_SourceEquDrainNodePtr(0),
1457 q_SourceEquSourceNodePtr(0),
1458 q_SourceEquSourcePrimeNodePtr(0),
1459 q_SourceEquD1PrimeNodePtr(0),
1461 q_BulkEquBulkNodePtr(0),
1462 q_BulkEquDrainPrimeNodePtr(0),
1463 q_BulkEquGatePrimeNodePtr(0),
1464 q_BulkEquSourcePrimeNodePtr(0),
1466 q_DrainPrimeEquBulkNodePtr(0),
1467 q_DrainPrimeEquDrainPrimeNodePtr(0),
1468 q_DrainPrimeEquGatePrimeNodePtr(0),
1469 q_DrainPrimeEquSourcePrimeNodePtr(0),
1470 q_DrainPrimeEquDrainDriftNodePtr(0),
1472 q_GatePrimeEquGateNodePtr(0),
1473 q_GatePrimeEquBulkNodePtr(0),
1474 q_GatePrimeEquDrainPrimeNodePtr(0),
1475 q_GatePrimeEquGatePrimeNodePtr(0),
1476 q_GatePrimeEquSourcePrimeNodePtr(0),
1478 q_SourcePrimeEquSourceNodePtr(0),
1479 q_SourcePrimeEquBulkNodePtr(0),
1480 q_SourcePrimeEquDrainPrimeNodePtr(0),
1481 q_SourcePrimeEquGatePrimeNodePtr(0),
1482 q_SourcePrimeEquSourcePrimeNodePtr(0),
1484 q_DrainDriftEquDrainNodePtr(0),
1485 q_DrainDriftEquDrainPrimeNodePtr(0),
1486 q_DrainDriftEquDrainDriftNodePtr(0),
1488 q_D1PrimeEquDrainNodePtr(0),
1489 q_D1PrimeEquSourceNodePtr(0),
1490 q_D1PrimeEquD1PrimeNodePtr(0),
1539 li_state_capgdd(-1),
1549 li_state_D1DIOcapCharge(-1),
1552 li_store_dev_id(-1),
1553 li_store_dev_ig(-1),
1554 li_store_dev_is(-1),
1774 UserError0(*
this) <<
"Effective channel length less than zero.";
1812 const std::vector<int> & extLIDVecRef )
1817 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1819 Xyce::dout() << section_divider << std::endl;
1820 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1821 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1822 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1823 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1862 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1864 Xyce::dout() <<
"\n variable local indices:\n";
1865 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1866 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1867 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1868 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1869 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1870 Xyce::dout() <<
" li_GatePrime = " <<
li_GatePrime << std::endl;
1871 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1872 Xyce::dout() <<
" li_DrainDrift = " <<
li_DrainDrift << std::endl;
1873 Xyce::dout() <<
" li_D1Prime = " <<
li_D1Prime << std::endl;
1875 Xyce::dout() << section_divider << std::endl;
1925 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1927 Xyce::dout() << std::endl;
1928 Xyce::dout() << section_divider << std::endl;
1929 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1930 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1931 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1965 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1967 Xyce::dout() <<
" State local indices:" << std::endl;
1968 Xyce::dout() << std::endl;
1970 Xyce::dout() <<
" li_state_vbdd = " <<
li_state_vbdd <<
"\n";
1971 Xyce::dout() <<
" li_state_vbs = " <<
li_state_vbs <<
"\n";
1972 Xyce::dout() <<
" li_state_vgps = " <<
li_state_vgps <<
"\n";
1973 Xyce::dout() <<
" li_state_vdds = " <<
li_state_vdds <<
"\n";
1974 Xyce::dout() <<
" li_state_qgs = " <<
li_state_qgs <<
"\n";
1979 Xyce::dout() <<
" li_state_qgdd = " <<
li_state_qgdd <<
"\n";
1981 Xyce::dout() <<
" li_state_qgb = " <<
li_state_qgb <<
"\n";
1983 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs <<
"\n";
1985 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd <<
"\n";
1989 Xyce::dout() <<
" li_state_von = " <<
li_state_von <<
"\n";
1991 Xyce::dout() << std::endl;
1992 Xyce::dout() << section_divider << std::endl;
2062 std::vector<int> map;
2063 std::vector< std::vector<int> > map2;
2243 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
2367 double coef_Jdxp(0.0);
2369 double ceqbs(0.0), ceqbd(0.0), ceqgb(0.0), ceqgs(0.0), ceqgdd(0.0);
2376 ceqgdd = Dtype*
qgdd;
2378 qVec[
li_Bulk] += (ceqbs + ceqbd - ceqgb);
2391 dQdxdVp[
li_Bulk] += coef_Jdxp;
2464 double coef_Jdxp(0.0), gd_Jdxp(0.0);
2468 double ceqbs = Dtype*(
cbs+
cqbs);
2469 double ceqbd = Dtype*(
cbd+
cqbd);
2471 double D1current = Dtype*
D1cdeq;
2480 fVec[
li_Bulk] += (ceqbs + ceqbd);
2492 dFdxdVp[
li_Bulk] += coef_Jdxp;
2495 coef_Jdxp = Dtype*(-((
gbd-gmin1))*
2691 bool bsuccess =
true;
2698 #define ISUBMOD model_.isubmod
2710 double capgs_old(0.0);
2711 double capgdd_old(0.0);
2712 double capgb_old(0.0);
2716 double D1power(0.0);
2721 double D1csatr(0.0);
2722 double D1czero(0.0);
2723 double D1czof2(0.0);
2727 double D1evrev(0.0);
2730 double D1vdtemp(0.0);
2734 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2736 Xyce::dout() << subsection_divider << std::endl;
2737 Xyce::dout() <<
" Instance::updateIntermediateVars.\n"<<std::endl;
2738 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2739 Xyce::dout() <<
" Model name = " <<
model_.
getName() << std::endl;
2740 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
2741 Xyce::dout() << std::endl;
2742 Xyce::dout().width(25); Xyce::dout().precision(17); Xyce::dout().setf(std::ios::scientific);
2783 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2785 Xyce::dout() <<
" " << std::endl;
2786 Xyce::dout() <<
" Solution vector: " << std::endl;
2787 Xyce::dout() <<
" Vg = " <<
Vg << std::endl;
2788 Xyce::dout() <<
" Vd = " <<
Vd << std::endl;
2789 Xyce::dout() <<
" Vs = " <<
Vs << std::endl;
2790 Xyce::dout() <<
" Vb = " <<
Vb << std::endl;
2791 Xyce::dout() <<
" Vdp = " <<
Vdp << std::endl;
2792 Xyce::dout() <<
" Vgp = " <<
Vgp << std::endl;
2793 Xyce::dout() <<
" Vsp = " <<
Vsp << std::endl;
2794 Xyce::dout() <<
" Vdd = " <<
Vdd << std::endl;
2795 Xyce::dout() <<
" Vd1p= " <<
Vd1p << std::endl;
2839 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2898 Xyce::dout() <<
"After Von first set, ";
2899 Xyce::dout() <<
" von = " <<
von <<
" Von = " << Von << std::endl;
2907 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2909 Xyce::dout() <<
" checking whether to limit voltages "<< std::endl;
2910 Xyce::dout() <<
" Von = " << Von << std::endl;
2911 Xyce::dout() <<
" before limiting: " << std::endl;
2912 Xyce::dout() <<
" vgpdd = " <<
vgpdd <<
" vgpdd_old = " <<
vgpdd_old << std::endl;
2913 Xyce::dout() <<
" vgps = " <<
vgps <<
" vgps_old = " <<
vgps_old << std::endl;
2914 Xyce::dout() <<
" vdds = " << vdds <<
" vdds_old = " <<
vdds_old << std::endl;
2915 Xyce::dout() <<
" vbs = " <<
vbs <<
" vbs_old = " <<
vbs_old << std::endl;
2916 Xyce::dout() <<
" vbdd = " <<
vbdd <<
" vbdd_old = " <<
vbdd_old << std::endl;
2946 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2948 Xyce::dout() <<
" After limiting: " << std::endl;
2949 Xyce::dout() <<
" vgpdd = " <<
vgpdd << std::endl;
2950 Xyce::dout() <<
" vgps = " <<
vgps << std::endl;
2951 Xyce::dout() <<
" vdds = " << vdds << std::endl;
2952 Xyce::dout() <<
" vbs = " <<
vbs << std::endl;
2953 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
2957 bool tmpGiven =
false;
2984 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2986 Xyce::dout() <<
" vbs = " << vbs << std::endl;
2987 Xyce::dout() <<
" vgps = " <<
vgps << std::endl;
2988 Xyce::dout() <<
" vdds = " << vdds << std::endl;
2989 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
2990 Xyce::dout() <<
" vgpdd= " <<
vgpdd << std::endl;
2992 Xyce::dout() <<
" Vddp = " <<
Vddp << std::endl;
2993 Xyce::dout() <<
" Vddd = " <<
Vddd << std::endl;
2994 Xyce::dout() <<
" Vdddp= " <<
Vdddp << std::endl;
2995 Xyce::dout() <<
" Vssp = " <<
Vssp << std::endl;
2996 Xyce::dout() <<
" Vbsp = " <<
Vbsp << std::endl;
2997 Xyce::dout() <<
" Vbdp = " <<
Vbdp << std::endl;
2998 Xyce::dout() <<
" Vggp = " <<
Vggp << std::endl;
2999 Xyce::dout() <<
" Vgpsp = " <<
Vgpsp << std::endl;
3000 Xyce::dout() <<
" Vgpdp = " <<
Vgpdp << std::endl;
3001 Xyce::dout() <<
" Vgpb = " <<
Vgpb << std::endl;
3002 Xyce::dout() <<
" Vdpsp= " <<
Vdpsp << std::endl;
3010 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3014 Xyce::dout() <<
" Something modified the voltages. " << std::endl;
3015 Xyce::dout() <<
" Voltage before after diff " << std::endl;
3017 Xyce::dout() <<
" vdds " <<
vdds_orig <<
" " << vdds <<
" " << vdds-
vdds_orig << std::endl;
3018 Xyce::dout() <<
" vbs " <<
vbs_orig <<
" " << vbs <<
" " << vbs-
vbs_orig << std::endl;
3053 j1=
model_.
artd*log(end1/end2)*(pi/2+atan(end3));
3058 d1j1=(fr1-fr2)*(pi/2+atan(end3));
3060 d2j1=log(end1/end2)*fr3;
3079 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3081 Xyce::dout() <<
"*******Setting cbs for vbs<=0 ******" << std::endl;
3082 Xyce::dout() <<
" vbs = " << vbs << std::endl;
3083 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3084 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3085 Xyce::dout() <<
" SSC = " <<
SourceSatCur << std::endl;
3086 Xyce::dout() <<
" gbs = " << gbs << std::endl;
3087 Xyce::dout() <<
" cbs = " <<
cbs << std::endl;
3088 Xyce::dout() <<
" j1 = " << j1 << std::endl;
3101 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3103 Xyce::dout() <<
"*******Setting cbs for vbs>0 ******" << std::endl;
3104 Xyce::dout() <<
" vbs = " << vbs << std::endl;
3105 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3106 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3107 Xyce::dout() <<
" vbs/vt = " << vbs/
vt << std::endl;
3111 Xyce::dout() <<
" evbs = " << evbs << std::endl;
3112 Xyce::dout() <<
" gbs = " <<
gbs << std::endl;
3113 Xyce::dout() <<
" cbs = " << cbs << std::endl;
3125 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3127 Xyce::dout() <<
"*******Setting cbd for vbdd<=0 ******" << std::endl;
3128 Xyce::dout() <<
" vbdd = " << vbdd << std::endl;
3129 Xyce::dout() <<
" SSC = " <<
SourceSatCur << std::endl;
3130 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3131 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3132 Xyce::dout() <<
" gbd = " << gbd << std::endl;
3133 Xyce::dout() <<
" cbd = " <<
cbd << std::endl;
3149 Xyce::dout() <<
"*******Setting cbd for vbdd>0 ******" << std::endl;
3150 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
3151 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3152 Xyce::dout() <<
" vbdd/vt = " <<
vbdd/
vt << std::endl;
3156 Xyce::dout() <<
" evbdd = " << evbdd << std::endl;
3157 Xyce::dout() <<
" gbd = " <<
gbd << std::endl;
3158 Xyce::dout() <<
" cbd = " << cbd << std::endl;
3167 double dvonvbs(0.0);
3168 double lvbs =
mode == 1 ? vbs :
vbdd;
3206 D1evd = D1arg = D1evrev = 0.0;
3211 D1evr = exp(
D1vd/D1vtr);
3213 D1arg = D1temp*D1temp;
3215 D1isr = D1csatr*D1power;
3216 D1cdr = D1isr*(D1evr - 1);
3240 D1arg = D1arg * D1arg * D1arg;
3252 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3254 Xyce::dout() <<
" " << std::endl;
3255 Xyce::dout() <<
" dtype = " <<
model_.
dtype << std::endl;
3256 Xyce::dout() <<
" D1vd = " <<
D1vd << std::endl;
3257 Xyce::dout() <<
" D1vtr = " << D1vtr << std::endl;
3258 Xyce::dout() <<
" D1csat = " << D1csat << std::endl;
3259 Xyce::dout() <<
" D1csatr = " << D1csatr << std::endl;
3260 Xyce::dout() <<
" D1gspr = " <<
D1gspr << std::endl;
3261 Xyce::dout() <<
" D1cdr = " << D1cdr << std::endl;
3262 Xyce::dout() <<
" D1gdr = " << D1gdr << std::endl;
3263 Xyce::dout() <<
" D1vte = " <<
D1vte << std::endl;
3264 Xyce::dout() <<
" D1evd = " << D1evd << std::endl;
3265 Xyce::dout() <<
" D1arg = " << D1arg << std::endl;
3266 Xyce::dout() <<
" D1evrev = " << D1evrev << std::endl;
3267 Xyce::dout() <<
" D1DIOtBrkdwnV = " <<
D1DIOtBrkdwnV << std::endl << std::endl;
3268 Xyce::dout() <<
" D1cd = " << D1cd << std::endl;
3269 Xyce::dout() <<
" D1gd = " <<
D1gd << std::endl;
3270 Xyce::dout() <<
" D1cdeq = " <<
D1cdeq << std::endl;
3310 sarg = sargsw = 1/sqrt(arg);
3329 sargsw = 1/sqrt(arg);
3369 sarg = sargsw = 1/sqrt(arg);
3383 sargsw = 1/sqrt(arg);
3393 +
Cbdsw*(1-arg*sargsw)
3436 Xyce::dout() <<
" " << std::endl;
3437 Xyce::dout() <<
" Going into qmeyer..." << std::endl;
3438 Xyce::dout() <<
" Mode is " <<
mode << std::endl;
3439 Xyce::dout() <<
" Args are vgps = " <<
vgps <<
" vgpdd = " <<
vgpdd << std::endl;
3440 Xyce::dout() <<
" Vgpb = " <<
Vgpb <<
" Von = " << Von <<
" Vddsat = " << Vddsat << std::endl;
3441 Xyce::dout() <<
" tPhi = " <<
tPhi <<
" OxideCap = " <<
OxideCap << std::endl;
3484 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3485 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3486 Xyce::dout() <<
" capgdd = " <<
capgdd <<
" capgdd_old = " << capgdd_old << std::endl;
3487 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3495 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3496 Xyce::dout() <<
"Capgdd = " <<
Capgdd << std::endl;
3497 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3498 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3499 Xyce::dout() <<
"capgdd = " <<
capgdd << std::endl;
3500 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3507 double absV = fabs(
Vddd);
3514 double dVddd_dVd (1.0);
3515 double d_absVddd_dVd (0.0);
3518 d_absVddd_dVd = 1.0;
3520 else if (
Vddd < 0.0)
3522 d_absVddd_dVd = -1.0;
3565 Xyce::dout() <<
" Done with Instance::updateIntermediateVars " << std::endl;
3566 Xyce::dout() <<
" mode = " <<
mode << std::endl;
3567 Xyce::dout() <<
" Idrain = " <<
Idrain << std::endl;
3568 Xyce::dout() <<
" Igate = " <<
Igate << std::endl;
3569 Xyce::dout() <<
" Isource = " <<
Isource << std::endl;
3570 Xyce::dout() <<
" Idraindrift = " <<
Idraindrift << std::endl;
3571 Xyce::dout() <<
" Ird1rs = " << Ird1rs << std::endl;
3572 Xyce::dout() <<
" dIdd_dVd = " <<
dIdd_dVd << std::endl;
3573 Xyce::dout() <<
" gddd = " <<
gddd << std::endl;
3574 Xyce::dout() <<
" Irdsshunt = " <<
Irdsshunt << std::endl;
3575 Xyce::dout() <<
" D1DIOcapCurrent = " <<
D1DIOcapCurrent << std::endl;
3576 Xyce::dout() <<
" cbd = " << cbd << std::endl;
3577 Xyce::dout() <<
" cbs = " <<
cbs << std::endl;
3578 Xyce::dout() <<
" qbd = " <<
qbd << std::endl;
3579 Xyce::dout() <<
" qbs = " <<
qbs << std::endl;
3580 Xyce::dout() <<
" cdrain = " <<
cdrain << std::endl;
3581 Xyce::dout() <<
" cdraindrift = " <<
cdraindrift << std::endl;
3582 Xyce::dout() <<
" cdreq = " <<
cdreq << std::endl;
3583 Xyce::dout() <<
" gdds = " <<
gdds << std::endl;
3584 Xyce::dout() <<
" gdsshunt = " <<
gdsshunt << std::endl;
3585 Xyce::dout() <<
" gm = " <<
gm << std::endl;
3586 Xyce::dout() <<
" gmbs = " <<
gmbs << std::endl;
3587 Xyce::dout() <<
" Gm = " <<
Gm << std::endl;
3588 Xyce::dout() <<
" Gmbs = " <<
Gmbs << std::endl;
3633 bool bsuccess =
true;
3642 double ratio,ratio4(0.0);
3647 double capfact(0.0);
3650 double gmanew,gmaold(0.0);
3655 double D1vte_loc(0.0);
3660 double D1vt_loc(0.0);
3661 register int D1iter(0.0);
3662 double D1egfet1(0.0),D1arg1(0.0),D1fact1(0.0),D1pbfact1(0.0),D1pbo(0.0),D1gmaold(0.0);
3663 double D1fact2(0.0),D1pbfact(0.0),D1arg(0.0),D1egfet(0.0),D1gmanew(0.0);
3672 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3674 Xyce::dout() << subsection_divider << std::endl;
3675 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3676 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3677 Xyce::dout() << std::endl;
3681 if (temp_tmp != -999.0)
temp = temp_tmp;
3698 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3700 Xyce::dout() <<
" Temperature = "<<
temp << std::endl;
3701 Xyce::dout() <<
" tnom = " << tnom << std::endl;
3702 Xyce::dout() <<
" ratio = " << ratio << std::endl;
3711 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3715 Xyce::dout() <<
" fact1 = " <<
model_.
fact1 << std::endl;
3716 Xyce::dout() <<
" vtnom = " <<
model_.
vtnom << std::endl;
3717 Xyce::dout() <<
" egfet1 = " <<
model_.
egfet1 << std::endl;
3718 Xyce::dout() <<
" pbfact1= " <<
model_.
pbfact1 << std::endl;
3719 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3720 Xyce::dout() <<
" ratio = " << ratio << std::endl;
3721 Xyce::dout() <<
" fact2 = " << fact2 << std::endl;
3722 Xyce::dout() <<
" kt = " << kt << std::endl;
3723 Xyce::dout() <<
" egfet = " << egfet << std::endl;
3724 Xyce::dout() <<
" arg = " << arg << std::endl;
3725 Xyce::dout() <<
" pbfact = " << pbfact << std::endl;
3728 ratio4 = ratio * sqrt(ratio);
3731 tPhi = fact2 * phio + pbfact;
3766 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3767 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3768 Xyce::dout() <<
" phio = " << phio << std::endl;
3769 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3770 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3771 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3772 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3773 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3774 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3775 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3776 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3777 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3778 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3779 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3780 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3781 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3782 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3783 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3784 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3899 vthLimit = Util::MachineDependentParams::DoubleMax();
3912 D1egfet = 1.16-(7.02e-4*D1DIOtemp*
D1DIOtemp)/(D1DIOtemp+1108);
3913 D1arg = -D1egfet/(2*CONSTboltz*
D1DIOtemp) + 1.1150877/
3915 D1pbfact = -2*D1vt_loc*(1.5*log(D1fact2)+
CONSTQ*D1arg);
3922 (1.5*log(D1fact1)+
CONSTQ*D1arg1);
3961 Xyce::dout() <<
" breakdown current increased to " << D1cbv <<
3962 "to resolve incompatability " <<
3963 "with specified saturation current" << std::endl;
3970 D1vt_loc*log(1+D1cbv/D1DIOtSatCur);
3971 for(D1iter=0; D1iter<25; ++D1iter)
3974 D1DIOtSatCur+1-D1xbv/D1vt_loc);
3976 -D1xbv)/D1vt_loc)-1+D1xbv/D1vt_loc);
3977 if (fabs(D1xcbv-D1cbv) <= D1tol)
goto matched;
3979 Xyce::dout() <<
" unable to match forward and reverse diode regions: D1bv = "
3980 << D1xbv <<
" D1ibv = " << D1xcbv << std::endl;
3999 bool bsuccess =
true;
4000 double vgs1(0.0), vgdd1(0.0), vbs1(0.0),vgb1(0.0), vdds1(0.0);
4005 bsuccess = bsuccess && tmpBool;
4134 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
4136 Xyce::dout() <<
" L = " <<
l << std::endl;
4137 Xyce::dout() <<
" W = " <<
w<< std::endl;
4138 Xyce::dout() <<
" drainArea = " <<
drainArea<< std::endl;
4139 Xyce::dout() <<
" sourceArea = " <<
sourceArea<< std::endl;
4140 Xyce::dout() <<
" drainSquares = " <<
drainSquares<< std::endl;
4141 Xyce::dout() <<
" sourceSquares = " <<
sourceSquares<< std::endl;
4142 Xyce::dout() <<
" drainPerimeter = " <<
drainPerimeter<< std::endl;
4144 Xyce::dout() <<
" drainCond = " <<
drainCond<< std::endl;
4145 Xyce::dout() <<
" sourceCond = " <<
sourceCond << std::endl;
4146 Xyce::dout() <<
" draindriftCond = " <<
draindriftCond<< std::endl;
4147 Xyce::dout() <<
" temp = " <<
temp<< std::endl;
4175 double vddsat_local,
4176 double & capgs_local,
4177 double & capgdd_local,
4178 double & capgb_local,
4183 double vdds_local(0.0);
4193 #define L EffectiveLength
4194 #define ETA model_.eta
4195 #define TOX model_.oxideThickness
4197 vgst = xvgs-von_local;
4200 capgb_local = cox/2;
4204 else if (vgst <= -phi/2)
4206 capgb_local = -vgst*cox/(2*phi);
4212 capgb_local = -vgst*cox/(2*phi);
4213 capgs_local = vgst*cox/(1.5*phi)+cox/3;
4218 vdds_local = xvgs-xvgdd;
4220 if (vddsat_local <= vdds_local)
4222 capgs_local = cox/3;
4227 vddif = 2.0*vddsat_local-vdds_local;
4228 vddif1 = vddsat_local-vdds_local;
4229 vddif2 = vddif*vddif;
4230 capgdd_local = cox*(1.0-vddsat_local*vddsat_local/vddif2)/3;
4231 capgs_local = cox*(1.0-vddif1*vddif1/vddif2)/3;
4238 if(
model_.
cv == 2 && vddsat_local != 0)
4240 vdds_local = fabs(xvgs-xvgdd);
4241 vdds_local = vdds_local/pow(1+pow(vdds_local/vddsat_local,
model_.
mc),
4243 vddif = 2.0*vddsat_local-vdds_local;
4244 vddif1 = vddsat_local-vdds_local;
4245 vddif2 = vddif*vddif;
4249 capgdd_local = cgc*(1.0-vddsat_local*vddsat_local/vddif2)/3;
4250 capgs_local = cgc*(1.0-vddif1*vddif1/vddif2)/3;
4276 double vbs_local(0.0);
4277 double vdds_local(0.0);
4285 double DeltaVT(0.0);
4286 double DnsdVgs(0.0);
4287 double DnsdVgd(0.0);
4288 double DnsdVgb(0.0);
4289 double DnssVgs(0.0);
4290 double DnssVgd(0.0);
4291 double DnssVgb(0.0);
4292 double DndepVgs(0.0);
4293 double DndepVgd(0.0);
4294 double DndepVgb(0.0);
4315 double SigmaVgs(0.0);
4316 double SigmaVgd(0.0);
4324 vbs_local = xvgs-vgb;
4325 vdds_local = xvgs-xvgdd;
4330 if(xvgs > VFB+vbs_local)
4335 nss=2.0*
n0*log(1+0.5*exp((xvgs-
von)/etavt));
4336 nsd=2.0*
n0*log(1+0.5*exp((xvgs-
von-ALPHA*vdds_local)/etavt));
4338 if (nss<1e-36) {nss=1.0e-36;}
4339 if (nsd<1e-36) {nsd=1.0e-36;}
4340 zetanb = (1-
ALPHA)/ALPHA;
4341 xi = gamma*gamma/(A*A)+4/(A*A)*(vgb-VFB)-4.0/A*nss;
4345 if (vbs_local <= 0) { DeltaVT= 0.5*gamma/sqrt(
tPhi-vbs_local); }
4346 if ((vbs_local > 0)&&(vbs_local <= 2*
tPhi)) { DeltaVT=0.5*gamma/sqrt(
tPhi); }
4347 if ((vbs_local > 0)&&(vbs_local > 2*
tPhi)) { DeltaVT=0; }
4349 DnsdVgs=(1+DeltaVT-ALPHA+SigmaVgs)/tnsd;
4350 DnsdVgd=(-SigmaVgd+
ALPHA)/tnsd;
4351 DnsdVgb=-DeltaVT/tnsd;
4353 DnssVgs= (1+DeltaVT+SigmaVgs)/tnss;
4354 DnssVgd=-SigmaVgd/tnss;
4355 DnssVgb=-DeltaVT/tnss;
4357 UI= etavt/2.0*(nsd*nsd-nss*nss) + A/3.0*(nsd*nsd*nsd-nss*nss*nss);
4358 VI= etavt*(nsd-nss) + A/2.0*(nsd*nsd-nss*nss);
4359 DUIVgs = etavt*(nsd*DnsdVgs-nss*DnssVgs) +
4360 A*(nsd*nsd*DnsdVgs-nss*nss*DnssVgs);
4361 DUIVgd= etavt*(nsd*DnsdVgd-nss*DnssVgd) +
4362 A*(nsd*nsd*DnsdVgd-nss*nss*DnssVgd);
4363 DUIVgb= etavt*(nsd*DnsdVgb-nss*DnssVgb) +
4364 A*(nsd*nsd*DnsdVgb-nss*nss*DnssVgb);
4366 DVIVgs= etavt*(DnsdVgs-DnssVgs) + A*(nsd*DnsdVgs-nss*DnssVgs);
4367 DVIVgd= etavt*(DnsdVgd-DnssVgd) + A*(nsd*DnsdVgd-nss*DnssVgd);
4368 DVIVgb= etavt*(DnsdVgb-DnssVgb) + A*(nsd*DnsdVgb-nss*DnssVgb);
4371 DqiVgs= mqWL*(DUIVgs*VI-DVIVgs*UI)/(VI*VI);
4372 DqiVgd= mqWL*(DUIVgd*VI-DVIVgd*UI)/(VI*VI);
4373 DqiVgb= mqWL*(DUIVgb*VI-DVIVgb*UI)/(VI*VI);
4377 DqiVgs=mqWL*DnssVgs;
4378 DqiVgd=mqWL*DnssVgd;
4379 DqiVgb=mqWL*DnssVgb;
4382 DxiVgs= -4.0/A*DnssVgs;
4383 DxiVgd= -4.0/A*DnssVgd;
4384 DxiVgb= 4.0/(A*A)-4/A*DnssVgb;
4387 {DndepVgs= gamma/4.0*1.0/xisqrt*DxiVgs;
4388 DndepVgd= gamma/4.0*1.0/xisqrt*DxiVgd;
4389 DndepVgb= gamma/4.0*1.0/xisqrt*DxiVgb;
4398 DqbVgs = mqWL*(DndepVgs-zetanb*DnssVgs)+zetanb*DqiVgs;
4399 DqbVgd = mqWL*(DndepVgd-zetanb*DnssVgd)+zetanb*DqiVgd;
4400 DqbVgb = mqWL*(DndepVgb-zetanb*DnssVgb)+zetanb*DqiVgb;
4402 DqgVgs= -DqiVgs-DqbVgs;
4403 DqgVgd= -DqiVgd-DqbVgd;
4404 DqgVgb= -DqiVgb-DqbVgb;
4414 if (DqgVgs<0) {DqgVgs=0;}
4415 if (DqgVgd<0) {DqgVgd=0;}
4416 if (DqgVgb<0) {DqgVgb=0;}
4436 double vgb,
double & qD,
double & qS,
double & qB)
4457 double vdds_local(0.0);
4466 vdds_local=vgs-vgdd;
4473 nsd=2*
n0*log(1+0.5*exp((vgs-VT-ALPHA*vdds_local)/etavth));
4474 nss=2*
n0*log(1+0.5*exp((vgs-VT)/etavth));
4480 arg1= 0.5*etavth*(nsdsqr-nsssqr)+1/3.0*A*(nsdsqr*nsd-nsssqr*nss);
4481 arg2= etavth*(nsd-nss) +0.5*A*(nsdsqr-nsssqr);
4485 else {qn = mqWL*arg1/arg2;}
4486 xisqrt= sqrt(gamma*gamma/(A*A)+4.0/(A*A)*(vgb-VFB)-4.0/A*nss);
4487 ndeps = -gamma*gamma/(2.0*A)+ gamma/2.0*xisqrt;
4488 zetanb =(1-
ALPHA)/ALPHA;
4490 qB =mqWL*(ndeps-zetanb*nss)+zetanb*qn;
4505 double fp1denum(0.0);
4507 vdsabs=fabs(vdds_local);
4511 if((vsat > 1e-36)&&(vdds_local>1e-36))
4512 { beta=vdsabs/vsat;}
else{beta=1e-36;}
4515 fp1denum = exp(1/m*log(1+exp(m*log(beta))));
4516 if (fp1denum > 1e-36)
4517 {fp1= 0.5+ a0*vdsabs/fp1denum;}
4527 double arg1_loc(0.0);
4528 double arg2_loc(0.0);
4529 double arg3_loc(0.0);
4533 arg1_loc= nd0*nd0*nd0*(1/3.0+nd0*(3.0/8.0+1/10.0*nd0))
4534 - (1.0/2.0+1.0/3.0*nd0)*(1.0+1/2.0*ns0)*nd0*nd0*ns0
4535 + ns0*ns0*ns0*(1.0/6.0+ns0*(5.0/24.0+1.0/15.0*ns0));
4536 arg2_loc = 1.0/2.0*(nd0*nd0-ns0*ns0)+1.0/3.0*(nd0*nd0*nd0-ns0*ns0*ns0);
4537 arg3_loc = nd0-ns0+1.0/2.0*(nd0*nd0-ns0*ns0);
4538 if ((arg2_loc==0)||(arg3_loc==0)) {fp1=0.5;}
4539 else { fp1 = 1-arg1_loc/(arg2_loc*arg3_loc);}
4544 UserWarning(*
this) <<
"Partitioning model does not exist";
4575 double & von_local,
double & dvonvbs_local)
4577 double PhiMinVbs =
tPhi - vbs_local;
4585 dvonvbs_local = 0.0;
4590 sarg = sqrt(PhiMinVbs);
4616 double dvonvbs,
double & cdraindrift_loc,
double & vsate)
4635 double x(0.0),y(0.0),z(0.0);
4644 double dichoodvds(0.0);
4645 double dichoodvgs(0.0);
4646 double dichoodvbs(0.0);
4647 double dichooisat(0.0);
4648 double dichoodgch(0.0);
4649 double delgchgchi(0.0);
4650 double disatdvds(0.0);
4651 double disatdvgs(0.0);
4652 double disatdvbs(0.0);
4653 double dgchidvds(0.0);
4654 double dgchidvgs(0.0);
4655 double dgchidvbs(0.0);
4656 double disatvgte(0.0);
4657 double disatgchi(0.0);
4658 double dvgtedvgt(0.0);
4659 double dvgtdvds(0.0);
4660 double dvgtdvgs(0.0);
4661 double dvgtdvbs(0.0);
4662 double dnsdvgt(0.0);
4663 double dnsdvds(0.0);
4664 double dnsdvgs(0.0);
4665 double dnsdvbs(0.0);
4666 double dmudvgte(0.0);
4667 double dmudvds(0.0);
4668 double dmudvgs(0.0);
4669 double dmudvbs(0.0);
4671 static int output=0;
4673 #define ETA model_.eta
4674 #define RS model_.sourceResistance
4675 #define RD model_.drainResistance
4676 #define VSIGMAT model_.vsigmat
4677 #define VSIGMA model_.vsigma
4678 #define SIGMA0 model_.sigma0
4679 #define THETA model_.theta
4680 #define LAMBDA model_.lambda
4681 #define DELTA model_.delta
4682 #define VMAX model_.maxDriftVel
4683 #define TOX model_.oxideThickness
4685 #define EXP_MAX 150.0
4688 Xyce::dout() <<
" " << std::endl;
4689 Xyce::dout() <<
"ETA = " <<
ETA << std::endl;
4690 Xyce::dout() <<
"RS = " <<
RS << std::endl;
4691 Xyce::dout() <<
"RD = " <<
RD << std::endl;
4692 Xyce::dout() <<
"VSIGMAT = " <<
VSIGMAT << std::endl;
4693 Xyce::dout() <<
"VSIGMA = " <<
VSIGMA << std::endl;
4694 Xyce::dout() <<
"SIGMA0 = " <<
SIGMA0 << std::endl;
4695 Xyce::dout() <<
"THETA = " <<
THETA << std::endl;
4696 Xyce::dout() <<
"LAMBDA = " <<
LAMBDA << std::endl;
4697 Xyce::dout() <<
"DELTA = " <<
DELTA << std::endl;
4698 Xyce::dout() <<
"VMAX = " <<
VMAX << std::endl;
4699 Xyce::dout() <<
"TOX = " <<
TOX << std::endl;
4708 vgt = vgt0+sigma*xvdds;
4711 vgte = vt*(1+b+1+q);
4726 ns = 2.0*
n0*log(1+0.5*exp(x));
4730 cdraindrift_loc = 0.0;
4743 gch = gchi/(1+gchi*rt);
4748 d = sqrt(1+2*gchi*
RS + vgte*vgte/vl2);
4756 else z = 1/(cosh(y)*cosh(y));
4759 ichoo = isat*(1+
LAMBDA*xvdds)*tanh(y);
4761 dvgtedvgt = 0.5*(1+b/q);
4762 dnsdvgt =
n0/(etavt*(exp(-x)+0.5));
4767 dvgtdvbs = -dvonvbs*dvgtdvgs;
4769 dnsdvds = dnsdvgt*dvgtdvds;
4770 dnsdvgs = dnsdvgt*dvgtdvgs;
4771 dnsdvbs = dnsdvgt*dvgtdvbs;
4772 dmudvds = (dmudvgte*dvgtedvgt)*dvgtdvds;;
4773 dmudvgs = (dmudvgte*dvgtedvgt)*dvgtdvgs;;
4774 dmudvbs = (dmudvgte*dvgtedvgt)*dvgtdvbs + 2*dmudvgte*dvonvbs;
4776 dgchidvds =
gchi0*(mu*dnsdvds + ns*dmudvds);
4777 dgchidvgs =
gchi0*(mu*dnsdvgs + ns*dmudvgs);
4778 dgchidvbs =
gchi0*(mu*dnsdvbs + ns*dmudvbs);
4780 disatvgte = gchi/h - gchi*vgte*vgte/vl2/(d*h*h);
4781 disatgchi = vgte/h - gchi*vgte*
RS*(1+1/d)/(h*h);
4783 disatdvds = (disatvgte*dvgtedvgt)*dvgtdvds + disatgchi*dgchidvds;
4784 disatdvgs = (disatvgte*dvgtedvgt)*dvgtdvgs + disatgchi*dgchidvgs;
4785 disatdvbs = (disatvgte*dvgtedvgt)*dvgtdvbs + disatgchi*dgchidvbs;
4787 dichoodgch = (1+
LAMBDA*xvdds)*xvdds*z;
4788 dichooisat = (1+
LAMBDA*xvdds)*(tanh(y) - gch*xvdds*z/isat);
4790 delgchgchi = 1/(g*g);
4792 dichoodvds = dichooisat*disatdvds + (dichoodgch*delgchgchi)*dgchidvds
4794 dichoodvgs = dichooisat*disatdvgs + (dichoodgch*delgchgchi)*dgchidvgs;
4795 dichoodvbs = dichooisat*disatdvbs + (dichoodgch*delgchgchi)*dgchidvbs;
4798 cdraindrift_loc = ichoo;
4827 double dvonvbs,
double & cdraindrift_loc,
double & vsate)
4873 double delidgch(0.0);
4874 double delgchgchi(0.0);
4875 double delgchins(0.0);
4876 double dvgtevgt(0.0);
4877 double delidvsate(0.0);
4878 double delvsateisat(0.0);
4879 double delisatvgte(0.0);
4880 double delisatgchi(0.0);
4881 double delisatvl(0.0);
4882 double dgchivgt(0.0);
4883 double delvsategch(0.0);
4884 double delidvds(0.0);
4885 double dsigmavgs(0.0);
4886 double delnsvgt(0.0);
4887 double dvsatevgt(0.0);
4888 double dvgtvgs(0.0);
4891 double dvgtvon(0.0);
4892 double delvsatqs(0.0);
4893 double delvsatmu(0.0);
4894 double dvsatvgt(0.0);
4895 double dvsatvbs(0.0);
4896 double delvdsevdso(0.0);
4897 double delvdsevsat(0.0);
4898 double dvdsevgs(0.0);
4899 double dvdsevds(0.0);
4900 double dvdsevbs(0.0);
4903 double delmm1vdso(0.0);
4904 double ddelvgs(0.0);
4905 double ddelvds(0.0);
4906 double ddelvbs(0.0);
4910 double mm1_loc(0.0);
4911 double dmm1vgs_loc(0.0);
4912 double dmm1vds_loc(0.0);
4913 double dmm1vbs_loc(0.0);
4915 static int output(0);
4917 #define ETA model_.eta
4918 #define RS model_.sourceResistance
4919 #define RD model_.drainResistance
4920 #define VSIGMAT model_.vsigmat
4921 #define VSIGMA model_.vsigma
4922 #define SIGMA0 model_.sigma0
4923 #define THETA model_.theta
4924 #define LAMBDA model_.lambda
4925 #define DELTA model_.delta
4926 #define ALPHA model_.alpha
4927 #define VMAX model_.maxDriftVel
4928 #define TOX model_.oxideThickness
4930 #define L EffectiveLength
4931 #define LS model_.ls
4933 #define INVM 1.0/model_.m
4934 #define MC model_.mc
4935 #define INVMC 1.0/model_.mc
4936 #define RSUB model_.rsub
4937 #define AI model_.ai
4938 #define BI model_.bi
4939 #define MD model_.md
4940 #define INVMD 1.0/model_.md
4941 #define DELMAX model_.delmax
4944 Xyce::dout() <<
" " << std::endl;
4945 Xyce::dout() <<
"ETA = " <<
ETA << std::endl;
4946 Xyce::dout() <<
"RS = " <<
RS << std::endl;
4947 Xyce::dout() <<
"RD = " <<
RD << std::endl;
4948 Xyce::dout() <<
"VSIGMAT = " <<
VSIGMAT << std::endl;
4949 Xyce::dout() <<
"VSIGMA = " <<
VSIGMA << std::endl;
4950 Xyce::dout() <<
"SIGMA0 = " <<
SIGMA0 << std::endl;
4951 Xyce::dout() <<
"THETA = " <<
THETA << std::endl;
4952 Xyce::dout() <<
"LAMBDA = " <<
LAMBDA << std::endl;
4953 Xyce::dout() <<
"DELTA = " <<
DELTA << std::endl;
4954 Xyce::dout() <<
"ALPHA = " <<
ALPHA << std::endl;
4955 Xyce::dout() <<
"VMAX = " <<
VMAX << std::endl;
4956 Xyce::dout() <<
"TOX = " <<
TOX << std::endl;
4957 Xyce::dout() <<
"W = " <<
W << std::endl;
4958 Xyce::dout() <<
"L = " <<
L << std::endl;
4959 Xyce::dout() <<
"LS = " <<
LS << std::endl;
4960 Xyce::dout() <<
"M = " <<
M << std::endl;
4961 Xyce::dout() <<
"INVM = " <<
INVM << std::endl;
4962 Xyce::dout() <<
"MC = " <<
MC << std::endl;
4963 Xyce::dout() <<
"INVMC = " <<
INVMC << std::endl;
4964 Xyce::dout() <<
"RSUB = " <<
RSUB << std::endl;
4965 Xyce::dout() <<
"AI = " <<
AI << std::endl;
4966 Xyce::dout() <<
"BI = " <<
BI << std::endl;
4967 Xyce::dout() <<
"MD = " <<
MD << std::endl;
4968 Xyce::dout() <<
"INVMD = " <<
INVMD << std::endl;
4969 Xyce::dout() <<
"DELMAX = " <<
DELMAX << std::endl;
4970 Xyce::dout() <<
"VP = " <<
vp << std::endl;
4980 vgt = vgt0+sigma*xvdds;
4983 vgte = vt*(1+b+1+q);
4998 ns = 2.0*
n0*log(1+0.5*exp(x));
5004 cdraindrift_loc = 0.0;
5010 mm1 = mm1_loc = 0.0;
5018 gch = gchi/(1+gchi*rt);
5022 d = sqrt(1+2*gchi*
RS + vgte*vgte/vl2);
5024 isat = r/(1+gchi*
RS+d);
5027 z = 0.5*(cosh(2*y)+1);
5034 ichoo = isat*(1+
LAMBDA*xvdds)*tanh(y);
5035 delidgch = ichoo/gch;
5037 delgchgchi = 1/(g*g);
5038 delgchins =
gchi0*mu;
5040 delnsvgt =
n0/(etavt*(exp(-x) + 0.5));
5041 dvgtevgt = 0.5*(1+b/q);
5047 delidvsate = gch*(1+
LAMBDA*xvdds)*xvdds/(vsate)/z;
5049 delvsateisat = 1/gch;
5050 delvsategch = -(vsate)/gch;
5052 delisatgchi = (vgte*h - gchi*vgte*
RS*(1+1/d))/(h*h);
5053 delisatvgte = (gchi*h - gchi*vgte*vgte/(vl2*d))/(h*h);
5054 delisatvl = isat*isat*vgte/(gchi*d*vl2*vl);
5056 dgchivgt = delgchins*delnsvgt-gchi*mu*s*dvgtevgt;
5058 p = delgchgchi*dgchivgt;
5059 dvsatevgt = delvsateisat*(delisatgchi*dgchivgt+
5060 (delisatvgte+delisatvl*t*s)*dvgtevgt)+ delvsategch*p;
5061 g = delidgch*p+delidvsate*dvsatevgt;
5062 dvgtvgs = (1+xvdds*dsigmavgs);
5064 gdsoo = delidvds+g*sigma;
5066 dmuvon = -(2-dvgtevgt*dvgtvgs)*mu*mu*s;
5072 gbsoo = -(gmoo)*dvonvbs;
5076 double dgchivon = -delgchins*delnsvgt*dvgtvgs+gchi*dmuvon/mu;
5077 p = delgchgchi*dgchivon;
5078 double dvsatevon = delvsateisat*(delisatgchi*dgchivon+
5079 delisatvgte*dvgtevgt*dvgtvon+delisatvl*(-vl2/t)*dmuvon)+delvsategch*p;
5080 gbsoo = (delidgch*p+delidvsate*dvsatevon)*dvonvbs;
5087 qs =
CONSTQ*(ns-ichoo*temp1);
5088 dqsvgt =
CONSTQ*(delnsvgt-g*temp1);
5089 dqsvbs =
CONSTQ*(delnsvgt*dvgtvon*dvonvbs-gbsoo*temp1);
5098 delvsatqs = 2*
VMAX*L*(b-qs*mu)/temp1;
5099 delvsatmu = -a*qs/temp1;
5100 dvsatvgt = delvsatqs*dqsvgt+delvsatmu*dmuvgt;
5101 dvsatvbs = delvsatqs*dqsvbs+delvsatmu*dmuvon*dvonvbs;
5107 c = sqrt(1+qs*mu*b);
5109 delvsatqs = a*(0.5*b*mu/c);
5110 delvsatmu = -vsat/mu+a*(0.5*b*qs/c);
5111 dvsatvgt = delvsatqs*dqsvgt+delvsatmu*dmuvgt;
5112 dvsatvbs = delvsatqs*dqsvbs+delvsatmu*dmuvon*dvonvbs;
5116 vdso = xvdds-ichoo*rt;
5117 a = pow(vdso/vsat,
MC);
5120 delvdsevdso = (1-a/(1+a))/b;
5121 delvdsevsat = vdse*a/(vsat*(1+a));
5125 double deldeltalvdse(0.0);
5126 double deldeltalvdso(0.0);
5127 double deldeltalmu(0.0);
5128 double ddeltalvgs(0.0);
5129 double ddeltalvds(0.0);
5130 double ddeltalvbs(0.0);
5132 a = 1+(vdso-vdse)/
vp;
5133 b =
W*mu*cox*vdse*
RS/
L;
5140 deldeltalvdse = (-
LS/(f*a*
vp)*c-d*(1/
vp+
W*mu*cox*
RS/L))/(c*c);
5141 deldeltalvdso =
LS/(c*a*f*
vp);
5142 deldeltalmu = -d*
W*cox*vdse*
RS/(L*c*c);
5144 dvdsevgs = delvdsevsat*dvsatvgt*dvgtvgs+delvdsevdso*temp1;
5145 ddeltalvgs = deldeltalvdse*dvdsevgs + deldeltalmu*dmuvgt*dvgtvgs
5146 + deldeltalvdso*temp1;
5147 gmo = e*(gmoo+ichoo*ddeltalvgs*e/
L);
5149 dvdsevds = delvdsevsat*dvsatvgt*sigma+delvdsevdso*temp1;
5150 ddeltalvds = deldeltalvdse*dvdsevds + deldeltalmu*dmuvgt*sigma
5151 + deldeltalvdso*temp1;
5152 gdso = e*(gdsoo+ichoo*ddeltalvds*e/
L);
5154 dvdsevbs = delvdsevsat*dvsatvbs+delvdsevdso*temp1;
5155 ddeltalvbs = deldeltalvdse*dvdsevbs + deldeltalmu*dmuvon*dvonvbs
5156 + deldeltalvdso*temp1;;
5157 gbso = e*(gbsoo+ichoo*ddeltalvbs*e/
L);
5166 del = d*mm1_loc*mu*vdse;
5180 cdraindrift_loc = icho*e;
5181 delmm1vdso = a*c+mm1_loc*
LS*
BI/(b*b);
5182 dmm1vgs_loc = delmm1vdso*(-gmoo*rt-dvdsevgs);
5183 ddelvgs = h*d*(mu*vdse*dmm1vgs_loc + mm1_loc*vdse*dmuvgt*dvgtvgs
5184 + mu*mm1_loc*dvdsevgs);
5185 gm = e*(gmo+icho*ddelvgs*e);
5186 dmm1vds_loc = delmm1vdso*(1-gdsoo*rt-dvdsevds);
5187 ddelvds = h*d*(mu*vdse*dmm1vds_loc + mm1_loc*vdse*dmuvgt*sigma
5188 + mu*mm1_loc*dvdsevds);
5189 gdds = e*(gdso+icho*ddelvds*e);
5190 dmm1vbs_loc = delmm1vdso*(-gbsoo*rt-dvdsevbs);
5191 ddelvbs = h*d*(mu*vdse*dmm1vbs_loc + mm1_loc*vdse*dmuvon*dvonvbs
5192 + mu*mm1_loc*dvdsevbs);
5193 gmbs = e*(gbso+icho*ddelvbs*e);
5220 bool bsuccess =
true;
5229 bsuccess = bsuccess && btmp;
5231 double vgs1(0.0), vgdd1(0.0), vbs1(0.0),vgb1(0.0), vdds1(0.0);
5362 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
5371 double coef_Jdxp(0.0), gd_Jdxp(0.0);
5375 double ceqbs = Dtype*(mi.
cbs+mi.
cqbs);
5376 double ceqbd = Dtype*(mi.
cbd+mi.
cqbd);
5378 double D1current = Dtype*mi.
D1cdeq;
5383 if (mi.
Igate != 0.0)
5391 fVec[mi.
li_Bulk] += (ceqbs + ceqbd);
5403 dFdxdVp[mi.
li_Bulk] += coef_Jdxp;
5406 coef_Jdxp = Dtype*(-((mi.
gbd-gmin1))*
5428 double qcoef_Jdxp(0.0);
5430 double Qeqbs = Dtype*mi.
qbs;
5431 double Qeqbd = Dtype*mi.
qbd;
5432 double Qeqgb = Dtype*mi.
qgb;
5433 double Qeqgs = Dtype*mi.
qgs;
5434 double Qeqgdd = Dtype*mi.
qgdd;
5437 qVec[mi.
li_Bulk] += (Qeqbs + Qeqbd - Qeqgb);
5451 dQdxdVp[mi.
li_Bulk] += qcoef_Jdxp;
5467 dQdxdVp[mi.
li_Drain] += qcoef_Jdxp;
5477 if (mi.
Igate != 0.0)
5539 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5551 #pragma omp parallel for
5709 int sizeInstances = instanceContainer_.size();
5712 #pragma omp parallel for
5714 for (
int i=0; i<sizeInstances; ++i)
5716 Instance & mi = *(instanceContainer_.at(i));
5870 .registerDevice(
"m", 18)
5871 .registerModelType(
"pmos", 18)
5872 .registerModelType(
"nmos", 18);
const InstanceName & getName() const
int ASourcePrimeEquDrainPrimeNodeOffset
double * q_DrainDriftEquDrainNodePtr
double * nextStaDerivVectorRawPtr
int AD1PrimeEquSourceNodeOffset
bool UCCMqmeyer(double vgps, double vgpdd, double vgpb, double von_local, double vddsat_local, double &capgs_local, double &capgdd_local, double &capgb_local, double phi, double cox)
static std::vector< std::vector< int > > jacStamp_D1C_DC_GC
int ADrainPrimeEquBulkNodeOffset
static std::vector< std::vector< int > > jacStamp_D1C
static void initThermalModel(ParametricData< T > ¶metric_data)
Add the parameter "TEMPMODEL" to the parametric_data.
static std::vector< std::vector< int > > jacMap2_DC_SC_GC
double D1DIOsaturationCurrentExp
bool updateDependentParameters()
int ADrainEquDrainNodeOffset
double surfaceStateDensity
const DeviceOptions & deviceOptions_
double * q_GateEquGatePrimeNodePtr
int ASourcePrimeEquBulkNodeOffset
double * f_SourcePrimeEquGatePrimeNodePtr
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
bool D1DIObreakdownVoltageGiven
double * q_SourcePrimeEquSourcePrimeNodePtr
double * daeQVectorRawPtr
int ABulkEquDrainPrimeNodeOffset
double * q_DrainPrimeEquBulkNodePtr
int ASourcePrimeEquSourcePrimeNodeOffset
static std::vector< int > jacMap_D1C_DC_SC
double * f_GatePrimeEquDrainPrimeNodePtr
double * q_BulkEquDrainPrimeNodePtr
int ADrainDriftEquDrainNodeOffset
static std::vector< std::vector< int > > jacMap2_GC
double * dFdxdVpVectorRawPtr
double gateBulkOverlapCapFactor
static std::vector< std::vector< int > > jacMap2_DC_GC
double * f_BulkEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacMap2_D1C
double pnjlim(double vnew, double vold, double vt, double vcrit, int *icheck)
std::vector< int > devConMap
static std::vector< std::vector< int > > jacMap2_D1C_DC_SC
bool UCCMMeyercap(double vgps, double vgpdd, double vgpb, double &cgs, double &cgd, double &cgb)
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 * f_SourceEquD1PrimeNodePtr
static std::vector< std::vector< int > > jacStamp_SC_GC
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
int ABulkEquBulkNodeOffset
int ASourcePrimeEquGatePrimeNodeOffset
int AGatePrimeEquBulkNodeOffset
int ASourceEquSourcePrimeNodeOffset
double * currStaVectorRawPtr
double * q_DrainEquSourceNodePtr
double D1DIOemissionCoeff
double * q_GatePrimeEquGatePrimeNodePtr
double * q_SourcePrimeEquSourceNodePtr
double * q_D1PrimeEquDrainNodePtr
double * f_SourcePrimeEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacMap2_D1C_SC
int ADrainEquD1PrimeNodeOffset
double * q_SourceEquD1PrimeNodePtr
double * f_GatePrimeEquGateNodePtr
int AGateEquGatePrimeNodeOffset
static std::vector< int > jacMap_D1C_SC
bool UCCMmosa2(double vgps, double vdds, double dvonvbs, double &cdraindrift_loc, double &vsate)
static std::vector< int > jacMap
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
static std::vector< std::vector< int > > jacStamp_DC_SC_GC
bool updateIntermediateVars()
bool updatePrimaryState()
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
static std::vector< int > jacMap_SC_GC
static void loadModelParameters(ParametricData< Model > &model_parameters)
static std::vector< std::vector< int > > jacStamp_D1C_GC
double * f_DrainPrimeEquDrainDriftNodePtr
static std::vector< std::vector< int > > jacStamp_DC
bool processParams()
processParams
bool updateTemperature(const double &temp_tmp)
Parameter is subject to being set to minimum junction capacitance.
double * q_GatePrimeEquGateNodePtr
static std::vector< std::vector< int > > jacStamp_D1C_SC_GC
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
int ADrainDriftEquDrainDriftNodeOffset
double * f_DrainDriftEquDrainDriftNodePtr
Parameter is subject to being set to minimum lead resistance.
static std::vector< std::vector< int > > jacStamp_D1C_DC
int AGatePrimeEquSourcePrimeNodeOffset
double * f_GateEquGatePrimeNodePtr
double fetlim(double vnew, double vold, double vto)
static std::vector< std::vector< int > > jacStamp_D1C_DC_SC
int ADrainPrimeEquDrainPrimeNodeOffset
double * q_D1PrimeEquSourceNodePtr
double * q_GatePrimeEquSourcePrimeNodePtr
bool UCCMcvon(double vbs_local, double &von_local, double &dvonvbs_local)
double * f_DrainPrimeEquDrainPrimeNodePtr
static std::vector< int > jacMap_D1C
static std::vector< int > jacMap_DC
double * storeLeadCurrQCompRawPtr
double * q_GateEquGateNodePtr
int li_state_D1DIOcapCharge
double * f_DrainEquD1PrimeNodePtr
static std::vector< std::vector< int > > jacMap2_SC
double * f_DrainDriftEquDrainNodePtr
double * f_SourcePrimeEquBulkNodePtr
int getNumStoreVars() const
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
static std::vector< std::vector< int > > jacMap2_D1C_DC_SC_GC
double * f_GateEquGateNodePtr
int ABulkEquGatePrimeNodeOffset
std::vector< Param > params
Parameters from the line.
double * q_SourceEquSourcePrimeNodePtr
double * f_SourceEquDrainNodePtr
double * f_DrainEquDrainDriftNodePtr
static std::vector< std::vector< int > > jacMap2_SC_GC
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
double GateDrainOverlapCap
int ADrainPrimeEquSourcePrimeNodeOffset
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
int ASourcePrimeEquSourceNodeOffset
static std::vector< std::vector< int > > jacMap2
double * q_SourcePrimeEquDrainPrimeNodePtr
double * f_BulkEquBulkNodePtr
double * daeFVectorRawPtr
double bulkJctSideGradingCoeff
double D1DIOactivationEnergy
double * q_BulkEquSourcePrimeNodePtr
double * q_DrainDriftEquDrainDriftNodePtr
double GateSourceOverlapCap
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
double * f_SourcePrimeEquSourceNodePtr
double * f_DrainEquDrainNodePtr
static std::vector< std::vector< int > > jacMap2_D1C_GC
static std::vector< std::vector< int > > jacMap2_D1C_DC
bool UCCMCharges(double vgps, double vgpdd, double vgpb, double &qD, double &qS, double &qB)
double * f_GatePrimeEquGatePrimeNodePtr
const DeviceOptions & getDeviceOptions() const
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
static std::vector< std::vector< int > > jacStamp_D1C_DC_SC_GC
double * f_SourceEquSourceNodePtr
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
double * f_DrainDriftEquDrainPrimeNodePtr
const std::vector< std::vector< int > > & jacobianStamp() const
double * nextStoVectorRawPtr
double * f_DrainPrimeEquBulkNodePtr
double * f_GatePrimeEquBulkNodePtr
double * f_D1PrimeEquD1PrimeNodePtr
int AGateEquGateNodeOffset
double * q_DrainEquDrainDriftNodePtr
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.
int ADrainPrimeEquGatePrimeNodeOffset
double * q_DrainEquD1PrimeNodePtr
static std::vector< std::vector< int > > jacStamp_GC
double gateDrainOverlapCapFactor
double * f_GatePrimeEquSourcePrimeNodePtr
double * q_BulkEquGatePrimeNodePtr
double D1DIObreakdownCurrent
double limvds(double vnew, double vold)
double * f_SourceEquSourcePrimeNodePtr
Linear::Vector * nextStaVectorPtr
static std::vector< int > jacMap_DC_GC
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
static std::vector< std::vector< int > > jacMap2_DC_SC
int ABulkEquSourcePrimeNodeOffset
Linear::Matrix * dFdxMatrixPtr
static std::vector< int > jacMap_GC
const DeviceOptions & getDeviceOptions() const
Returns the device options given during device construction.
int AD1PrimeEquDrainNodeOffset
The Device class is an interface for device implementations.
static std::vector< std::vector< int > > jacMap2_D1C_SC_GC
static std::vector< int > jacMap_D1C_DC_GC
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * q_DrainDriftEquDrainPrimeNodePtr
static std::vector< int > jacMap_SC
double * q_DrainPrimeEquDrainDriftNodePtr
const SolverState & solverState_
int AD1PrimeEquD1PrimeNodeOffset
double * q_GatePrimeEquDrainPrimeNodePtr
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
double * dQdxdVpVectorRawPtr
Class Configuration contains device configuration data.
int ADrainDriftEquDrainPrimeNodeOffset
int AGatePrimeEquDrainPrimeNodeOffset
double D1DIOdepletionCapCoeff
bool UCCMmosa1(double vgps, double vdds, double dvonvbs, double &cdraindrift_loc, double &vsate)
int AGatePrimeEquGatePrimeNodeOffset
bool interpolateTNOM(double)
double * f_DrainPrimeEquSourcePrimeNodePtr
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)
const SolverState & getSolverState() const
double D1DIObreakdownVoltage
double * f_SourcePrimeEquDrainPrimeNodePtr
double * f_BulkEquGatePrimeNodePtr
double * f_D1PrimeEquDrainNodePtr
double * q_GatePrimeEquBulkNodePtr
static std::vector< std::vector< int > > jacStamp_D1C_SC
Linear::Vector * currStaVectorPtr
virtual std::ostream & printOutInstances(std::ostream &os) const
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
double * nextStaVectorRawPtr
double GateBulkOverlapCap
static std::vector< int > jacMap_DC_SC_GC
#define Xyce_NONPOINTER_MATRIX_LOAD
int AGatePrimeEquGateNodeOffset
static std::vector< int > jacMap_D1C_DC
bool updateSecondaryState()
int ASourceEquD1PrimeNodeOffset
double * q_SourceEquDrainNodePtr
const std::string & getType() const
static std::vector< int > jacMap_D1C_DC_SC_GC
static std::vector< int > jacMap_D1C_GC
double * q_SourcePrimeEquGatePrimeNodePtr
static std::vector< std::vector< int > > jacStamp
double gateSourceOverlapCapFactor
double * q_DrainPrimeEquSourcePrimeNodePtr
static std::vector< int > jacMap_D1C_SC_GC
int ADrainEquSourceNodeOffset
const ExternData & extData
double * f_BulkEquDrainPrimeNodePtr
std::vector< Instance * > instanceContainer
ModelBlock represents a .MODEL line from the netlist.
double * f_DrainPrimeEquGatePrimeNodePtr
Manages parameter binding for class C.
static std::vector< std::vector< int > > jacStamp_DC_GC
double * q_DrainEquDrainNodePtr
InstanceBlock represent a device instance line from the netlist.
double * q_DrainPrimeEquDrainPrimeNodePtr
double * f_DrainEquSourceNodePtr
static std::vector< std::vector< int > > jacStamp_DC_SC
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
double bulkJctBotGradingCoeff
double * q_SourcePrimeEquBulkNodePtr
int ADrainEquDrainDriftNodeOffset
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
static std::vector< std::vector< int > > jacMap2_DC
static std::vector< std::vector< int > > jacStamp_SC
double * f_D1PrimeEquSourceNodePtr
Linear::Vector * flagSolVectorPtr
bool processInstanceParams()
processInstanceParams
int ADrainPrimeEquDrainDriftNodeOffset
virtual bool updateSecondaryState(double *staDeriv, double *stoVec)
Updates the devices secondary state information.
static std::vector< int > jacMap_DC_SC
double * q_D1PrimeEquD1PrimeNodePtr
const SolverState & getSolverState() const
Returns the solver state given during device construction.
void setModParams(const std::vector< Param > ¶ms)
double * q_SourceEquSourceNodePtr
static std::vector< std::vector< int > > jacMap2_D1C_DC_GC
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
double * nextSolVectorRawPtr
bool sideWallCapFactorGiven
int numLeadCurrentStoreVars
int ASourceEquSourceNodeOffset
double * q_DrainPrimeEquGatePrimeNodePtr
double * q_BulkEquBulkNodePtr
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
int ASourceEquDrainNodeOffset