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),
1728 const std::vector<int> & extLIDVecRef )
1733 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1735 Xyce::dout() << section_divider << std::endl;
1736 Xyce::dout() <<
" In Instance::register LIDs\n\n";
1737 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1738 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
1739 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
1778 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1780 Xyce::dout() <<
"\n variable local indices:\n";
1781 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
1782 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
1783 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
1784 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
1785 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
1786 Xyce::dout() <<
" li_GatePrime = " <<
li_GatePrime << std::endl;
1787 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
1788 Xyce::dout() <<
" li_DrainDrift = " <<
li_DrainDrift << std::endl;
1789 Xyce::dout() <<
" li_D1Prime = " <<
li_D1Prime << std::endl;
1791 Xyce::dout() << section_divider << std::endl;
1841 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1843 Xyce::dout() << std::endl;
1844 Xyce::dout() << section_divider << std::endl;
1845 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
1846 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1847 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
1881 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
1883 Xyce::dout() <<
" State local indices:" << std::endl;
1884 Xyce::dout() << std::endl;
1886 Xyce::dout() <<
" li_state_vbdd = " <<
li_state_vbdd <<
"\n";
1887 Xyce::dout() <<
" li_state_vbs = " <<
li_state_vbs <<
"\n";
1888 Xyce::dout() <<
" li_state_vgps = " <<
li_state_vgps <<
"\n";
1889 Xyce::dout() <<
" li_state_vdds = " <<
li_state_vdds <<
"\n";
1890 Xyce::dout() <<
" li_state_qgs = " <<
li_state_qgs <<
"\n";
1895 Xyce::dout() <<
" li_state_qgdd = " <<
li_state_qgdd <<
"\n";
1897 Xyce::dout() <<
" li_state_qgb = " <<
li_state_qgb <<
"\n";
1899 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs <<
"\n";
1901 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd <<
"\n";
1905 Xyce::dout() <<
" li_state_von = " <<
li_state_von <<
"\n";
1907 Xyce::dout() << std::endl;
1908 Xyce::dout() << section_divider << std::endl;
1978 std::vector<int> map;
1979 std::vector< std::vector<int> > map2;
2159 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
2283 double coef_Jdxp(0.0);
2285 double ceqbs(0.0), ceqbd(0.0), ceqgb(0.0), ceqgs(0.0), ceqgdd(0.0);
2292 ceqgdd = Dtype*
qgdd;
2294 qVec[
li_Bulk] += (ceqbs + ceqbd - ceqgb);
2307 dQdxdVp[
li_Bulk] += coef_Jdxp;
2380 double coef_Jdxp(0.0), gd_Jdxp(0.0);
2384 double ceqbs = Dtype*(
cbs+
cqbs);
2385 double ceqbd = Dtype*(
cbd+
cqbd);
2387 double D1current = Dtype*
D1cdeq;
2396 fVec[
li_Bulk] += (ceqbs + ceqbd);
2408 dFdxdVp[
li_Bulk] += coef_Jdxp;
2411 coef_Jdxp = Dtype*(-((
gbd-gmin1))*
2607 bool bsuccess =
true;
2614 #define ISUBMOD model_.isubmod
2626 double capgs_old(0.0);
2627 double capgdd_old(0.0);
2628 double capgb_old(0.0);
2632 double D1power(0.0);
2637 double D1csatr(0.0);
2638 double D1czero(0.0);
2639 double D1czof2(0.0);
2643 double D1evrev(0.0);
2646 double D1vdtemp(0.0);
2650 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2652 Xyce::dout() << subsection_divider << std::endl;
2653 Xyce::dout() <<
" Instance::updateIntermediateVars.\n"<<std::endl;
2654 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2655 Xyce::dout() <<
" Model name = " <<
model_.
getName() << std::endl;
2656 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
2657 Xyce::dout() << std::endl;
2658 Xyce::dout().width(25); Xyce::dout().precision(17); Xyce::dout().setf(std::ios::scientific);
2699 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2701 Xyce::dout() <<
" " << std::endl;
2702 Xyce::dout() <<
" Solution vector: " << std::endl;
2703 Xyce::dout() <<
" Vg = " <<
Vg << std::endl;
2704 Xyce::dout() <<
" Vd = " <<
Vd << std::endl;
2705 Xyce::dout() <<
" Vs = " <<
Vs << std::endl;
2706 Xyce::dout() <<
" Vb = " <<
Vb << std::endl;
2707 Xyce::dout() <<
" Vdp = " <<
Vdp << std::endl;
2708 Xyce::dout() <<
" Vgp = " <<
Vgp << std::endl;
2709 Xyce::dout() <<
" Vsp = " <<
Vsp << std::endl;
2710 Xyce::dout() <<
" Vdd = " <<
Vdd << std::endl;
2711 Xyce::dout() <<
" Vd1p= " <<
Vd1p << std::endl;
2755 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
2814 Xyce::dout() <<
"After Von first set, ";
2815 Xyce::dout() <<
" von = " <<
von <<
" Von = " << Von << std::endl;
2823 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2825 Xyce::dout() <<
" checking whether to limit voltages "<< std::endl;
2826 Xyce::dout() <<
" Von = " << Von << std::endl;
2827 Xyce::dout() <<
" before limiting: " << std::endl;
2828 Xyce::dout() <<
" vgpdd = " <<
vgpdd <<
" vgpdd_old = " <<
vgpdd_old << std::endl;
2829 Xyce::dout() <<
" vgps = " <<
vgps <<
" vgps_old = " <<
vgps_old << std::endl;
2830 Xyce::dout() <<
" vdds = " << vdds <<
" vdds_old = " <<
vdds_old << std::endl;
2831 Xyce::dout() <<
" vbs = " <<
vbs <<
" vbs_old = " <<
vbs_old << std::endl;
2832 Xyce::dout() <<
" vbdd = " <<
vbdd <<
" vbdd_old = " <<
vbdd_old << std::endl;
2862 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2864 Xyce::dout() <<
" After limiting: " << std::endl;
2865 Xyce::dout() <<
" vgpdd = " <<
vgpdd << std::endl;
2866 Xyce::dout() <<
" vgps = " <<
vgps << std::endl;
2867 Xyce::dout() <<
" vdds = " << vdds << std::endl;
2868 Xyce::dout() <<
" vbs = " <<
vbs << std::endl;
2869 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
2873 bool tmpGiven =
false;
2900 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2902 Xyce::dout() <<
" vbs = " << vbs << std::endl;
2903 Xyce::dout() <<
" vgps = " <<
vgps << std::endl;
2904 Xyce::dout() <<
" vdds = " << vdds << std::endl;
2905 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
2906 Xyce::dout() <<
" vgpdd= " <<
vgpdd << std::endl;
2908 Xyce::dout() <<
" Vddp = " <<
Vddp << std::endl;
2909 Xyce::dout() <<
" Vddd = " <<
Vddd << std::endl;
2910 Xyce::dout() <<
" Vdddp= " <<
Vdddp << std::endl;
2911 Xyce::dout() <<
" Vssp = " <<
Vssp << std::endl;
2912 Xyce::dout() <<
" Vbsp = " <<
Vbsp << std::endl;
2913 Xyce::dout() <<
" Vbdp = " <<
Vbdp << std::endl;
2914 Xyce::dout() <<
" Vggp = " <<
Vggp << std::endl;
2915 Xyce::dout() <<
" Vgpsp = " <<
Vgpsp << std::endl;
2916 Xyce::dout() <<
" Vgpdp = " <<
Vgpdp << std::endl;
2917 Xyce::dout() <<
" Vgpb = " <<
Vgpb << std::endl;
2918 Xyce::dout() <<
" Vdpsp= " <<
Vdpsp << std::endl;
2926 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2930 Xyce::dout() <<
" Something modified the voltages. " << std::endl;
2931 Xyce::dout() <<
" Voltage before after diff " << std::endl;
2933 Xyce::dout() <<
" vdds " <<
vdds_orig <<
" " << vdds <<
" " << vdds-
vdds_orig << std::endl;
2934 Xyce::dout() <<
" vbs " <<
vbs_orig <<
" " << vbs <<
" " << vbs-
vbs_orig << std::endl;
2969 j1=
model_.
artd*log(end1/end2)*(pi/2+atan(end3));
2974 d1j1=(fr1-fr2)*(pi/2+atan(end3));
2976 d2j1=log(end1/end2)*fr3;
2995 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
2997 Xyce::dout() <<
"*******Setting cbs for vbs<=0 ******" << std::endl;
2998 Xyce::dout() <<
" vbs = " << vbs << std::endl;
2999 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3000 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3001 Xyce::dout() <<
" SSC = " <<
SourceSatCur << std::endl;
3002 Xyce::dout() <<
" gbs = " << gbs << std::endl;
3003 Xyce::dout() <<
" cbs = " <<
cbs << std::endl;
3004 Xyce::dout() <<
" j1 = " << j1 << std::endl;
3017 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3019 Xyce::dout() <<
"*******Setting cbs for vbs>0 ******" << std::endl;
3020 Xyce::dout() <<
" vbs = " << vbs << std::endl;
3021 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3022 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3023 Xyce::dout() <<
" vbs/vt = " << vbs/
vt << std::endl;
3027 Xyce::dout() <<
" evbs = " << evbs << std::endl;
3028 Xyce::dout() <<
" gbs = " <<
gbs << std::endl;
3029 Xyce::dout() <<
" cbs = " << cbs << std::endl;
3041 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3043 Xyce::dout() <<
"*******Setting cbd for vbdd<=0 ******" << std::endl;
3044 Xyce::dout() <<
" vbdd = " << vbdd << std::endl;
3045 Xyce::dout() <<
" SSC = " <<
SourceSatCur << std::endl;
3046 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3047 Xyce::dout() <<
" n2 = " <<
model_.
n2 << std::endl;
3048 Xyce::dout() <<
" gbd = " << gbd << std::endl;
3049 Xyce::dout() <<
" cbd = " <<
cbd << std::endl;
3065 Xyce::dout() <<
"*******Setting cbd for vbdd>0 ******" << std::endl;
3066 Xyce::dout() <<
" vbdd = " <<
vbdd << std::endl;
3067 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3068 Xyce::dout() <<
" vbdd/vt = " <<
vbdd/
vt << std::endl;
3072 Xyce::dout() <<
" evbdd = " << evbdd << std::endl;
3073 Xyce::dout() <<
" gbd = " <<
gbd << std::endl;
3074 Xyce::dout() <<
" cbd = " << cbd << std::endl;
3083 double dvonvbs(0.0);
3084 double lvbs =
mode == 1 ? vbs :
vbdd;
3122 D1evd = D1arg = D1evrev = 0.0;
3127 D1evr = exp(
D1vd/D1vtr);
3129 D1arg = D1temp*D1temp;
3131 D1isr = D1csatr*D1power;
3132 D1cdr = D1isr*(D1evr - 1);
3156 D1arg = D1arg * D1arg * D1arg;
3168 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3170 Xyce::dout() <<
" " << std::endl;
3171 Xyce::dout() <<
" dtype = " <<
model_.
dtype << std::endl;
3172 Xyce::dout() <<
" D1vd = " <<
D1vd << std::endl;
3173 Xyce::dout() <<
" D1vtr = " << D1vtr << std::endl;
3174 Xyce::dout() <<
" D1csat = " << D1csat << std::endl;
3175 Xyce::dout() <<
" D1csatr = " << D1csatr << std::endl;
3176 Xyce::dout() <<
" D1gspr = " <<
D1gspr << std::endl;
3177 Xyce::dout() <<
" D1cdr = " << D1cdr << std::endl;
3178 Xyce::dout() <<
" D1gdr = " << D1gdr << std::endl;
3179 Xyce::dout() <<
" D1vte = " <<
D1vte << std::endl;
3180 Xyce::dout() <<
" D1evd = " << D1evd << std::endl;
3181 Xyce::dout() <<
" D1arg = " << D1arg << std::endl;
3182 Xyce::dout() <<
" D1evrev = " << D1evrev << std::endl;
3183 Xyce::dout() <<
" D1DIOtBrkdwnV = " <<
D1DIOtBrkdwnV << std::endl << std::endl;
3184 Xyce::dout() <<
" D1cd = " << D1cd << std::endl;
3185 Xyce::dout() <<
" D1gd = " <<
D1gd << std::endl;
3186 Xyce::dout() <<
" D1cdeq = " <<
D1cdeq << std::endl;
3226 sarg = sargsw = 1/sqrt(arg);
3245 sargsw = 1/sqrt(arg);
3285 sarg = sargsw = 1/sqrt(arg);
3299 sargsw = 1/sqrt(arg);
3309 +
Cbdsw*(1-arg*sargsw)
3352 Xyce::dout() <<
" " << std::endl;
3353 Xyce::dout() <<
" Going into qmeyer..." << std::endl;
3354 Xyce::dout() <<
" Mode is " <<
mode << std::endl;
3355 Xyce::dout() <<
" Args are vgps = " <<
vgps <<
" vgpdd = " <<
vgpdd << std::endl;
3356 Xyce::dout() <<
" Vgpb = " <<
Vgpb <<
" Von = " << Von <<
" Vddsat = " << Vddsat << std::endl;
3357 Xyce::dout() <<
" tPhi = " <<
tPhi <<
" OxideCap = " <<
OxideCap << std::endl;
3400 Xyce::dout() <<
"Doing meyer back averaging..."<< std::endl;
3401 Xyce::dout() <<
" capgs = " <<
capgs <<
" capgs_old = " << capgs_old << std::endl;
3402 Xyce::dout() <<
" capgdd = " <<
capgdd <<
" capgdd_old = " << capgdd_old << std::endl;
3403 Xyce::dout() <<
" capgb = " <<
capgb <<
" capgb_old = " << capgb_old << std::endl;
3411 Xyce::dout() <<
"Capgs = " <<
Capgs << std::endl;
3412 Xyce::dout() <<
"Capgdd = " <<
Capgdd << std::endl;
3413 Xyce::dout() <<
"Capgb = " <<
Capgb << std::endl;
3414 Xyce::dout() <<
"capgs = " <<
capgs << std::endl;
3415 Xyce::dout() <<
"capgdd = " <<
capgdd << std::endl;
3416 Xyce::dout() <<
"capgb = " <<
capgb << std::endl;
3423 double absV = fabs(
Vddd);
3430 double dVddd_dVd (1.0);
3431 double d_absVddd_dVd (0.0);
3434 d_absVddd_dVd = 1.0;
3436 else if (
Vddd < 0.0)
3438 d_absVddd_dVd = -1.0;
3481 Xyce::dout() <<
" Done with Instance::updateIntermediateVars " << std::endl;
3482 Xyce::dout() <<
" mode = " <<
mode << std::endl;
3483 Xyce::dout() <<
" Idrain = " <<
Idrain << std::endl;
3484 Xyce::dout() <<
" Igate = " <<
Igate << std::endl;
3485 Xyce::dout() <<
" Isource = " <<
Isource << std::endl;
3486 Xyce::dout() <<
" Idraindrift = " <<
Idraindrift << std::endl;
3487 Xyce::dout() <<
" Ird1rs = " << Ird1rs << std::endl;
3488 Xyce::dout() <<
" dIdd_dVd = " <<
dIdd_dVd << std::endl;
3489 Xyce::dout() <<
" gddd = " <<
gddd << std::endl;
3490 Xyce::dout() <<
" Irdsshunt = " <<
Irdsshunt << std::endl;
3491 Xyce::dout() <<
" D1DIOcapCurrent = " <<
D1DIOcapCurrent << std::endl;
3492 Xyce::dout() <<
" cbd = " << cbd << std::endl;
3493 Xyce::dout() <<
" cbs = " <<
cbs << std::endl;
3494 Xyce::dout() <<
" qbd = " <<
qbd << std::endl;
3495 Xyce::dout() <<
" qbs = " <<
qbs << std::endl;
3496 Xyce::dout() <<
" cdrain = " <<
cdrain << std::endl;
3497 Xyce::dout() <<
" cdraindrift = " <<
cdraindrift << std::endl;
3498 Xyce::dout() <<
" cdreq = " <<
cdreq << std::endl;
3499 Xyce::dout() <<
" gdds = " <<
gdds << std::endl;
3500 Xyce::dout() <<
" gdsshunt = " <<
gdsshunt << std::endl;
3501 Xyce::dout() <<
" gm = " <<
gm << std::endl;
3502 Xyce::dout() <<
" gmbs = " <<
gmbs << std::endl;
3503 Xyce::dout() <<
" Gm = " <<
Gm << std::endl;
3504 Xyce::dout() <<
" Gmbs = " <<
Gmbs << std::endl;
3549 bool bsuccess =
true;
3558 double ratio,ratio4(0.0);
3563 double capfact(0.0);
3566 double gmanew,gmaold(0.0);
3571 double D1vte_loc(0.0);
3576 double D1vt_loc(0.0);
3577 register int D1iter(0.0);
3578 double D1egfet1(0.0),D1arg1(0.0),D1fact1(0.0),D1pbfact1(0.0),D1pbo(0.0),D1gmaold(0.0);
3579 double D1fact2(0.0),D1pbfact(0.0),D1arg(0.0),D1egfet(0.0),D1gmanew(0.0);
3588 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3590 Xyce::dout() << subsection_divider << std::endl;
3591 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
3592 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3593 Xyce::dout() << std::endl;
3597 if (temp_tmp != -999.0)
temp = temp_tmp;
3614 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
3616 Xyce::dout() <<
" Temperature = "<<
temp << std::endl;
3617 Xyce::dout() <<
" tnom = " << tnom << std::endl;
3618 Xyce::dout() <<
" ratio = " << ratio << std::endl;
3627 pbfact = -2*
vt *(1.5*log(fact2)+
CONSTQ*arg);
3631 Xyce::dout() <<
" fact1 = " <<
model_.
fact1 << std::endl;
3632 Xyce::dout() <<
" vtnom = " <<
model_.
vtnom << std::endl;
3633 Xyce::dout() <<
" egfet1 = " <<
model_.
egfet1 << std::endl;
3634 Xyce::dout() <<
" pbfact1= " <<
model_.
pbfact1 << std::endl;
3635 Xyce::dout() <<
" vt = " <<
vt << std::endl;
3636 Xyce::dout() <<
" ratio = " << ratio << std::endl;
3637 Xyce::dout() <<
" fact2 = " << fact2 << std::endl;
3638 Xyce::dout() <<
" kt = " << kt << std::endl;
3639 Xyce::dout() <<
" egfet = " << egfet << std::endl;
3640 Xyce::dout() <<
" arg = " << arg << std::endl;
3641 Xyce::dout() <<
" pbfact = " << pbfact << std::endl;
3644 ratio4 = ratio * sqrt(ratio);
3647 tPhi = fact2 * phio + pbfact;
3682 Xyce::dout() <<
" ratio4 = " << ratio4 << std::endl;
3683 Xyce::dout() <<
" tSurfMob = " <<
tSurfMob << std::endl;
3684 Xyce::dout() <<
" phio = " << phio << std::endl;
3685 Xyce::dout() <<
" tPhi = " <<
tPhi << std::endl;
3686 Xyce::dout() <<
" tVbi = " <<
tVbi << std::endl;
3687 Xyce::dout() <<
" tVto = " <<
tVto << std::endl;
3688 Xyce::dout() <<
" tSatCur = " <<
tSatCur << std::endl;
3689 Xyce::dout() <<
" tSatCurDens = " <<
tSatCurDens << std::endl;
3690 Xyce::dout() <<
" pbo = " << pbo << std::endl;
3691 Xyce::dout() <<
" gmaold = " << gmaold << std::endl;
3692 Xyce::dout() <<
" tBulkPot = " <<
tBulkPot << std::endl;
3693 Xyce::dout() <<
" gmanew = " << gmanew << std::endl;
3694 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3695 Xyce::dout() <<
" tCbd = " <<
tCbd << std::endl;
3696 Xyce::dout() <<
" tCbs = " <<
tCbs << std::endl;
3697 Xyce::dout() <<
" tCj = " <<
tCj << std::endl;
3698 Xyce::dout() <<
" capfact = " << capfact << std::endl;
3699 Xyce::dout() <<
" tCjsw = " <<
tCjsw << std::endl;
3700 Xyce::dout() <<
" tDepCap = " <<
tDepCap << std::endl;
3815 vthLimit = Util::MachineDependentParams::DoubleMax();
3828 D1egfet = 1.16-(7.02e-4*D1DIOtemp*
D1DIOtemp)/(D1DIOtemp+1108);
3829 D1arg = -D1egfet/(2*CONSTboltz*
D1DIOtemp) + 1.1150877/
3831 D1pbfact = -2*D1vt_loc*(1.5*log(D1fact2)+
CONSTQ*D1arg);
3838 (1.5*log(D1fact1)+
CONSTQ*D1arg1);
3877 Xyce::dout() <<
" breakdown current increased to " << D1cbv <<
3878 "to resolve incompatability " <<
3879 "with specified saturation current" << std::endl;
3886 D1vt_loc*log(1+D1cbv/D1DIOtSatCur);
3887 for(D1iter=0; D1iter<25; ++D1iter)
3890 D1DIOtSatCur+1-D1xbv/D1vt_loc);
3892 -D1xbv)/D1vt_loc)-1+D1xbv/D1vt_loc);
3893 if (fabs(D1xcbv-D1cbv) <= D1tol)
goto matched;
3895 Xyce::dout() <<
" unable to match forward and reverse diode regions: D1bv = "
3896 << D1xbv <<
" D1ibv = " << D1xcbv << std::endl;
3915 bool bsuccess =
true;
3916 double vgs1(0.0), vgdd1(0.0), vbs1(0.0),vgb1(0.0), vdds1(0.0);
3921 bsuccess = bsuccess && tmpBool;
4123 UserError0(*
this) <<
"Effective channel length less than zero.";
4135 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
4137 Xyce::dout() <<
" L = " <<
l << std::endl;
4138 Xyce::dout() <<
" W = " << w<< std::endl;
4139 Xyce::dout() <<
" drainArea = " <<
drainArea<< std::endl;
4140 Xyce::dout() <<
" sourceArea = " <<
sourceArea<< std::endl;
4141 Xyce::dout() <<
" drainSquares = " <<
drainSquares<< std::endl;
4142 Xyce::dout() <<
" sourceSquares = " <<
sourceSquares<< std::endl;
4143 Xyce::dout() <<
" drainPerimeter = " <<
drainPerimeter<< std::endl;
4145 Xyce::dout() <<
" drainCond = " <<
drainCond<< std::endl;
4146 Xyce::dout() <<
" sourceCond = " <<
sourceCond << std::endl;
4147 Xyce::dout() <<
" draindriftCond = " <<
draindriftCond<< std::endl;
4148 Xyce::dout() <<
" temp = " <<
temp<< std::endl;
4176 double vddsat_local,
4177 double & capgs_local,
4178 double & capgdd_local,
4179 double & capgb_local,
4184 double vdds_local(0.0);
4194 #define L EffectiveLength
4195 #define ETA model_.eta
4196 #define TOX model_.oxideThickness
4198 vgst = xvgs-von_local;
4201 capgb_local = cox/2;
4205 else if (vgst <= -phi/2)
4207 capgb_local = -vgst*cox/(2*phi);
4213 capgb_local = -vgst*cox/(2*phi);
4214 capgs_local = vgst*cox/(1.5*phi)+cox/3;
4219 vdds_local = xvgs-xvgdd;
4221 if (vddsat_local <= vdds_local)
4223 capgs_local = cox/3;
4228 vddif = 2.0*vddsat_local-vdds_local;
4229 vddif1 = vddsat_local-vdds_local;
4230 vddif2 = vddif*vddif;
4231 capgdd_local = cox*(1.0-vddsat_local*vddsat_local/vddif2)/3;
4232 capgs_local = cox*(1.0-vddif1*vddif1/vddif2)/3;
4239 if(
model_.
cv == 2 && vddsat_local != 0)
4241 vdds_local = fabs(xvgs-xvgdd);
4242 vdds_local = vdds_local/pow(1+pow(vdds_local/vddsat_local,
model_.
mc),
4244 vddif = 2.0*vddsat_local-vdds_local;
4245 vddif1 = vddsat_local-vdds_local;
4246 vddif2 = vddif*vddif;
4250 capgdd_local = cgc*(1.0-vddsat_local*vddsat_local/vddif2)/3;
4251 capgs_local = cgc*(1.0-vddif1*vddif1/vddif2)/3;
4277 double vbs_local(0.0);
4278 double vdds_local(0.0);
4286 double DeltaVT(0.0);
4287 double DnsdVgs(0.0);
4288 double DnsdVgd(0.0);
4289 double DnsdVgb(0.0);
4290 double DnssVgs(0.0);
4291 double DnssVgd(0.0);
4292 double DnssVgb(0.0);
4293 double DndepVgs(0.0);
4294 double DndepVgd(0.0);
4295 double DndepVgb(0.0);
4316 double SigmaVgs(0.0);
4317 double SigmaVgd(0.0);
4325 vbs_local = xvgs-vgb;
4326 vdds_local = xvgs-xvgdd;
4331 if(xvgs > VFB+vbs_local)
4336 nss=2.0*
n0*log(1+0.5*exp((xvgs-
von)/etavt));
4337 nsd=2.0*
n0*log(1+0.5*exp((xvgs-
von-ALPHA*vdds_local)/etavt));
4339 if (nss<1e-36) {nss=1.0e-36;}
4340 if (nsd<1e-36) {nsd=1.0e-36;}
4341 zetanb = (1-
ALPHA)/ALPHA;
4342 xi = gamma*gamma/(A*A)+4/(A*A)*(vgb-VFB)-4.0/A*nss;
4346 if (vbs_local <= 0) { DeltaVT= 0.5*gamma/sqrt(
tPhi-vbs_local); }
4347 if ((vbs_local > 0)&&(vbs_local <= 2*
tPhi)) { DeltaVT=0.5*gamma/sqrt(
tPhi); }
4348 if ((vbs_local > 0)&&(vbs_local > 2*
tPhi)) { DeltaVT=0; }
4350 DnsdVgs=(1+DeltaVT-ALPHA+SigmaVgs)/tnsd;
4351 DnsdVgd=(-SigmaVgd+
ALPHA)/tnsd;
4352 DnsdVgb=-DeltaVT/tnsd;
4354 DnssVgs= (1+DeltaVT+SigmaVgs)/tnss;
4355 DnssVgd=-SigmaVgd/tnss;
4356 DnssVgb=-DeltaVT/tnss;
4358 UI= etavt/2.0*(nsd*nsd-nss*nss) + A/3.0*(nsd*nsd*nsd-nss*nss*nss);
4359 VI= etavt*(nsd-nss) + A/2.0*(nsd*nsd-nss*nss);
4360 DUIVgs = etavt*(nsd*DnsdVgs-nss*DnssVgs) +
4361 A*(nsd*nsd*DnsdVgs-nss*nss*DnssVgs);
4362 DUIVgd= etavt*(nsd*DnsdVgd-nss*DnssVgd) +
4363 A*(nsd*nsd*DnsdVgd-nss*nss*DnssVgd);
4364 DUIVgb= etavt*(nsd*DnsdVgb-nss*DnssVgb) +
4365 A*(nsd*nsd*DnsdVgb-nss*nss*DnssVgb);
4367 DVIVgs= etavt*(DnsdVgs-DnssVgs) + A*(nsd*DnsdVgs-nss*DnssVgs);
4368 DVIVgd= etavt*(DnsdVgd-DnssVgd) + A*(nsd*DnsdVgd-nss*DnssVgd);
4369 DVIVgb= etavt*(DnsdVgb-DnssVgb) + A*(nsd*DnsdVgb-nss*DnssVgb);
4372 DqiVgs= mqWL*(DUIVgs*VI-DVIVgs*UI)/(VI*VI);
4373 DqiVgd= mqWL*(DUIVgd*VI-DVIVgd*UI)/(VI*VI);
4374 DqiVgb= mqWL*(DUIVgb*VI-DVIVgb*UI)/(VI*VI);
4378 DqiVgs=mqWL*DnssVgs;
4379 DqiVgd=mqWL*DnssVgd;
4380 DqiVgb=mqWL*DnssVgb;
4383 DxiVgs= -4.0/A*DnssVgs;
4384 DxiVgd= -4.0/A*DnssVgd;
4385 DxiVgb= 4.0/(A*A)-4/A*DnssVgb;
4388 {DndepVgs= gamma/4.0*1.0/xisqrt*DxiVgs;
4389 DndepVgd= gamma/4.0*1.0/xisqrt*DxiVgd;
4390 DndepVgb= gamma/4.0*1.0/xisqrt*DxiVgb;
4399 DqbVgs = mqWL*(DndepVgs-zetanb*DnssVgs)+zetanb*DqiVgs;
4400 DqbVgd = mqWL*(DndepVgd-zetanb*DnssVgd)+zetanb*DqiVgd;
4401 DqbVgb = mqWL*(DndepVgb-zetanb*DnssVgb)+zetanb*DqiVgb;
4403 DqgVgs= -DqiVgs-DqbVgs;
4404 DqgVgd= -DqiVgd-DqbVgd;
4405 DqgVgb= -DqiVgb-DqbVgb;
4415 if (DqgVgs<0) {DqgVgs=0;}
4416 if (DqgVgd<0) {DqgVgd=0;}
4417 if (DqgVgb<0) {DqgVgb=0;}
4437 double vgb,
double & qD,
double & qS,
double & qB)
4458 double vdds_local(0.0);
4467 vdds_local=vgs-vgdd;
4474 nsd=2*
n0*log(1+0.5*exp((vgs-VT-ALPHA*vdds_local)/etavth));
4475 nss=2*
n0*log(1+0.5*exp((vgs-VT)/etavth));
4481 arg1= 0.5*etavth*(nsdsqr-nsssqr)+1/3.0*A*(nsdsqr*nsd-nsssqr*nss);
4482 arg2= etavth*(nsd-nss) +0.5*A*(nsdsqr-nsssqr);
4486 else {qn = mqWL*arg1/arg2;}
4487 xisqrt= sqrt(gamma*gamma/(A*A)+4.0/(A*A)*(vgb-VFB)-4.0/A*nss);
4488 ndeps = -gamma*gamma/(2.0*A)+ gamma/2.0*xisqrt;
4489 zetanb =(1-
ALPHA)/ALPHA;
4491 qB =mqWL*(ndeps-zetanb*nss)+zetanb*qn;
4506 double fp1denum(0.0);
4508 vdsabs=fabs(vdds_local);
4512 if((vsat > 1e-36)&&(vdds_local>1e-36))
4513 { beta=vdsabs/vsat;}
else{beta=1e-36;}
4516 fp1denum = exp(1/m*log(1+exp(m*log(beta))));
4517 if (fp1denum > 1e-36)
4518 {fp1= 0.5+ a0*vdsabs/fp1denum;}
4528 double arg1_loc(0.0);
4529 double arg2_loc(0.0);
4530 double arg3_loc(0.0);
4534 arg1_loc= nd0*nd0*nd0*(1/3.0+nd0*(3.0/8.0+1/10.0*nd0))
4535 - (1.0/2.0+1.0/3.0*nd0)*(1.0+1/2.0*ns0)*nd0*nd0*ns0
4536 + ns0*ns0*ns0*(1.0/6.0+ns0*(5.0/24.0+1.0/15.0*ns0));
4537 arg2_loc = 1.0/2.0*(nd0*nd0-ns0*ns0)+1.0/3.0*(nd0*nd0*nd0-ns0*ns0*ns0);
4538 arg3_loc = nd0-ns0+1.0/2.0*(nd0*nd0-ns0*ns0);
4539 if ((arg2_loc==0)||(arg3_loc==0)) {fp1=0.5;}
4540 else { fp1 = 1-arg1_loc/(arg2_loc*arg3_loc);}
4545 UserWarning(*
this) <<
"Partitioning model does not exist";
4576 double & von_local,
double & dvonvbs_local)
4578 double PhiMinVbs =
tPhi - vbs_local;
4586 dvonvbs_local = 0.0;
4591 sarg = sqrt(PhiMinVbs);
4617 double dvonvbs,
double & cdraindrift_loc,
double & vsate)
4636 double x(0.0),y(0.0),z(0.0);
4645 double dichoodvds(0.0);
4646 double dichoodvgs(0.0);
4647 double dichoodvbs(0.0);
4648 double dichooisat(0.0);
4649 double dichoodgch(0.0);
4650 double delgchgchi(0.0);
4651 double disatdvds(0.0);
4652 double disatdvgs(0.0);
4653 double disatdvbs(0.0);
4654 double dgchidvds(0.0);
4655 double dgchidvgs(0.0);
4656 double dgchidvbs(0.0);
4657 double disatvgte(0.0);
4658 double disatgchi(0.0);
4659 double dvgtedvgt(0.0);
4660 double dvgtdvds(0.0);
4661 double dvgtdvgs(0.0);
4662 double dvgtdvbs(0.0);
4663 double dnsdvgt(0.0);
4664 double dnsdvds(0.0);
4665 double dnsdvgs(0.0);
4666 double dnsdvbs(0.0);
4667 double dmudvgte(0.0);
4668 double dmudvds(0.0);
4669 double dmudvgs(0.0);
4670 double dmudvbs(0.0);
4672 static int output=0;
4674 #define ETA model_.eta
4675 #define RS model_.sourceResistance
4676 #define RD model_.drainResistance
4677 #define VSIGMAT model_.vsigmat
4678 #define VSIGMA model_.vsigma
4679 #define SIGMA0 model_.sigma0
4680 #define THETA model_.theta
4681 #define LAMBDA model_.lambda
4682 #define DELTA model_.delta
4683 #define VMAX model_.maxDriftVel
4684 #define TOX model_.oxideThickness
4686 #define EXP_MAX 150.0
4689 Xyce::dout() <<
" " << std::endl;
4690 Xyce::dout() <<
"ETA = " <<
ETA << std::endl;
4691 Xyce::dout() <<
"RS = " <<
RS << std::endl;
4692 Xyce::dout() <<
"RD = " <<
RD << std::endl;
4693 Xyce::dout() <<
"VSIGMAT = " <<
VSIGMAT << std::endl;
4694 Xyce::dout() <<
"VSIGMA = " <<
VSIGMA << std::endl;
4695 Xyce::dout() <<
"SIGMA0 = " <<
SIGMA0 << std::endl;
4696 Xyce::dout() <<
"THETA = " <<
THETA << std::endl;
4697 Xyce::dout() <<
"LAMBDA = " <<
LAMBDA << std::endl;
4698 Xyce::dout() <<
"DELTA = " <<
DELTA << std::endl;
4699 Xyce::dout() <<
"VMAX = " <<
VMAX << std::endl;
4700 Xyce::dout() <<
"TOX = " <<
TOX << std::endl;
4709 vgt = vgt0+sigma*xvdds;
4712 vgte = vt*(1+b+1+q);
4727 ns = 2.0*
n0*log(1+0.5*exp(x));
4731 cdraindrift_loc = 0.0;
4744 gch = gchi/(1+gchi*rt);
4749 d = sqrt(1+2*gchi*
RS + vgte*vgte/vl2);
4757 else z = 1/(cosh(y)*cosh(y));
4760 ichoo = isat*(1+
LAMBDA*xvdds)*tanh(y);
4762 dvgtedvgt = 0.5*(1+b/q);
4763 dnsdvgt =
n0/(etavt*(exp(-x)+0.5));
4768 dvgtdvbs = -dvonvbs*dvgtdvgs;
4770 dnsdvds = dnsdvgt*dvgtdvds;
4771 dnsdvgs = dnsdvgt*dvgtdvgs;
4772 dnsdvbs = dnsdvgt*dvgtdvbs;
4773 dmudvds = (dmudvgte*dvgtedvgt)*dvgtdvds;;
4774 dmudvgs = (dmudvgte*dvgtedvgt)*dvgtdvgs;;
4775 dmudvbs = (dmudvgte*dvgtedvgt)*dvgtdvbs + 2*dmudvgte*dvonvbs;
4777 dgchidvds =
gchi0*(mu*dnsdvds + ns*dmudvds);
4778 dgchidvgs =
gchi0*(mu*dnsdvgs + ns*dmudvgs);
4779 dgchidvbs =
gchi0*(mu*dnsdvbs + ns*dmudvbs);
4781 disatvgte = gchi/h - gchi*vgte*vgte/vl2/(d*h*h);
4782 disatgchi = vgte/h - gchi*vgte*
RS*(1+1/d)/(h*h);
4784 disatdvds = (disatvgte*dvgtedvgt)*dvgtdvds + disatgchi*dgchidvds;
4785 disatdvgs = (disatvgte*dvgtedvgt)*dvgtdvgs + disatgchi*dgchidvgs;
4786 disatdvbs = (disatvgte*dvgtedvgt)*dvgtdvbs + disatgchi*dgchidvbs;
4788 dichoodgch = (1+
LAMBDA*xvdds)*xvdds*z;
4789 dichooisat = (1+
LAMBDA*xvdds)*(tanh(y) - gch*xvdds*z/isat);
4791 delgchgchi = 1/(g*g);
4793 dichoodvds = dichooisat*disatdvds + (dichoodgch*delgchgchi)*dgchidvds
4795 dichoodvgs = dichooisat*disatdvgs + (dichoodgch*delgchgchi)*dgchidvgs;
4796 dichoodvbs = dichooisat*disatdvbs + (dichoodgch*delgchgchi)*dgchidvbs;
4799 cdraindrift_loc = ichoo;
4828 double dvonvbs,
double & cdraindrift_loc,
double & vsate)
4874 double delidgch(0.0);
4875 double delgchgchi(0.0);
4876 double delgchins(0.0);
4877 double dvgtevgt(0.0);
4878 double delidvsate(0.0);
4879 double delvsateisat(0.0);
4880 double delisatvgte(0.0);
4881 double delisatgchi(0.0);
4882 double delisatvl(0.0);
4883 double dgchivgt(0.0);
4884 double delvsategch(0.0);
4885 double delidvds(0.0);
4886 double dsigmavgs(0.0);
4887 double delnsvgt(0.0);
4888 double dvsatevgt(0.0);
4889 double dvgtvgs(0.0);
4892 double dvgtvon(0.0);
4893 double delvsatqs(0.0);
4894 double delvsatmu(0.0);
4895 double dvsatvgt(0.0);
4896 double dvsatvbs(0.0);
4897 double delvdsevdso(0.0);
4898 double delvdsevsat(0.0);
4899 double dvdsevgs(0.0);
4900 double dvdsevds(0.0);
4901 double dvdsevbs(0.0);
4904 double delmm1vdso(0.0);
4905 double ddelvgs(0.0);
4906 double ddelvds(0.0);
4907 double ddelvbs(0.0);
4911 double mm1_loc(0.0);
4912 double dmm1vgs_loc(0.0);
4913 double dmm1vds_loc(0.0);
4914 double dmm1vbs_loc(0.0);
4916 static int output(0);
4918 #define ETA model_.eta
4919 #define RS model_.sourceResistance
4920 #define RD model_.drainResistance
4921 #define VSIGMAT model_.vsigmat
4922 #define VSIGMA model_.vsigma
4923 #define SIGMA0 model_.sigma0
4924 #define THETA model_.theta
4925 #define LAMBDA model_.lambda
4926 #define DELTA model_.delta
4927 #define ALPHA model_.alpha
4928 #define VMAX model_.maxDriftVel
4929 #define TOX model_.oxideThickness
4931 #define L EffectiveLength
4932 #define LS model_.ls
4934 #define INVM 1.0/model_.m
4935 #define MC model_.mc
4936 #define INVMC 1.0/model_.mc
4937 #define RSUB model_.rsub
4938 #define AI model_.ai
4939 #define BI model_.bi
4940 #define MD model_.md
4941 #define INVMD 1.0/model_.md
4942 #define DELMAX model_.delmax
4945 Xyce::dout() <<
" " << std::endl;
4946 Xyce::dout() <<
"ETA = " <<
ETA << std::endl;
4947 Xyce::dout() <<
"RS = " <<
RS << std::endl;
4948 Xyce::dout() <<
"RD = " <<
RD << std::endl;
4949 Xyce::dout() <<
"VSIGMAT = " <<
VSIGMAT << std::endl;
4950 Xyce::dout() <<
"VSIGMA = " <<
VSIGMA << std::endl;
4951 Xyce::dout() <<
"SIGMA0 = " <<
SIGMA0 << std::endl;
4952 Xyce::dout() <<
"THETA = " <<
THETA << std::endl;
4953 Xyce::dout() <<
"LAMBDA = " <<
LAMBDA << std::endl;
4954 Xyce::dout() <<
"DELTA = " <<
DELTA << std::endl;
4955 Xyce::dout() <<
"ALPHA = " <<
ALPHA << std::endl;
4956 Xyce::dout() <<
"VMAX = " <<
VMAX << std::endl;
4957 Xyce::dout() <<
"TOX = " <<
TOX << std::endl;
4958 Xyce::dout() <<
"W = " <<
W << std::endl;
4959 Xyce::dout() <<
"L = " <<
L << std::endl;
4960 Xyce::dout() <<
"LS = " <<
LS << std::endl;
4961 Xyce::dout() <<
"M = " <<
M << std::endl;
4962 Xyce::dout() <<
"INVM = " <<
INVM << std::endl;
4963 Xyce::dout() <<
"MC = " <<
MC << std::endl;
4964 Xyce::dout() <<
"INVMC = " <<
INVMC << std::endl;
4965 Xyce::dout() <<
"RSUB = " <<
RSUB << std::endl;
4966 Xyce::dout() <<
"AI = " <<
AI << std::endl;
4967 Xyce::dout() <<
"BI = " <<
BI << std::endl;
4968 Xyce::dout() <<
"MD = " <<
MD << std::endl;
4969 Xyce::dout() <<
"INVMD = " <<
INVMD << std::endl;
4970 Xyce::dout() <<
"DELMAX = " <<
DELMAX << std::endl;
4971 Xyce::dout() <<
"VP = " <<
vp << std::endl;
4981 vgt = vgt0+sigma*xvdds;
4984 vgte = vt*(1+b+1+q);
4999 ns = 2.0*
n0*log(1+0.5*exp(x));
5005 cdraindrift_loc = 0.0;
5011 mm1 = mm1_loc = 0.0;
5019 gch = gchi/(1+gchi*rt);
5023 d = sqrt(1+2*gchi*
RS + vgte*vgte/vl2);
5025 isat = r/(1+gchi*
RS+d);
5028 z = 0.5*(cosh(2*y)+1);
5035 ichoo = isat*(1+
LAMBDA*xvdds)*tanh(y);
5036 delidgch = ichoo/gch;
5038 delgchgchi = 1/(g*g);
5039 delgchins =
gchi0*mu;
5041 delnsvgt =
n0/(etavt*(exp(-x) + 0.5));
5042 dvgtevgt = 0.5*(1+b/q);
5048 delidvsate = gch*(1+
LAMBDA*xvdds)*xvdds/(vsate)/z;
5050 delvsateisat = 1/gch;
5051 delvsategch = -(vsate)/gch;
5053 delisatgchi = (vgte*h - gchi*vgte*
RS*(1+1/d))/(h*h);
5054 delisatvgte = (gchi*h - gchi*vgte*vgte/(vl2*d))/(h*h);
5055 delisatvl = isat*isat*vgte/(gchi*d*vl2*vl);
5057 dgchivgt = delgchins*delnsvgt-gchi*mu*s*dvgtevgt;
5059 p = delgchgchi*dgchivgt;
5060 dvsatevgt = delvsateisat*(delisatgchi*dgchivgt+
5061 (delisatvgte+delisatvl*t*s)*dvgtevgt)+ delvsategch*p;
5062 g = delidgch*p+delidvsate*dvsatevgt;
5063 dvgtvgs = (1+xvdds*dsigmavgs);
5065 gdsoo = delidvds+g*sigma;
5067 dmuvon = -(2-dvgtevgt*dvgtvgs)*mu*mu*s;
5073 gbsoo = -(gmoo)*dvonvbs;
5077 double dgchivon = -delgchins*delnsvgt*dvgtvgs+gchi*dmuvon/mu;
5078 p = delgchgchi*dgchivon;
5079 double dvsatevon = delvsateisat*(delisatgchi*dgchivon+
5080 delisatvgte*dvgtevgt*dvgtvon+delisatvl*(-vl2/t)*dmuvon)+delvsategch*p;
5081 gbsoo = (delidgch*p+delidvsate*dvsatevon)*dvonvbs;
5088 qs =
CONSTQ*(ns-ichoo*temp1);
5089 dqsvgt =
CONSTQ*(delnsvgt-g*temp1);
5090 dqsvbs =
CONSTQ*(delnsvgt*dvgtvon*dvonvbs-gbsoo*temp1);
5099 delvsatqs = 2*
VMAX*L*(b-qs*mu)/temp1;
5100 delvsatmu = -a*qs/temp1;
5101 dvsatvgt = delvsatqs*dqsvgt+delvsatmu*dmuvgt;
5102 dvsatvbs = delvsatqs*dqsvbs+delvsatmu*dmuvon*dvonvbs;
5108 c = sqrt(1+qs*mu*b);
5110 delvsatqs = a*(0.5*b*mu/c);
5111 delvsatmu = -vsat/mu+a*(0.5*b*qs/c);
5112 dvsatvgt = delvsatqs*dqsvgt+delvsatmu*dmuvgt;
5113 dvsatvbs = delvsatqs*dqsvbs+delvsatmu*dmuvon*dvonvbs;
5117 vdso = xvdds-ichoo*rt;
5118 a = pow(vdso/vsat,
MC);
5121 delvdsevdso = (1-a/(1+a))/b;
5122 delvdsevsat = vdse*a/(vsat*(1+a));
5126 double deldeltalvdse(0.0);
5127 double deldeltalvdso(0.0);
5128 double deldeltalmu(0.0);
5129 double ddeltalvgs(0.0);
5130 double ddeltalvds(0.0);
5131 double ddeltalvbs(0.0);
5133 a = 1+(vdso-vdse)/
vp;
5134 b =
W*mu*cox*vdse*
RS/
L;
5141 deldeltalvdse = (-
LS/(f*a*
vp)*c-d*(1/
vp+
W*mu*cox*
RS/L))/(c*c);
5142 deldeltalvdso =
LS/(c*a*f*
vp);
5143 deldeltalmu = -d*
W*cox*vdse*
RS/(L*c*c);
5145 dvdsevgs = delvdsevsat*dvsatvgt*dvgtvgs+delvdsevdso*temp1;
5146 ddeltalvgs = deldeltalvdse*dvdsevgs + deldeltalmu*dmuvgt*dvgtvgs
5147 + deldeltalvdso*temp1;
5148 gmo = e*(gmoo+ichoo*ddeltalvgs*e/
L);
5150 dvdsevds = delvdsevsat*dvsatvgt*sigma+delvdsevdso*temp1;
5151 ddeltalvds = deldeltalvdse*dvdsevds + deldeltalmu*dmuvgt*sigma
5152 + deldeltalvdso*temp1;
5153 gdso = e*(gdsoo+ichoo*ddeltalvds*e/
L);
5155 dvdsevbs = delvdsevsat*dvsatvbs+delvdsevdso*temp1;
5156 ddeltalvbs = deldeltalvdse*dvdsevbs + deldeltalmu*dmuvon*dvonvbs
5157 + deldeltalvdso*temp1;;
5158 gbso = e*(gbsoo+ichoo*ddeltalvbs*e/
L);
5167 del = d*mm1_loc*mu*vdse;
5181 cdraindrift_loc = icho*e;
5182 delmm1vdso = a*c+mm1_loc*
LS*
BI/(b*b);
5183 dmm1vgs_loc = delmm1vdso*(-gmoo*rt-dvdsevgs);
5184 ddelvgs = h*d*(mu*vdse*dmm1vgs_loc + mm1_loc*vdse*dmuvgt*dvgtvgs
5185 + mu*mm1_loc*dvdsevgs);
5186 gm = e*(gmo+icho*ddelvgs*e);
5187 dmm1vds_loc = delmm1vdso*(1-gdsoo*rt-dvdsevds);
5188 ddelvds = h*d*(mu*vdse*dmm1vds_loc + mm1_loc*vdse*dmuvgt*sigma
5189 + mu*mm1_loc*dvdsevds);
5190 gdds = e*(gdso+icho*ddelvds*e);
5191 dmm1vbs_loc = delmm1vdso*(-gbsoo*rt-dvdsevbs);
5192 ddelvbs = h*d*(mu*vdse*dmm1vbs_loc + mm1_loc*vdse*dmuvon*dvonvbs
5193 + mu*mm1_loc*dvdsevbs);
5194 gmbs = e*(gbso+icho*ddelvbs*e);
5221 bool bsuccess =
true;
5230 bsuccess = bsuccess && btmp;
5232 double vgs1(0.0), vgdd1(0.0), vbs1(0.0),vgb1(0.0), vdds1(0.0);
5363 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
5372 double coef_Jdxp(0.0), gd_Jdxp(0.0);
5376 double ceqbs = Dtype*(mi.
cbs+mi.
cqbs);
5377 double ceqbd = Dtype*(mi.
cbd+mi.
cqbd);
5379 double D1current = Dtype*mi.
D1cdeq;
5384 if (mi.
Igate != 0.0)
5392 fVec[mi.
li_Bulk] += (ceqbs + ceqbd);
5404 dFdxdVp[mi.
li_Bulk] += coef_Jdxp;
5407 coef_Jdxp = Dtype*(-((mi.
gbd-gmin1))*
5429 double qcoef_Jdxp(0.0);
5431 double Qeqbs = Dtype*mi.
qbs;
5432 double Qeqbd = Dtype*mi.
qbd;
5433 double Qeqgb = Dtype*mi.
qgb;
5434 double Qeqgs = Dtype*mi.
qgs;
5435 double Qeqgdd = Dtype*mi.
qgdd;
5438 qVec[mi.
li_Bulk] += (Qeqbs + Qeqbd - Qeqgb);
5452 dQdxdVp[mi.
li_Bulk] += qcoef_Jdxp;
5468 dQdxdVp[mi.
li_Drain] += qcoef_Jdxp;
5478 if (mi.
Igate != 0.0)
5540 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5552 #pragma omp parallel for
5710 int sizeInstances = instanceContainer_.size();
5713 #pragma omp parallel for
5715 for (
int i=0; i<sizeInstances; ++i)
5717 Instance & mi = *(instanceContainer_.at(i));
5871 .registerDevice(
"m", 18)
5872 .registerModelType(
"pmos", 18)
5873 .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
double defw
MOS channel width.
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 initTranFlag_
RxnSet, TRA, LTRA, ACC, MOSFET, BJT, true only on very first(t=0) time step.
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
double defl
MOS channel length.
bool UCCMcvon(double vbs_local, double &von_local, double &dvonvbs_local)
double * f_DrainPrimeEquDrainPrimeNodePtr
double tnom
nominal temperature for device params.
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
double gmin
minimum allowed conductance.
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
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
static std::vector< std::vector< int > > jacStamp_DC_SC
Util::Param temp
operating temperature of ckt.
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