48 #include <Xyce_config.h>
74 #include <N_ERH_ErrorMgr.h>
78 #include <N_LAS_Matrix.h>
79 #include <N_LAS_Vector.h>
86 #define CONSTEPS0 8.85418e-12
88 #define CONSTMAX_EXP 5.834617425e+14
89 #define CONSTMIN_EXP 1.713908431e-15
91 #define CONSTEXP_THRESHOLD 34.0
93 #define CONSTDELTA_1 0.02
94 #define CONSTDELTA_2 0.02
95 #define CONSTDELTA_3 0.02
96 #define CONSTDELTA_4 0.02
99 #define Charge_q (1.60219e-19) // electron charge, used in the
106 #define CONSTKboQ 8.617087e-5 // another updateTemperature constant, which is
110 #define CONSTvt0 (CONSTboltz * (27.0 +CONSTCtoK)/CONSTQ)
112 #define CONSTMM 3 // smooth coeff
114 #define DEXP(A,B,C) { \
115 if (A > CONSTEXP_THRESHOLD) { \
116 B = CONSTMAX_EXP*(1.0+(A)-CONSTEXP_THRESHOLD); \
118 } else if (A < -CONSTEXP_THRESHOLD) { \
129 #define DEXP2(A,B) { \
130 if (A > CONSTEXP_THRESHOLD) { \
131 B = CONSTMAX_EXP*(1.0+(A)-CONSTEXP_THRESHOLD); \
132 } else if (A < -CONSTEXP_THRESHOLD) { \
143 namespace MOSFET_B4 {
167 NULL,
U_NONE,
CAT_NONE,
"distance between OD edge to poly of one side ");
171 NULL,
U_NONE,
CAT_NONE,
"distance between OD edge to poly of the other side");
180 U_NONE,
CAT_NONE,
"Integral of the first distribution function for scattered well dopant");
185 U_NONE,
CAT_NONE,
"Integral of the second distribution function for scattered well dopant");
190 U_NONE,
CAT_NONE,
"Integral of the third distribution function for scattered well dopant");
256 NULL,
U_NONE,
CAT_NONE,
"Distance from gate contact center to device edge");
326 NULL,
U_VOLT,
CAT_BASIC,
"Voltage for extraction of equivalent gate oxide thickness");
346 NULL,
U_METER,
CAT_PROCESS,
"Gate oxide thickness at which parameters are extracted");
359 NULL,
U_NONE,
CAT_PROCESS,
"Dielectric constant of the gate oxide relative to vacuum");
396 NULL,
U_NONE,
CAT_BASIC,
"Non-uniform depletion width effect coefficient.");
412 NULL,
U_VOLTM1,
CAT_BASIC,
"Body-bias coefficient of non-uniform depletion width effect.");
422 U_NONE,
CAT_NONE,
"Dielectric constant of gate relative to vacuum");
432 U_NONE,
CAT_BASIC,
"Dielectric constant of substrate relative to vacuum");
437 U_CMM3,
CAT_BASIC,
"Intrinsic carrier concentration of substrate at 300.15K");
453 U_DEGK,
CAT_BASIC,
"Second parameter of band-gap change due to temperature");
471 NULL,
U_VOLT,
CAT_BASIC,
"Adjusting parameter for surface potential due to non-uniform vertical doping");
545 NULL,
U_METER,
CAT_BASIC,
"Equivalent length of pocket region at zero bias");
549 NULL,
U_METER,
CAT_BASIC,
"Equivalent length of pocket region accounting for body bias");
582 NULL,
U_NONE,
CAT_BASIC,
"DIBL coefficient in the subthreshold region");
646 NULL,
U_NONE,
CAT_BASIC,
"Fitting parameter for moderate inversion in Vgsteff");
650 NULL,
U_NONE,
CAT_CAP,
"Fitting parameter for moderate inversion in Vgsteffcv");
654 NULL,
U_VOLT,
CAT_BASIC,
"Length dependence parameter for Vth offset");
658 NULL,
U_NONE,
CAT_CAP,
"Length dependence parameter for Vth offset in CV");
677 U_NONE,
CAT_CAP,
"Gate-bulk overlap capacitance per length");
726 NULL,
U_NONE,
CAT_NONE,
"Temperature coefficient of parasitic resistance ");
744 NULL,
U_NONE,
CAT_BASIC,
"Drain-induced barrier lowering coefficient");
748 NULL,
U_NONE,
CAT_BASIC,
"Drain-induced barrier lowering coefficient");
757 NULL,
U_VMMH,
CAT_BASIC,
"Rout degradation coefficient for pocket devices");
783 NULL,
U_NONE,
CAT_NONE,
"Gate dependence of output resistance parameter");
787 NULL,
U_NONE,
CAT_NONE,
"Bottom source junction reverse saturation current density");
791 NULL,
U_NONE,
CAT_NONE,
"Isolation edge sidewall source junction reverse saturation current density");
795 NULL,
U_NONE,
CAT_NONE,
"Gate edge source junction reverse saturation current density");
807 NULL,
U_NONE,
CAT_NONE,
"Source junction current temperature exponent");
811 NULL,
U_NONE,
CAT_NONE,
"Source bottom junction capacitance grading coefficient");
815 NULL,
U_NONE,
CAT_NONE,
"Source sidewall junction capacitance built in potential");
819 NULL,
U_NONE,
CAT_NONE,
"Source sidewall junction capacitance grading coefficient");
824 NULL,
U_NONE,
CAT_NONE,
"Source (gate side) sidewall junction capacitance built in potential");
828 NULL,
U_NONE,
CAT_NONE,
"Source (gate side) sidewall junction capacitance grading coefficient");
832 NULL,
U_NONE,
CAT_NONE,
"Source bottom junction capacitance per unit area");
836 NULL,
U_NONE,
CAT_NONE,
"Source sidewall junction capacitance per unit periphery");
840 NULL,
U_NONE,
CAT_NONE,
"Source (gate side) sidewall junction capacitance per unit width");
844 NULL,
U_NONE,
CAT_NONE,
"Bottom drain junction reverse saturation current density");
848 NULL,
U_NONE,
CAT_NONE,
"Isolation edge sidewall drain junction reverse saturation current density");
852 NULL,
U_NONE,
CAT_NONE,
"Gate edge drain junction reverse saturation current density");
864 NULL,
U_NONE,
CAT_NONE,
"Drainjunction current temperature exponent");
868 NULL,
U_NONE,
CAT_NONE,
"Drain bottom junction capacitance grading coefficient");
872 NULL,
U_NONE,
CAT_NONE,
"Drain sidewall junction capacitance built in potential");
876 NULL,
U_NONE,
CAT_NONE,
"Drain sidewall junction capacitance grading coefficient");
880 NULL,
U_NONE,
CAT_NONE,
"Drain (gate side) sidewall junction capacitance built in potential");
884 NULL,
U_NONE,
CAT_NONE,
"Drain (gate side) sidewall junction capacitance grading coefficient");
888 NULL,
U_NONE,
CAT_NONE,
"Drain bottom junction capacitance per unit area");
892 NULL,
U_NONE,
CAT_NONE,
"Drain sidewall junction capacitance per unit periphery");
896 NULL,
U_NONE,
CAT_NONE,
"Drain (gate side) sidewall junction capacitance per unit width");
900 NULL,
U_VOLT,
CAT_CAP,
"Flat Band Voltage parameter for capmod=0 only");
932 NULL,
U_MVM1,
CAT_CAP,
"Exponential coefficient for finite charge thickness");
936 NULL,
U_NONE,
CAT_CAP,
"Coefficient for gate-bias dependent surface potential");
958 NULL,
U_NONE,
CAT_NONE,
"Distance of Mid-Diffusion to Gate edge");
962 NULL,
U_NONE,
CAT_NONE,
"Distance of Mid-Contact to Gate edge in Test structures");
966 NULL,
U_NONE,
CAT_NONE,
"Distance from gate contact center to device edge");
982 NULL,
U_NONE,
CAT_NONE,
"First fitting parameter the bias-dependent Rg");
986 NULL,
U_NONE,
CAT_NONE,
"Second fitting parameter the bias-dependent Rg");
1172 NULL,
U_NONE,
CAT_NONE,
"W offset for channel width due to mask/etch effect");
1176 NULL,
U_NONE,
CAT_NONE,
"L offset for channel length due to mask/etch effect");
1343 NULL,
U_NONE,
CAT_NONE,
"Forward drain diode forward limiting current");
1347 NULL,
U_NONE,
CAT_NONE,
"Forward source diode forward limiting current");
1351 NULL,
U_NONE,
CAT_NONE,
"Reverse drain diode forward limiting current");
1355 NULL,
U_NONE,
CAT_NONE,
"Reverse source diode forward limiting current");
1359 NULL,
U_NONE,
CAT_NONE,
"Fitting parameter for drain diode breakdown current");
1363 NULL,
U_NONE,
CAT_NONE,
"Fitting parameter for source diode breakdown current");
1376 NULL,
U_NONE,
CAT_NONE,
"Source bottom trap-assisted saturation current density");
1380 NULL,
U_NONE,
CAT_NONE,
"Drain bottom trap-assisted saturation current density");
1384 NULL,
U_NONE,
CAT_NONE,
"Source STI sidewall trap-assisted saturation current density");
1388 NULL,
U_NONE,
CAT_NONE,
"Drain STI sidewall trap-assisted saturation current density");
1392 NULL,
U_NONE,
CAT_NONE,
"Source gate-edge sidewall trap-assisted saturation current density");
1396 NULL,
U_NONE,
CAT_NONE,
"Drain gate-edge sidewall trap-assisted saturation current density");
1400 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for bottom junction");
1404 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for STI sidewall junction");
1408 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for gate-edge sidewall junction");
1413 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for bottom junction drain side");
1417 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for STI sidewall junction drain side");
1421 NULL,
U_NONE,
CAT_NONE,
"Non-ideality factor for gate-edge sidewall junction drain side");
1426 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSS on temperature");
1430 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSD on temperature");
1434 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSSWS on temperature");
1438 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSSWD on temperature");
1442 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSSWGS on temperature");
1446 NULL,
U_NONE,
CAT_NONE,
"Power dependence of JTSSWGD on temperature");
1475 NULL,
U_NONE,
CAT_NONE,
"Source bottom trap-assisted voltage dependent parameter");
1479 NULL,
U_NONE,
CAT_NONE,
"Drain bottom trap-assisted voltage dependent parameter");
1483 NULL,
U_NONE,
CAT_NONE,
"Source STI sidewall trap-assisted voltage dependent parameter");
1487 NULL,
U_NONE,
CAT_NONE,
"Drain STI sidewall trap-assisted voltage dependent parameter");
1491 NULL,
U_NONE,
CAT_NONE,
"Source gate-edge sidewall trap-assisted voltage dependent parameter");
1495 NULL,
U_NONE,
CAT_NONE,
"Drain gate-edge sidewall trap-assisted voltage dependent parameter");
1504 NULL,
U_OHM,
CAT_NONE,
"Resistance between bNode and dbNode");
1508 NULL,
U_OHM,
CAT_NONE,
"Resistance between bNodePrime and bNode");
1512 NULL,
U_OHM,
CAT_NONE,
"Resistance between bNode and sbNode");
1516 NULL,
U_OHM,
CAT_NONE,
"Resistance between bNodePrime and sbNode");
1520 NULL,
U_OHM,
CAT_NONE,
"Resistance between bNodePrime and bNode");
3333 NULL,
U_NONE,
CAT_NONE,
"Reference distance between OD edge to poly of one side");
3337 NULL,
U_NONE,
CAT_NONE,
"Reference distance between OD edge to poly of the other side");
3345 NULL,
U_NONE,
CAT_NONE,
"Mobility degradation/enhancement coefficient for LOD");
3349 NULL,
U_NONE,
CAT_NONE,
"Saturation velocity degradation/enhancement parameter for LOD");
3353 NULL,
U_NONE,
CAT_NONE,
"Threshold degradation/enhancement parameter for LOD");
3401 NULL,
U_NONE,
CAT_NONE,
"K2 shift factor related to stress effect on vth");
3405 NULL,
U_NONE,
CAT_NONE,
"K2 shift modification factor for stress effect");
3409 NULL,
U_NONE,
CAT_NONE,
"eta0 shift factor related to stress effect on vth");
3413 NULL,
U_NONE,
CAT_NONE,
"eta0 shift modification factor for stress effect");
3426 NULL,
U_NONE,
CAT_NONE,
"Threshold shift factor for well proximity effect");
3430 NULL,
U_NONE,
CAT_NONE,
" K2 shift factor for well proximity effect ");
3434 NULL,
U_NONE,
CAT_NONE,
" Mobility degradation factor for well proximity effect ");
3438 NULL,
U_NONE,
CAT_NONE,
" Reference distance to calculate SCA, SCB and SCC");
3528 NULL,
U_NONE,
CAT_NONE,
" Flag for WPE model (WPEMOD=1 to activate this model) ");
3585 U_NONE,
CAT_CONTROL,
"parameter for nonm-silicon substrate or metal gate selector");
3628 if (!
given(
"RBODYMOD"))
3635 UserWarning(*
this) <<
"rbodyMod has been set to its global value: ";
3638 if (!
given(
"RGATEMOD"))
3645 UserWarning(*
this) <<
"rgateMod has been set to its global value: ";
3648 if (!
given(
"GEOMOD"))
3652 if (!
given(
"RGEOMOD"))
3656 if (!
given(
"TRNQSMOD"))
3663 UserWarning(*
this) <<
"trnqsMod has been set to its global value: ";
3666 if (!
given(
"ACNQSMOD"))
3673 UserWarning(*
this) <<
"acnqsMod has been set to its global value: ";
3683 bool noiseAnalGiven=
false;
3710 if ( createNode != 0 )
3744 if ( createNode != 0 )
3806 Xyce::dout() <<
"Jacobian stamp:" << std::endl;
3807 for(
int rw=0; rw <
jacStamp.size() ; ++rw )
3809 Xyce::dout() <<
"jacStamp[ " << rw <<
"] = { " ;
3810 for(
int cl=0; cl <
jacStamp[rw].size(); ++cl )
3813 if( cl != (
jacStamp[rw].size()-1) )
3815 Xyce::dout() <<
", ";
3818 Xyce::dout() <<
"}" << std::endl;
3820 Xyce::dout() << std::endl;
3822 Xyce::dout() <<
"And as viewed through the maps" << std::endl;
3823 for(
int rw=0; rw <
jacMap.size() ; ++rw )
3825 Xyce::dout() <<
"jacStamp[ " << rw <<
"] mapped to jacStamp[ " <<
jacMap[rw] <<
"] = { " ;
3826 for(
int cl=0; cl <
jacMap2[rw].size(); ++cl )
3829 if( cl != (jacMap2[rw].size()-1) )
3831 Xyce::dout() <<
", ";
3834 Xyce::dout() <<
"}" << std::endl;
3836 Xyce::dout() << std::endl;
3853 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
3887 l (getDeviceOptions().defl),
3888 w (getDeviceOptions().defw),
3889 drainArea (getDeviceOptions().defad),
3890 sourceArea (getDeviceOptions().defas),
3891 numberParallel (1.0),
3893 drainPerimeter(0.0),
3894 sourcePerimeter(0.0),
3895 sourceConductance(0.0),
3896 drainConductance(0.0),
4041 SjctTempRevSatCur(0.0),
4042 DjctTempRevSatCur(0.0),
4043 SswTempRevSatCur(0.0),
4044 DswTempRevSatCur(0.0),
4045 SswgTempRevSatCur(0.0),
4046 DswgTempRevSatCur(0.0),
4055 sourcePerimeterGiven(false),
4056 drainPerimeterGiven(false),
4057 sourceAreaGiven(false),
4058 drainAreaGiven(false),
4059 sourceSquaresGiven(false),
4060 drainSquaresGiven(false),
4061 drainMOSFET_B4Exists(false),
4062 sourceMOSFET_B4Exists(false),
4063 ChargeComputationNeeded (true),
4064 temp (getDeviceOptions().temp.getImmutableValue<double>()),
4305 Vgegp(0.0), Vgegp_orig(0.0),
4306 Vgegm(0.0), Vgegm_orig(0.0),
4307 Vgmgp(0.0), Vgmgp_orig(0.0),
4340 li_state_qgmid (-1),
4343 li_state_qcheq (-1),
4344 li_state_qcdump (-1),
4354 li_SourcePrime (-1),
4450 f_DdPtr (0), q_DdPtr (0),
4451 f_DdpPtr (0), q_DdpPtr (0),
4452 f_DspPtr (0), q_DspPtr (0),
4453 f_DgpPtr (0), q_DgpPtr (0),
4454 f_DbpPtr (0), q_DbpPtr (0),
4456 f_GEgePtr (0), q_GEgePtr (0),
4457 f_GEdpPtr (0), q_GEdpPtr (0),
4458 f_GEspPtr (0), q_GEspPtr (0),
4459 f_GEgpPtr (0), q_GEgpPtr (0),
4460 f_GEgmPtr (0), q_GEgmPtr (0),
4461 f_GEbpPtr (0), q_GEbpPtr (0),
4463 f_SsPtr (0), q_SsPtr (0),
4464 f_SdpPtr (0), q_SdpPtr (0),
4465 f_SspPtr (0), q_SspPtr (0),
4466 f_SgpPtr (0), q_SgpPtr (0),
4467 f_SbpPtr (0), q_SbpPtr (0),
4469 f_BbPtr (0), q_BbPtr (0),
4470 f_BbpPtr (0), q_BbpPtr (0),
4471 f_BsbPtr (0), q_BsbPtr (0),
4472 f_BdbPtr (0), q_BdbPtr (0),
4474 f_DPdPtr (0), q_DPdPtr (0),
4475 f_DPdpPtr (0), q_DPdpPtr (0),
4476 f_DPspPtr (0), q_DPspPtr (0),
4477 f_DPgpPtr (0), q_DPgpPtr (0),
4478 f_DPgmPtr (0), q_DPgmPtr (0),
4479 f_DPbpPtr (0), q_DPbpPtr (0),
4480 f_DPdbPtr (0), q_DPdbPtr (0),
4483 f_DPqPtr (0), q_DPqPtr (0),
4486 f_SPsPtr (0), q_SPsPtr (0),
4487 f_SPdpPtr (0), q_SPdpPtr (0),
4488 f_SPspPtr (0), q_SPspPtr (0),
4489 f_SPgpPtr (0), q_SPgpPtr (0),
4490 f_SPgmPtr (0), q_SPgmPtr (0),
4491 f_SPbpPtr (0), q_SPbpPtr (0),
4492 f_SPsbPtr (0), q_SPsbPtr (0),
4494 f_SPqPtr (0), q_SPqPtr (0),
4496 f_GPgePtr(0), q_GPgePtr(0),
4497 f_GPdpPtr(0), q_GPdpPtr(0),
4498 f_GPspPtr(0), q_GPspPtr(0),
4499 f_GPgpPtr(0), q_GPgpPtr(0),
4500 f_GPgmPtr(0), q_GPgmPtr(0),
4501 f_GPbpPtr(0), q_GPbpPtr(0),
4503 f_GPqPtr(0), q_GPqPtr(0),
4505 f_GMgePtr(0), q_GMgePtr(0),
4506 f_GMdpPtr(0), q_GMdpPtr(0),
4507 f_GMspPtr(0), q_GMspPtr(0),
4508 f_GMgpPtr(0), q_GMgpPtr(0),
4509 f_GMgmPtr(0), q_GMgmPtr(0),
4510 f_GMbpPtr(0), q_GMbpPtr(0),
4512 f_BPbPtr (0), q_BPbPtr (0),
4513 f_BPdpPtr(0), q_BPdpPtr(0),
4514 f_BPspPtr(0), q_BPspPtr(0),
4515 f_BPgpPtr(0), q_BPgpPtr(0),
4516 f_BPgmPtr(0), q_BPgmPtr(0),
4517 f_BPbpPtr(0), q_BPbpPtr(0),
4518 f_BPsbPtr(0), q_BPsbPtr(0),
4519 f_BPdbPtr(0), q_BPdbPtr(0),
4521 f_SBbPtr (0), q_SBbPtr (0),
4522 f_SBspPtr(0), q_SBspPtr(0),
4523 f_SBbpPtr(0), q_SBbpPtr(0),
4524 f_SBsbPtr(0), q_SBsbPtr(0),
4526 f_DBbPtr (0), q_DBbPtr (0),
4527 f_DBdpPtr(0), q_DBdpPtr(0),
4528 f_DBbpPtr(0), q_DBbpPtr(0),
4529 f_DBdbPtr(0), q_DBdbPtr(0),
4531 f_QdpPtr(0), q_QdpPtr(0),
4532 f_QspPtr(0), q_QspPtr(0),
4533 f_QgpPtr(0), q_QgpPtr(0),
4534 f_QbpPtr(0), q_QbpPtr(0),
4535 f_QqPtr (0), q_QqPtr (0),
4548 blockHomotopyID (0),
4549 randomPerturb (0.0),
4566 updateTemperatureCalled_ (false)
4603 if (!
given(
"NGCON"))
4620 if (
given(
"TRNQSMOD"))
4622 UserWarning(*
this) <<
"nsqMod = 1. Not allowed yet. Setting to 0";
4627 UserWarning(*
this) <<
"Channel length out of range";
4632 UserWarning(*
this) <<
"Channel width out of range";
4735 int newMaxCol=oldSize;
4736 int newSize = oldSize+1;
4743 jacStamp[newMaxCol][4] = newMaxCol;
4759 int icVBSCol=oldSize;
4760 int newSize=oldSize+1;
4772 int newSourceCol=sourceSize;
4775 jacStamp[2][newSourceCol]=icVBSCol;
4779 int newBodyCol=bodySize;
4788 int icVDSCol=oldSize;
4789 int newSize=oldSize+1;
4801 int newSourceCol=sourceSize;
4804 jacStamp[2][newSourceCol]=icVDSCol;
4808 int newDrainCol=drainSize;
4817 int icVGSCol=oldSize;
4818 int newSize=oldSize+1;
4830 int newSourceCol=sourceSize;
4833 jacStamp[2][newSourceCol]=icVGSCol;
4837 int newGateCol=gateSize;
4848 int mapSize =
jacMap.size();
4849 for (
int i=0;i<mapSize;++i)
4853 for (
int j=0;j<
jacStamp[i].size();++j)
4859 #ifdef Xyce_DEBUG_DEVICE
4860 Xyce::dout() <<
"About to remap away optional nodes from the jacStamp!" << std::endl;
4868 std::vector< std::vector<int> > tempStamp;
4869 std::vector<int> tempMap;
4870 std::vector< std::vector<int> > tempMap2;
4872 int OriginalSize =
jacMap.size();
4878 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4880 tempStamp, tempMap, tempMap2,
4888 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4890 tempStamp, tempMap, tempMap2,
4898 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4900 tempStamp, tempMap, tempMap2,
4917 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4919 tempStamp, tempMap, tempMap2,
4930 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4932 tempStamp, tempMap, tempMap2,
4944 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4946 tempStamp, tempMap, tempMap2,
4957 tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4959 tempStamp, tempMap, tempMap2,
4968 #ifdef Xyce_DEBUG_DEVICE
4969 Xyce::dout() <<
"Done remap away optional nodes from the jacStamp!" << std::endl;
4997 const std::vector<int> & extLIDVecRef )
5004 Xyce::dout() << section_divider << std::endl
5005 <<
" In Instance::register LIDs" << std::endl
5006 <<
" name = " <<
getName() << std::endl
5007 <<
" number of internal variables: " << intLIDVecRef.size() << std::endl
5008 <<
" number of external variables: " << extLIDVecRef.size() << std::endl;
5084 UserError(*
this) <<
"Tried to specify an initial condition on V_Bulk_Source when Bulk and Source nodes are the same node";
5093 UserError(*
this) <<
"Tried to specify an initial condition on V_Drain_Source when Drain and Source nodes are the same node";
5102 UserError(*
this) <<
"Tried to specify an initial condition on V_Gate_Source when Gate and Source nodes are the same node";
5108 #ifdef Xyce_DEBUG_DEVICE
5111 Xyce::dout() <<
"\n local variable indices:\n";
5112 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
5113 Xyce::dout() <<
" li_GateExt = " <<
li_GateExt << std::endl;
5114 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
5115 Xyce::dout() <<
" li_Body = " <<
li_Body << std::endl;
5116 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
5117 Xyce::dout() <<
" li_GatePrime = " <<
li_GatePrime << std::endl;
5118 Xyce::dout() <<
" li_GateMid = " <<
li_GateMid << std::endl;
5119 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
5120 Xyce::dout() <<
" li_BodyPrime = " <<
li_BodyPrime << std::endl;
5121 Xyce::dout() <<
" li_DrainBody = " <<
li_DrainBody << std::endl;
5122 Xyce::dout() <<
" li_SourceBody = " <<
li_SourceBody << std::endl;
5123 Xyce::dout() <<
" li_Charge = " <<
li_Charge << std::endl;
5124 Xyce::dout() << section_divider << std::endl;
5206 Xyce::dout() << std::endl
5207 << section_divider << std::endl
5208 <<
" In Instance::registerStateLIDs" << std::endl
5209 <<
" name = " <<
getName() << std::endl
5210 <<
" Number of State LIDs: " << staLIDVecRef.size() << std::endl;
5240 #ifdef Xyce_DEBUG_DEVICE
5243 Xyce::dout() <<
" Local State indices:" << std::endl;
5244 Xyce::dout() << std::endl;
5245 Xyce::dout() <<
" li_state_qb = " <<
li_state_qb << std::endl;
5246 Xyce::dout() <<
" li_state_qg = " <<
li_state_qg << std::endl;
5247 Xyce::dout() <<
" li_state_qd = " <<
li_state_qd << std::endl;
5248 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs << std::endl;
5249 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd << std::endl;
5250 Xyce::dout() <<
" li_state_qcheq = " <<
li_state_qcheq << std::endl;
5251 Xyce::dout() <<
" li_state_qcdump = " <<
li_state_qcdump << std::endl;
5252 Xyce::dout() << std::endl;
5253 Xyce::dout() << section_divider << std::endl;
5316 std::vector<int> & map =
jacMap;
5317 std::vector< std::vector<int> > & map2 =
jacMap2;;
5319 Dd = jacLIDVec[map[0]][map2[0][0]];
5320 Ddp = jacLIDVec[map[0]][map2[0][1]];
5321 Dsp = jacLIDVec[map[0]][map2[0][2]];
5322 Dgp = jacLIDVec[map[0]][map2[0][3]];
5323 Dbp = jacLIDVec[map[0]][map2[0][4]];
5326 Dids = jacLIDVec[map[0]][map2[0][5]];
5329 GEge = jacLIDVec[map[1]][map2[1][0]];
5330 GEdp = jacLIDVec[map[1]][map2[1][1]];
5331 GEsp = jacLIDVec[map[1]][map2[1][2]];
5332 GEgp = jacLIDVec[map[1]][map2[1][3]];
5333 GEgm = jacLIDVec[map[1]][map2[1][4]];
5334 GEbp = jacLIDVec[map[1]][map2[1][5]];
5337 GEigs = jacLIDVec[map[1]][map2[1][6]];
5340 Ss = jacLIDVec[map[2]][map2[2][0]];
5341 Sdp = jacLIDVec[map[2]][map2[2][1]];
5342 Ssp = jacLIDVec[map[2]][map2[2][2]];
5343 Sgp = jacLIDVec[map[2]][map2[2][3]];
5344 Sbp = jacLIDVec[map[2]][map2[2][4]];
5350 Sibs = jacLIDVec[map[2]][map2[2][currentCol++]];
5354 Sids = jacLIDVec[map[2]][map2[2][currentCol++]];
5358 Sigs = jacLIDVec[map[2]][map2[2][currentCol++]];
5361 Bb = jacLIDVec[map[3]][map2[3][0]];
5362 Bbp = jacLIDVec[map[3]][map2[3][1]];
5363 Bsb = jacLIDVec[map[3]][map2[3][2]];
5364 Bdb = jacLIDVec[map[3]][map2[3][3]];
5367 Bibs = jacLIDVec[map[3]][map2[3][4]];
5370 DPd = jacLIDVec[map[4]][map2[4][0]];
5371 DPdp = jacLIDVec[map[4]][map2[4][1]];
5372 DPsp = jacLIDVec[map[4]][map2[4][2]];
5373 DPgp = jacLIDVec[map[4]][map2[4][3]];
5374 DPgm = jacLIDVec[map[4]][map2[4][4]];
5375 DPbp = jacLIDVec[map[4]][map2[4][5]];
5376 DPdb = jacLIDVec[map[4]][map2[4][6]];
5379 DPq = jacLIDVec[map[4]][map2[4][7]];
5382 SPs = jacLIDVec[map[5]][map2[5][0]];
5383 SPdp = jacLIDVec[map[5]][map2[5][1]];
5384 SPsp = jacLIDVec[map[5]][map2[5][2]];
5385 SPgp = jacLIDVec[map[5]][map2[5][3]];
5386 SPgm = jacLIDVec[map[5]][map2[5][4]];
5387 SPbp = jacLIDVec[map[5]][map2[5][5]];
5388 SPsb = jacLIDVec[map[5]][map2[5][6]];
5392 SPq = jacLIDVec[map[5]][map2[5][7]];
5395 GPge = jacLIDVec[map[6]][map2[6][0]];
5396 GPdp = jacLIDVec[map[6]][map2[6][1]];
5397 GPsp = jacLIDVec[map[6]][map2[6][2]];
5398 GPgp = jacLIDVec[map[6]][map2[6][3]];
5399 GPgm = jacLIDVec[map[6]][map2[6][4]];
5400 GPbp = jacLIDVec[map[6]][map2[6][5]];
5404 GPq = jacLIDVec[map[6]][map2[1][6]];
5407 GMge = jacLIDVec[map[7]][map2[7][0]];
5408 GMdp = jacLIDVec[map[7]][map2[7][1]];
5409 GMsp = jacLIDVec[map[7]][map2[7][2]];
5410 GMgp = jacLIDVec[map[7]][map2[7][3]];
5411 GMgm = jacLIDVec[map[7]][map2[7][4]];
5412 GMbp = jacLIDVec[map[7]][map2[7][5]];
5414 BPb = jacLIDVec[map[8]][map2[8][0]];
5415 BPdp = jacLIDVec[map[8]][map2[8][1]];
5416 BPsp = jacLIDVec[map[8]][map2[8][2]];
5417 BPgp = jacLIDVec[map[8]][map2[8][3]];
5418 BPgm = jacLIDVec[map[8]][map2[8][4]];
5419 BPbp = jacLIDVec[map[8]][map2[8][5]];
5420 BPsb = jacLIDVec[map[8]][map2[8][6]];
5421 BPdb = jacLIDVec[map[8]][map2[8][7]];
5423 SBb = jacLIDVec[map[9]][map2[9][0]];
5424 SBsp = jacLIDVec[map[9]][map2[9][1]];
5425 SBbp = jacLIDVec[map[9]][map2[9][2]];
5426 SBsb = jacLIDVec[map[9]][map2[9][3]];
5428 DBb = jacLIDVec[map[10]][map2[10][0]];
5429 DBdp = jacLIDVec[map[10]][map2[10][1]];
5430 DBbp = jacLIDVec[map[10]][map2[10][2]];
5431 DBdb = jacLIDVec[map[10]][map2[10][3]];
5437 Qdp = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5438 Qsp = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5439 Qgp = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5440 Qbp = jacLIDVec[map[currentRow]][map2[currentRow][3]];
5441 Qq = jacLIDVec[map[currentRow]][map2[currentRow][4]];
5447 IBSs = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5448 IBSb = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5449 IBSibs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5455 IDSd = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5456 IDSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5457 IDSids = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5463 IGSg = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5464 IGSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5465 IGSigs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5482 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5644 double tmp(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), Eg(0.0), Eg0(0.0), ni,epssub;
5645 double T0(0.0), T1(0.0);
5646 double T2(0.0), T3(0.0), T4(0.0), T5(0.0), T6(0.0), T7(0.0), T8(0.0), T9(0.0), Lnew(0.0), Wnew(0.0);
5647 double delTemp(0.0), TRatio(0.0), Inv_L(0.0), Inv_W(0.0), Inv_LW(0.0), Vtm0, Tnom(0.0);
5648 double dumPs(0.0), dumPd(0.0), dumAs(0.0), dumAd(0.0), PowWeffWr(0.0);
5649 double Nvtms(0.0), Nvtmd(0.0), SourceSatCurrent(0.0), DrainSatCurrent(0.0);
5651 double Inv_saref(0.0), Inv_sbref(0.0), Inv_sa(0.0), Inv_sb(0.0), rho(0.0), Ldrn(0.0), dvth0_lod(0.0);
5652 double W_tmp(0.0), Inv_ODeff(0.0), OD_offset(0.0), dk2_lod(0.0), deta0_lod(0.0);
5653 double lnl(0.0), lnw(0.0), lnnf(0.0), rbpbx(0.0), rbpby(0.0), rbsbx(0.0), rbsby(0.0), rbdbx(0.0), rbdby(0.0),bodymode(0.0);
5654 double kvsat(0.0), wlod(0.0), sceff(0.0), Wdrn(0.0);
5655 double V0, lt1, ltw, Theta0, Delt_vth, TempRatio, Vth_NarrowW, Lpe_Vb, Vth;
5656 double n,
Vgsteff, Vgs_eff, toxpf, toxpi, Tcen, toxe, epsrox, vddeot;
5660 bool bsuccess =
true;
5662 #ifdef Xyce_DEBUG_DEVICE
5665 Xyce::dout() << std::endl << subsection_divider << std::endl;
5666 Xyce::dout() <<
"Instance::updateTemperature\n";
5667 Xyce::dout() <<
"name = " <<
getName() << std::endl;
5672 if (temp_tmp != -999.0)
temp = temp_tmp;
5691 UserWarning(*
this) <<
"toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored";
5756 Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
5757 ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5758 * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
5766 ni =
model_.
ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5767 * exp((
T0 - Eg0) / (2.0 * Vtm0));
5774 Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
5785 T1 = log(temp / Tnom);
5844 delTemp = temp - Tnom;
5855 UserWarning(*
this) <<
"Temperature effect has caused cjs to be negative. Cjs is clamped to zero";
5861 UserWarning(*
this) <<
"Temperature effect has caused cjd to be negative. Cjd is clamped to zero";
5876 UserWarning(*
this) <<
"Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero";
5881 UserWarning(*
this) <<
"Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero";
5896 UserWarning(*
this) <<
"Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero";
5901 UserWarning(*
this) <<
"Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero";
5910 UserWarning(*
this) <<
"Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01";
5917 UserWarning(*
this) <<
"Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01";
5924 UserWarning(*
this) <<
"Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01";
5931 UserWarning(*
this) <<
"Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01";
5938 UserWarning(*
this) <<
"Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01";
5945 UserWarning(*
this) <<
"Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01";
6018 std::list<SizeDependParam*>::iterator it_dpL =
6020 std::list<SizeDependParam*>::iterator end_dpL =
6025 for( ; it_dpL != end_dpL; ++it_dpL )
6027 if( ((*it_dpL)->Length ==
l)
6028 && ((*it_dpL)->Width ==
w)
6029 && ((*it_dpL)->NFinger ==
nf) )
6083 <<
" Effective channel length <= 0";
6090 <<
" Effective channel width <= 0";
6097 <<
" Effective channel length for C-V <= 0";
6104 <<
" Effective channel width for C-V <= 0";
6111 <<
" Effective channel width for S/D junctions <= 0";
6699 T0 = (TRatio - 1.0);
6703 T1 = T2 = T3 = T4 = 0.0;
6749 UserWarning(*
this) <<
"Rdw at current temperature is negative; set to 0";
6754 UserWarning(*
this) <<
"Rdwmin at current temperature is negative; set to 0";
6761 UserWarning(*
this) <<
"Rsw at current temperature is negative; set to 0";
6766 UserWarning(*
this) <<
"Rswmin at current temperature is negative; set to 0";
6781 UserWarning(*
this) <<
"eu has been negative; reset to 0.0";
6887 UserWarning(*
this) <<
"k1 should be specified with k2";
6892 UserWarning(*
this) <<
"k2 should be specified with k1";
6897 UserWarning(*
this) <<
"nsub is ignored because k1 or k2 is given";
6901 UserWarning(*
this) <<
"xt is ignored because k1 or k2 is given";
6905 UserWarning(*
this) <<
"vbx is ignored because k1 or k2 is given";
6909 UserWarning(*
this) <<
"gamma1 is ignored because k1 or k2 is given";
6913 UserWarning(*
this) <<
"gamma2 is ignored because k1 or k2 is given";
6981 tmp = sqrt(epssub / (epsrox * CONSTEPS0)
7067 UserWarning(*
this) <<
"WLOD =is less than 0. 0.0 is used";
7071 W_tmp = Wnew + wlod;
7084 T0 = (TRatio - 1.0);
7095 if( (
sa > 0.0) && (
sb > 0.0) &&
7096 ((
nf == 1.0) || ((
nf > 1.0) && (
sd > 0.0))) )
7104 UserWarning(*
this) <<
"KVSAT is too small; -1.0 is used";
7109 UserWarning(*
this) <<
"KVSAT is too big; 1.0 is used";
7114 for(i = 0; i <
nf; i++)
7116 T0 = 1.0 / nf / (
sa + 0.5*Ldrn + i * (
sd +Ldrn));
7117 T1 = 1.0 / nf / (
sb + 0.5*Ldrn + i * (
sd +Ldrn));
7121 Inv_ODeff = Inv_sa + Inv_sb;
7160 * exp(-10.0 *
sc * T2)
7162 * exp(-10.0 * T1 * T2) ) / Wdrn;
7164 * exp(-20.0 *
sc * T2)
7166 * exp(-20.0 * T1 * T2) ) / Wdrn;
7170 UserWarning(*
this) <<
"No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive";
7181 UserWarning(*
this) <<
"ku0we = %g is negatively too high. Negative mobility!";
7209 else if (
vbsc < -30.0)
7245 rbsb = rbsbx * rbsby / (rbsbx + rbsby);
7252 rbdb = rbdbx * rbdby / (rbdbx + rbdby);
7255 if ((bodymode == 3)|| (bodymode == 5))
7267 rbpb = rbpbx*rbpby/(rbpbx + rbpby);
7290 if((
rbodyMod == 2) && (bodymode == 3))
7304 if((
rbodyMod == 2) && (bodymode == 1))
7332 UserWarning(*
this) <<
"The gate conductance reset to 1.0e3 mho";
7351 (
Pseff), dumPd, dumAs, dumAd);
7365 dumPs, (
Pdeff), dumAs, dumAd);
7373 dumPs, dumPd, (
Aseff), dumAd);
7380 dumPs, dumPd, dumAs, (
Adeff));
7409 UserWarning(*
this) <<
"Source conductance reset to 1.0e3 mho";
7442 UserWarning(*
this) <<
"Drain conductance reset to 1.0e3 mho";
7455 SourceSatCurrent = 1.0e-14;
7465 if (SourceSatCurrent > 0.0)
7505 UserWarning(*
this) <<
"ijthsrev too small and set to 10 times IsbSat";
7511 IVjsmRev = SourceSatCurrent * (1.0 + T1);
7512 SslpRev = -SourceSatCurrent * T1 / Nvtms;
7522 DrainSatCurrent = 1.0e-14;
7532 if (DrainSatCurrent > 0.0)
7568 UserWarning(*
this) <<
"ijthdrev too small and set to 10 times IdbSat";
7574 IVjdmRev = DrainSatCurrent * (1.0 + T1);
7575 DslpRev = -DrainSatCurrent * T1 / Nvtmd;
7583 T0 = (TRatio - 1.0);
7623 && (vddeot > tmp2) && (
T0!=0))
7628 T4 = sqrt(1.0 + 2.0 * T8 / T1);
7629 T2 = 2.0 * T8 / (T4 + 1.0);
7630 T3 = 0.5 * T2 * T2 / T1;
7631 T7 = 1.12 - T3 - 0.05;
7632 T6 = sqrt(T7 * T7 + 0.224);
7633 T5 = 1.12 - 0.5 * (T7 + T6);
7634 Vgs_eff = vddeot - T5;
7675 - Delt_vth - T2 +
paramPtr->
k3 * Vth_NarrowW + T1;
7687 T0 = 1.0 / (3.0 + 8.0 * tmp3);
7688 n = (1.0 + 3.0 * tmp3) *
T0;
7701 Vgsteff = Vgs_eff-Vth;
7708 tmp2 = 2.0e8 * toxpf;
7714 }
while ((niter<=4)&&(fabs(toxpf-toxpi)>1e-12));
7720 if (checkModel(model, here, ckt))
7721 { IFuid namarray[2];
7722 namarray[0] =
model_.name;
7724 (*(SPfrontEnd->IFerror)) (ERR_FATAL,
"Fatal error(s) detected during .5.0 parameter checking for %s in model %s", namarray);
7746 bool bsuccess =
true;
7749 double dgstot_dvd(0.0), dgstot_dvg(0.0), dgstot_dvs(0.0), dgstot_dvb(0.0);
7750 double dgdtot_dvd(0.0), dgdtot_dvg(0.0), dgdtot_dvs(0.0), dgdtot_dvb(0.0);
7751 double Rs(0.0), Rd(0.0);
7752 double dRs_dvg(0.0), dRd_dvg(0.0), dRs_dvb(0.0), dRd_dvb(0.0);
7753 double dT0_dvg(0.0), dT1_dvb(0.0), dT3_dvg(0.0), dT3_dvb(0.0);
7755 double vgd_old(0.0), vsbd_old(0.0), vsbd(0.0);
7756 double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
7757 double VgstNVt(0.0), ExpVgst(0.0);
7758 double czbd(0.0), czbdsw(0.0), czbdswg(0.0),
7759 czbs(0.0), czbssw(0.0), czbsswg(0.0);
7760 double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
7761 double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
7762 double MJD(0.0), MJSWD(0.0), MJSWGD(0.0);
7763 double MJS(0.0), MJSWS(0.0), MJSWGS(0.0);
7764 double Ggidld(0.0), Ggidlg(0.0), Ggidlb(0.0);
7765 double Voxacc(0.0), dVoxacc_dVg(0.0), dVoxacc_dVb(0.0);
7766 double Voxdepinv(0.0);
7767 double dVoxdepinv_dVg(0.0), dVoxdepinv_dVd(0.0), dVoxdepinv_dVb(0.0);
7768 double VxNVt(0.0), ExpVxNVt(0.0);
7769 double Vaux(0.0), dVaux_dVg(0.0), dVaux_dVd(0.0), dVaux_dVb(0.0);
7770 double Igc(0.0), dIgc_dVg(0.0), dIgc_dVd(0.0), dIgc_dVb(0.0);
7771 double dIgcs_dVg(0.0), dIgcs_dVd(0.0), dIgcs_dVb(0.0);
7772 double dIgcd_dVg(0.0), dIgcd_dVd(0.0), dIgcd_dVb(0.0);
7773 double dIgs_dVg(0.0), dIgs_dVs(0.0), dIgd_dVg(0.0), dIgd_dVd(0.0);
7774 double Igbacc(0.0), dIgbacc_dVg(0.0);
7775 double dIgbacc_dVb(0.0);
7776 double Igbinv(0.0), dIgbinv_dVg(0.0), dIgbinv_dVd(0.0), dIgbinv_dVb(0.0);
7777 double Pigcd(0.0), dPigcd_dVg(0.0), dPigcd_dVd(0.0), dPigcd_dVb(0.0);
7779 double Vgs_eff(0.0), Vfb(0.0);
7780 double Vth_NarrowW(0.0);
7781 double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
7782 double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
7783 double Vgst(0.0), dVgst_dVg(0.0), dVgst_dVb(0.0), dVgs_eff_dVg(0.0);
7784 double Nvtms(0.0), Nvtmd(0.0);
7785 double Vtm(0.0), Vtm0(0.0);
7786 double n(0.0), dn_dVb(0.0), dn_dVd(0.0), voffcv (0.0);
7787 double noff(0.0), dnoff_dVd(0.0), dnoff_dVb(0.0);
7788 double CoxWLcen(0.0), QovCox(0.0), LINK(0.0), V0(0.0);
7789 double DeltaPhi(0.0), dDeltaPhi_dVg(0.0), VgDP(0.0), dVgDP_dVg(0.0);
7790 double Cox(0.0), Tox(0.0);
7791 double Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
7793 double Coxeff(0.0), dCoxeff_dVd(0.0), dCoxeff_dVg(0.0), dCoxeff_dVb(0.0);
7794 double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
7795 double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
7798 double dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
7799 double dVdsat_dVg(0.0), dVdsat_dVb(0.0);
7800 double dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
7801 double dVasat_dVg(0.0), dVasat_dVb(0.0);
7802 double dVasat_dVd(0.0), Va(0.0), dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
7803 double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
7804 double Arg1(0.0), One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
7806 double T0,dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
7807 double T1,dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
7809 double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
7810 double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
7811 double T4(0.0), dT4_dVd(0.0), dT4_dVb(0.0);
7812 double T5(0.0), dT5_dVg(0.0), dT5_dVd(0.0), dT5_dVb(0.0);
7813 double T6(0.0), dT6_dVg(0.0), dT6_dVd(0.0), dT6_dVb(0.0);
7814 double T7(0.0), dT7_dVg(0.0), dT7_dVd(0.0), dT7_dVb(0.0);
7815 double T8(0.0), dT8_dVg(0.0), dT8_dVd(0.0), dT8_dVb(0.0);
7816 double T9(0.0), dT9_dVg(0.0), dT9_dVd(0.0), dT9_dVb(0.0);
7817 double T10(0.0), dT10_dVg(0.0), dT10_dVb(0.0), dT10_dVd(0.0);
7818 double T11(0.0), T12(0.0), T13(0.0), T14(0.0);
7820 double dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
7821 double Cclm(0.0), dCclm_dVg(0.0), dCclm_dVd(0.0), dCclm_dVb(0.0);
7822 double FP(0.0), dFP_dVg(0.0);
7823 double PvagTerm(0.0), dPvagTerm_dVg(0.0);
7824 double dPvagTerm_dVd(0.0), dPvagTerm_dVb(0.0);
7825 double VADITS(0.0), dVADITS_dVg(0.0), dVADITS_dVd(0.0);
7827 double dDITS_Sft_dVb(0.0), dDITS_Sft_dVd(0.0);
7828 double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
7829 double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
7830 double Xdep(0.0), dXdep_dVb(0.0);
7831 double lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
7832 double Delt_vth(0.0), dDelt_vth_dVb(0.0);
7833 double Theta0(0.0), dTheta0_dVb(0.0);
7835 double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
7836 double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
7837 double Lambda(0.0), dLambda_dVg(0.0);
7840 double dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
7841 double dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
7842 double VdseffCV(0.0),
7843 dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
7844 double diffVds(0.0);
7845 double dAbulk_dVg(0.0);
7846 double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
7847 double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
7848 double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
7849 double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
7850 double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
7851 double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
7852 double Ids(0.0), Gmb(0.0);
7853 double devbs_dvb(0.0), devbd_dvb(0.0);
7854 double Isub(0.0), Gbd(0.0), Gbg(0.0), Gbb(0.0), Gds(0.0);
7855 double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
7856 double CoxeffWovL(0.0);
7857 double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
7858 double Vgst2Vtm(0.0), VdsatCV(0.0);
7859 double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
7860 double AbulkCV(0.0), dAbulkCV_dVb(0.0);
7862 double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
7863 double Qac0(0.0), Qsub0(0.0);
7864 double dQac0_dVg(0.0), dQac0_dVb(0.0);
7865 double dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
7866 double Ggislg(0.0), Ggislb(0.0), Ggisls(0.0);
7867 double Nvtmrss(0.0), Nvtmrssws(0.0), Nvtmrsswgs(0.0);
7868 double Nvtmrsd(0.0), Nvtmrsswd(0.0), Nvtmrsswgd(0.0);
7870 double vs(0.0), Fsevl(0.0);
7871 double dvs_dVg(0.0), dvs_dVd(0.0), dvs_dVb(0.0), dFsevl_dVg(0.0);
7872 double dFsevl_dVd(0.0), dFsevl_dVb(0.0);
7873 double vgdx(0.0), vgsx(0.0),epssub(0.0),toxe(0.0),epsrox(0.0);
7874 double von_local(0.0);
7890 #ifdef Xyce_DEBUG_DEVICE
7893 Xyce::dout() << subsection_divider << std::endl;
7894 Xyce::dout() <<
" Instance::updateIntermediateVars\n";
7895 Xyce::dout() <<
" name = " <<
getName();
7897 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
7898 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
7899 Xyce::dout() <<
" " << std::endl;
8057 if ((*flagSolVectorPtr)[
li_Drain] == 0 ||
8060 (*flagSolVectorPtr)[
li_Body] == 0 ||
8168 #ifdef Xyce_DEBUG_DEVICE
8171 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8172 Xyce::dout() <<
" von_local = " << von_local << std::endl;
8173 Xyce::dout() <<
" CONSTvt0 = " <<
CONSTvt0 << std::endl;
8174 Xyce::dout() <<
" vcrit = " <<
model_.
vcrit << std::endl;
8175 Xyce::dout().width(3);
8177 Xyce::dout().width(5);Xyce::dout() <<
getName();
8178 Xyce::dout() <<
" old :";
8179 Xyce::dout()<<
" vgs:";
8181 Xyce::dout()<<
" vds:";
8183 Xyce::dout()<<
" vbs:";
8185 Xyce::dout()<<
" vbd:";
8187 Xyce::dout()<<
" vges:";
8189 Xyce::dout()<<
" vgms:";
8191 Xyce::dout()<<
" vged:";
8193 Xyce::dout()<<
" vgmd:";
8194 Xyce::dout() <<
vgmd_old << std::endl;
8195 Xyce::dout().width(3);
8197 Xyce::dout().width(5);Xyce::dout() <<
getName();
8198 Xyce::dout() <<
" Blim:";
8199 Xyce::dout()<<
" vgs:";
8200 Xyce::dout() <<
vgs;
8201 Xyce::dout()<<
" vds:";
8202 Xyce::dout() <<
vds;
8203 Xyce::dout()<<
" vbs:";
8204 Xyce::dout() <<
vbs;
8205 Xyce::dout()<<
" vbd:";
8206 Xyce::dout() <<
vbd;
8207 Xyce::dout()<<
" vges:";
8208 Xyce::dout() <<
vges;
8209 Xyce::dout()<<
" vgms:";
8210 Xyce::dout() <<
vgms;
8211 Xyce::dout()<<
" vged:";
8212 Xyce::dout() <<
vged;
8213 Xyce::dout()<<
" vgmd:";
8214 Xyce::dout() <<
vgmd << std::endl;
8215 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8287 if ((Check1 != 0) || (Check2 != 0))
8307 if ((Check1 != 0) || (Check2 != 0))
8315 #if 0 // relying on check doesn't work.
8324 double machprec= N_UTL_MachineDependentParams::MachinePrecision();
8337 fabs(
vbs_orig - vbs) > machprec ||
8339 fabs(
vds_orig - vds) > machprec ||
8387 #ifdef Xyce_DEBUG_DEVICE
8392 Xyce::dout().width(3);
8394 Xyce::dout().width(5);Xyce::dout() <<
getName();
8395 Xyce::dout() <<
" Alim:";
8396 Xyce::dout()<<
" vgs:";
8398 Xyce::dout()<<
" vds:";
8399 Xyce::dout() << vds <<
"(diff="<<vds-
vds_orig<<
")";
8400 Xyce::dout()<<
" vbs:";
8401 Xyce::dout() << vbs<<
"(diff="<<vbs-
vbs_orig<<
")";
8402 Xyce::dout()<<
" vbd:";
8404 Xyce::dout()<<
" vges:";
8406 Xyce::dout()<<
" vgms:";
8408 Xyce::dout()<<
" vged:";
8410 Xyce::dout()<<
" vgmd:";
8412 Xyce::dout()<<
" vbs_jct:";
8414 Xyce::dout()<<
" vbd_jct:";
8416 if (
origFlag) Xyce::dout() <<
" SAME";
8417 else Xyce::dout() <<
" DIFF";
8418 Xyce::dout() << std::endl;
8419 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8428 SourceSatCurrent = 1.0e-14;
8438 if (SourceSatCurrent <= 0.0)
8467 cbs = SourceSatCurrent * (evbs - 1.0)
8490 devbs_dvb = evbs / Nvtms;
8509 devbs_dvb = evbs / Nvtms;
8525 cbs = SourceSatCurrent * (evbs +
XExpBVS - 1.0
8543 DrainSatCurrent = 1.0e-14;
8553 if (DrainSatCurrent <= 0.0)
8582 cbd = DrainSatCurrent * (evbd - 1.0)
8605 devbd_dvb = evbd / Nvtmd;
8624 devbd_dvb = evbd / Nvtmd;
8640 cbd = DrainSatCurrent * (evbd +
XExpBVD - 1.0
8665 T0 = -
vbs_jct / Nvtmrss * T9;
8667 dT1_dVb = T10 / Nvtmrss * T9;
8675 dT1_dVb = T10 * dT0_dVb;
8683 dT2_dVb = T10 / Nvtmrsd * T9;
8691 dT2_dVb = T10 * dT0_dVb;
8697 T0 = -
vbs_jct / Nvtmrssws * T9;
8699 dT3_dVb = T10 / Nvtmrssws * T9;
8707 dT3_dVb = T10 * dT0_dVb;
8713 T0 = -
vbd_jct / Nvtmrsswd * T9;
8715 dT4_dVb = T10 / Nvtmrsswd * T9;
8723 dT4_dVb = T10 * dT0_dVb;
8729 T0 = -
vbs_jct / Nvtmrsswgs * T9;
8731 dT5_dVb = T10 / Nvtmrsswgs * T9;
8739 dT5_dVb = T10 * dT0_dVb;
8745 T0 = -
vbd_jct / Nvtmrsswgd * T9;
8747 dT6_dVb = T10 / Nvtmrsswgd * T9;
8755 dT6_dVb = T10 * dT0_dVb;
8809 #ifdef Xyce_DEBUG_DEVICE
8812 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
8814 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " <<
Vds << std::endl;
8815 Xyce::dout() <<
"HOMOTOPY INFO: before vgst = " <<
Vgs << std::endl;
8839 #ifdef Xyce_DEBUG_DEVICE
8842 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " <<
Vds << std::endl;
8843 Xyce::dout() <<
"HOMOTOPY INFO: after vgst = " <<
Vgs << std::endl;
8850 T1 = sqrt(T0 * T0 - 0.004 *
vbsc);
8853 Vbseff =
vbsc + 0.5 * (T0 + T1);
8854 dVbseff_dVb = 0.5 * (1.0 + T0 / T1);
8858 T2 = -0.002 / (T1 -
T0);
8859 Vbseff =
vbsc * (1.0 + T2);
8860 dVbseff_dVb = T2 *
vbsc / T1;
8865 T0 = T9 - Vbseff - 0.001;
8866 T1 = sqrt(T0 * T0 + 0.004 * T9);
8867 Vbseff = T9 - 0.5 * (T0 + T1);
8868 dVbseff_dVb *= 0.5 * (1.0 + T0 / T1);
8872 sqrtPhis = sqrt(Phis);
8873 dsqrtPhis_dVb = -0.5 / sqrtPhis;
8894 T4 = 1.0 / (3.0 + 8.0 *
T0);
8895 T1 = (1.0 + 3.0 *
T0) * T4;
8899 dlt1_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8909 T4 = 1.0 / (3.0 + 8.0 *
T0);
8910 T1 = (1.0 + 3.0 *
T0) * T4;
8914 dltw_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8924 dT1_dVb = -T0 * T1 * dlt1_dVb / lt1;
8925 dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 +
CONSTMIN_EXP)) / T4 / T4;
8944 dT1_dVb = -T0 * T1 * dltw_dVb / ltw;
8945 dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 +
CONSTMIN_EXP)) / T4 / T4;
8968 T9 = 1.0 / (3.0 - 2.0e4 * T3);
8969 T3 = (2.0e-4 - T3) * T9;
8977 DIBL_Sft = dDIBL_Sft_dVd *
Vds;
8984 +
paramPtr->
k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft;
8987 - dDelt_vth_dVb - dT2_dVb +
paramPtr->
k3b * Vth_NarrowW
8990 dVth_dVd = -dDIBL_Sft_dVd;
8994 tmp1 = epssub / Xdep;
9003 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9009 T0 = 1.0 / (3.0 + 8.0 * tmp4);
9010 n = (1.0 + 3.0 * tmp4) * T0;
9012 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9037 T4 = Vtm * log(Leff / T3);
9038 dT4_dVd = -Vtm * dT3_dVd / T3;
9045 dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd;
9046 dDITS_Sft_dVb = T4 * dn_dVb;
9049 dVth_dVd -= dDITS_Sft_dVd;
9050 dVth_dVb -= dDITS_Sft_dVb;
9082 Vgst = Vgs_eff - Vth;
9099 dT10_dVd = T10 * dn_dVd;
9100 dT10_dVb = T10 * dn_dVb;
9106 T3 = Vtm * log(1.0 + ExpVgst);
9109 dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
9110 dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
9111 dT10_dVg *= dVgs_eff_dVg;
9122 dT9_dVd = dn_dVd * T3;
9123 dT9_dVb = dn_dVb * T3;
9130 dT9_dVd = dn_dVd * T3;
9131 dT9_dVb = dn_dVb * T3;
9141 dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
9142 dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
9143 dT9_dVg *= dVgs_eff_dVg;
9148 dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
9149 dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
9150 dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
9161 T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9162 Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9170 Rds = dRds_dVg = dRds_dVb = 0.0;
9180 T3 = T2 + sqrt(T2 * T2 + 0.01);
9181 dT3_dVg = 1.0 + T2 / (T3 - T2);
9182 dT3_dVb = dT3_dVg * dT1_dVb;
9187 dRds_dVg = T4 * dT3_dVg;
9188 dRds_dVb = T4 * dT3_dVb;
9203 dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb;
9206 tmp1 = Leff + 2.0 * T9;
9212 dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
9216 Abulk0 = 1.0 + T1 * T2;
9217 dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
9220 dAbulk_dVg = -T1 * T8;
9222 dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
9226 T9 = 1.0 / (3.0 - 20.0 * Abulk0);
9227 Abulk0 = (0.2 - Abulk0) * T9;
9228 dAbulk0_dVb *= T9 * T9;
9233 T9 = 1.0 / (3.0 - 20.0 *
Abulk);
9244 T0 = 1.0 / (1.0 + T2);
9249 T1 = 1.0 / (0.8 + T2);
9250 T0 = (17.0 + 20.0 * T2) * T1;
9255 dAbulk_dVb = dAbulk_dVb * T0 +
Abulk * dT0_dVb;
9256 dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
9267 { T0 = Vgsteff + Vth + Vth - T14;
9270 T12 = sqrt(Vth * Vth + 0.0001);
9271 T9 = 1.0/(Vgsteff + 2*T12);
9276 T7 = - 2.0 * T6 * T9;
9278 dDenomi_dVg = (T2 + 2.0 *
paramPtr->
ub * T3) / toxe;
9279 T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9280 dDenomi_dVd = T13 * dVth_dVd;
9281 dDenomi_dVb = T13 * dVth_dVb +
paramPtr->
uc * T3;
9285 { T0 = Vgsteff + Vth + Vth - T14;
9289 T12 = sqrt(Vth * Vth + 0.0001);
9290 T9 = 1.0/(Vgsteff + 2*T12);
9295 T7 = - 2.0 * T6 * T9;
9298 T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9299 dDenomi_dVd = T13 * dVth_dVd;
9300 dDenomi_dVb = T13 * dVth_dVb +
paramPtr->
uc * T4;
9304 { T0 = (Vgsteff +
vtfbphi1) / toxe;
9309 T12 = sqrt(Vth * Vth + 0.0001);
9310 T9 = 1.0/(Vgsteff + 2*T12);
9315 T7 = - 2.0 * T6 * T9;
9317 dDenomi_dVg = T2 * dT1_dVg + T7;
9318 T13 = 2.0 * (T11 + T8);
9319 dDenomi_dVd = T13 * dVth_dVd;
9320 dDenomi_dVb = T13 * dVth_dVb + T1 *
paramPtr->
uc;
9329 T9 = 1.0 / (7.0 + 10.0 * T5);
9330 Denomi = (0.6 + T5) * T9;
9338 T9 = -
ueff / Denomi;
9339 dueff_dVg = T9 * dDenomi_dVg;
9340 dueff_dVd = T9 * dDenomi_dVd;
9341 dueff_dVb = T9 * dDenomi_dVb;
9345 WVCoxRds = WVCox * Rds;
9350 dEsatL_dVg = T0 * dueff_dVg;
9351 dEsatL_dVd = T0 * dueff_dVd;
9352 dEsatL_dVb = T0 * dueff_dVb;
9365 T2 = sqrt(T1 * T1 + 0.0004 * T0);
9366 Lambda =
paramPtr->
a2 + T0 - 0.5 * (T1 + T2);
9367 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
9373 Lambda = 0.5 * (T1 + T2);
9374 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
9377 Vgst2Vtm = Vgsteff + 2.0 * Vtm;
9380 tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9381 tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9385 tmp2 = dWeff_dVg / Weff;
9386 tmp3 = dWeff_dVb / Weff;
9388 if ((Rds == 0.0) && (Lambda == 1.0))
9394 T3 =
EsatL * Vgst2Vtm;
9397 dT0_dVg = -(
Abulk * dEsatL_dVg +
EsatL * dAbulk_dVg + 1.0) * T1;
9398 dT0_dVd = -(
Abulk * dEsatL_dVd) * T1;
9399 dT0_dVb = -(
Abulk * dEsatL_dVb + dAbulk_dVb *
EsatL) * T1;
9401 dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg +
EsatL *
T0;
9402 dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9403 dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9407 tmp1 = dLambda_dVg / (Lambda * Lambda);
9408 T9 =
Abulk * WVCoxRds;
9411 T6 = Vgst2Vtm * WVCoxRds;
9412 T0 = 2.0 *
Abulk * (T9 - 1.0 + 1.0 / Lambda);
9413 dT0_dVg = 2.0 * (T8 * tmp2 -
Abulk * tmp1
9414 + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9416 dT0_dVb = 2.0 * (T8 * (2.0 /
Abulk * dAbulk_dVb + tmp3)
9417 + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9419 T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) +
Abulk *
EsatL + 3.0 * T7;
9421 dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9422 +
Abulk * dEsatL_dVg +
EsatL * dAbulk_dVg + 3.0 * (T9
9423 + T7 * tmp2 + T6 * dAbulk_dVg);
9424 dT1_dVb =
Abulk * dEsatL_dVb +
EsatL * dAbulk_dVb
9425 + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9426 dT1_dVd =
Abulk * dEsatL_dVd;
9428 T2 = Vgst2Vtm * (
EsatL + 2.0 * T6);
9429 dT2_dVg =
EsatL + Vgst2Vtm * dEsatL_dVg
9430 + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9431 dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9432 dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9434 T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9435 Vdsat = (T1 - T3) / T0;
9437 dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg))
9439 dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd))
9441 dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb))
9444 dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9445 - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) /
T0;
9446 dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9447 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) /
T0;
9448 dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) /
T0;
9454 dT1_dVg = dVdsat_dVg;
9455 dT1_dVd = dVdsat_dVd - 1.0;
9456 dT1_dVb = dVdsat_dVb;
9462 dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9463 dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9464 dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9468 Vdseff = Vdsat - 0.5 * (T1 + T2);
9469 dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9470 dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9471 dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9475 T4 = T9 / (T2 - T1);
9477 T6 = Vdsat * T4 / (T2 - T1);
9479 dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg);
9480 dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd);
9481 dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb);
9504 T3 = -T2 / T1 * Leff;
9505 dT2_dVd = T3 * dueff_dVd;
9506 dT2_dVg = T3 * dueff_dVg;
9507 dT2_dVb = T3 * dueff_dVb;
9510 dT5_dVg = dEsatL_dVg * T4;
9511 dT5_dVd = dEsatL_dVd * T4;
9512 dT5_dVb = dEsatL_dVb * T4;
9513 T6 = 1.0 + diffVds * T5;
9514 dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5;
9515 dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5;
9516 dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5;
9517 T7 = 2.0 / (T6 * T6 + 1.0);
9520 dT8_dVg = T9 * dT6_dVg;
9521 dT8_dVd = T9 * dT6_dVd;
9522 dT8_dVb = T9 * dT6_dVb;
9523 T10 = 1.0 + T2 * T8;
9524 dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg;
9525 dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd;
9526 dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb;
9529 dT10_dVg = dT10_dVd = dT10_dVb = 0.0;
9533 dEsatL_dVg +=
EsatL * dT10_dVg;
9535 dEsatL_dVd +=
EsatL * dT10_dVd;
9537 dEsatL_dVb +=
EsatL * dT10_dVb;
9543 tmp4 = 1.0 - 0.5 *
Abulk * Vdsat / Vgst2Vtm;
9546 T0 =
EsatL + Vdsat + 2.0 * T9 * tmp4;
9548 T7 = 2.0 * WVCoxRds * tmp4;
9549 dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 *
Vgsteff)
9550 - T8 * (
Abulk * dVdsat_dVg -
Abulk * Vdsat / Vgst2Vtm
9551 + Vdsat * dAbulk_dVg);
9553 dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
9554 - T8 * (dAbulk_dVb * Vdsat +
Abulk * dVdsat_dVb);
9555 dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 *
Abulk * dVdsat_dVd;
9557 T9 = WVCoxRds *
Abulk;
9558 T1 = 2.0 / Lambda - 1.0 + T9;
9559 dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
9560 dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9563 dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9564 dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9565 dVasat_dVd = dT0_dVd / T1;
9570 dT0_dVg = 1.0 / tmp2;
9571 T0 = (Vgsteff + tmp1) * dT0_dVg;
9577 dTcen_dVg = -Tcen * T2 * dT0_dVg / T1;
9580 dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub;
9582 CoxeffWovL = Coxeff * Weff / Leff;
9583 beta =
ueff * CoxeffWovL;
9585 dbeta_dVg = CoxeffWovL * dueff_dVg + T3
9586 * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg);
9587 dbeta_dVd = CoxeffWovL * dueff_dVd;
9588 dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb;
9592 dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
9593 - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
9594 dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
9595 dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb *
Vdseff) / Vgst2Vtm;
9597 fgche1 = Vgsteff *
T0;
9598 dfgche1_dVg = Vgsteff * dT0_dVg +
T0;
9599 dfgche1_dVd = Vgsteff * dT0_dVd;
9600 dfgche1_dVb = Vgsteff * dT0_dVb;
9602 T9 = Vdseff /
EsatL;
9604 dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) /
EsatL;
9605 dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) /
EsatL;
9606 dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) /
EsatL;
9608 gche = beta * fgche1 / fgche2;
9609 dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
9610 - gche * dfgche2_dVg) / fgche2;
9611 dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
9612 - gche * dfgche2_dVd) / fgche2;
9613 dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
9614 - gche * dfgche2_dVb) / fgche2;
9616 T0 = 1.0 + gche * Rds;
9618 T1 = (1.0 - Idl * Rds) / T0;
9620 dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg;
9621 dIdl_dVd = T1 * dgche_dVd;
9622 dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb;
9633 FP = 1.0 / (1.0 + T9);
9634 dFP_dVg = FP * FP * T9 / Vgst2Vtm;
9642 PvagTerm = 1.0 + T9;
9643 dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg /
EsatL);
9644 dPvagTerm_dVb = -T9 * dEsatL_dVb /
EsatL;
9645 dPvagTerm_dVd = -T9 * dEsatL_dVd /
EsatL;
9649 T4 = 1.0 / (17.0 + 20.0 * T9);
9650 PvagTerm = (0.8 + T9) * T4;
9652 dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg /
EsatL) * T4;
9654 dPvagTerm_dVb = -T9 * dEsatL_dVb;
9655 dPvagTerm_dVd = -T9 * dEsatL_dVd;
9660 T0 = 1.0 + Rds * Idl;
9661 dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg;
9662 dT0_dVd = Rds * dIdl_dVd;
9663 dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb;
9667 dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat;
9668 dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat;
9669 dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat;
9672 dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm
9673 + dT0_dVg / T0 + dT1_dVg / T1);
9674 dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0
9676 dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0
9678 VACLM = Cclm * diffVds;
9680 dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm;
9681 dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm;
9682 dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm;
9687 dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
9688 dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0;
9696 dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
9697 + Vgst2Vtm * Vdsat * dAbulk_dVg;
9698 dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9699 dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
9702 dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
9703 dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
9704 dT1_dVd = Abulk * dVdsat_dVd;
9708 VADIBL = (Vgst2Vtm - T0 / T1) / T2;
9709 dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
9710 dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
9711 dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
9716 T3 = 1.0 / (1.0 + T7);
9724 T4 = 1.0 / (0.8 + T7);
9725 T3 = (17.0 + 20.0 * T7) * T4;
9727 dVADIBL_dVb = dVADIBL_dVb * T3
9733 dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg;
9734 dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb;
9735 dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd;
9741 dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
9746 dVa_dVg = dVasat_dVg + dVACLM_dVg;
9747 dVa_dVb = dVasat_dVb + dVACLM_dVb;
9748 dVa_dVd = dVasat_dVd + dVACLM_dVd;
9767 dVADITS_dVg = VADITS * dFP_dVg;
9774 dVADITS_dVg = dVADITS_dVd = 0;
9784 T1 = T0 * VASCBE / diffVds;
9785 dVASCBE_dVg = T1 * dVdseff_dVg;
9786 dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
9787 dVASCBE_dVb = T1 * dVdseff_dVb;
9792 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9798 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9802 T9 = diffVds / VADIBL;
9805 dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL;
9806 dIdsa_dVd = T0 * dIdl_dVd + Idl
9807 * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL;
9808 dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL;
9811 T9 = diffVds / VADITS;
9813 dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS;
9814 dIdsa_dVd = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS;
9815 dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS;
9819 T0 = log(Va / Vasat);
9820 dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat;
9821 dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat;
9822 dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat;
9825 dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm;
9826 dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm;
9827 dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm;
9829 dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg;
9830 dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb;
9831 dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd;
9838 Isub = Gbd = Gbb = Gbg = 0.0;
9846 T1 = T2 * diffVds * exp(T0);
9847 T3 = T1 / diffVds * (T0 - 1.0);
9848 dT1_dVg = T3 * dVdseff_dVg;
9849 dT1_dVd = T3 * (dVdseff_dVd - 1.0);
9850 dT1_dVb = T3 * dVdseff_dVb;
9856 dT1_dVg = -T3 * dVdseff_dVg;
9857 dT1_dVd = T3 * (1.0 - dVdseff_dVd);
9858 dT1_dVb = -T3 * dVdseff_dVb;
9862 Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg)
9864 Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd)
9866 Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb)
9869 Gbd += Gbg * dVgsteff_dVd;
9870 Gbb += Gbg * dVgsteff_dVb;
9871 Gbg *= dVgsteff_dVg;
9880 T9 = diffVds / VASCBE;
9884 Gm = T0 * dIdsa_dVg - Idsa
9885 * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
9886 Gds = T0 * dIdsa_dVd + Idsa
9887 * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE;
9888 Gmb = T0 * dIdsa_dVb - Idsa
9889 * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE;
9892 tmp1 = Gds +
Gm * dVgsteff_dVd;
9893 tmp2 = Gmb +
Gm * dVgsteff_dVb;
9896 Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg;
9897 Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd)
9899 Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb)
9900 + Vdseff * tmp2) * dVbseff_dVb;
9907 T12 = 1.0 / Leff / CoxeffWovL;
9911 dvs_dVg =
Gm * T11 +
cdrain * T10 * dVgsteff_dVg;
9912 dvs_dVd = Gds * T11 +
cdrain * T10 * dVgsteff_dVd;
9913 dvs_dVb = Gmb * T11 +
cdrain * T10 * dVgsteff_dVb;
9919 T2 = 1.0 + exp(T0 * log(T1));
9920 T3 = (T2 - 1.0) * T0 / vs;
9921 Fsevl = 1.0 / exp(log(T2)/ T0);
9922 dT2_dVg = T3 * dvs_dVg;
9923 dT2_dVd = T3 * dvs_dVd;
9924 dT2_dVb = T3 * dvs_dVb;
9925 T4 = -1.0 / T0 * Fsevl / T2;
9926 dFsevl_dVg = T4 * dT2_dVg;
9927 dFsevl_dVd = T4 * dT2_dVd;
9928 dFsevl_dVb = T4 * dT2_dVb;
9940 Gmb +=
cdrain * dFsevl_dVb;
9942 Gds +=
cdrain * dFsevl_dVd;
9958 dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
9959 dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
9960 dT0_dVg = dbeta_dVg * T9;
9980 T11 = grgeltd +
gcrg;
9981 gcrg = grgeltd * gcrg / T11;
9982 T12 = T10 / T11 / T11;
9994 T1 = sqrt(T0 * T0 + 1.0e-4);
10003 T2 = 1.0 / T0 + T1;
10004 T3 = T2 + sqrt(T2 * T2 + 0.01);
10005 dT3_dvg = T3 / (T3 - T2);
10006 dT3_dvb = dT3_dvg * dT1_dvb;
10007 dT3_dvg *= dT0_dvg;
10011 dRs_dvg = T4 * dT3_dvg;
10012 dRs_dvb = T4 * dT3_dvb;
10018 dgstot_dvg = T0 * dRs_dvg;
10019 dgstot_dvb = T0 * dRs_dvb;
10020 dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd);
10024 T1 = sqrt(T0 * T0 + 1.0e-4);
10033 T2 = 1.0 / T0 + T1;
10034 T3 = T2 + sqrt(T2 * T2 + 0.01);
10035 dT3_dvg = T3 / (T3 - T2);
10036 dT3_dvb = dT3_dvg * dT1_dvb;
10037 dT3_dvg *= dT0_dvg;
10041 dRd_dvg = T4 * dT3_dvg;
10042 dRd_dvb = T4 * dT3_dvb;
10048 dgdtot_dvg = T0 * dRd_dvg;
10049 dgdtot_dvb = T0 * dRd_dvb;
10050 dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs);
10058 gdtotd = T2 * dgdtot_dvd;
10059 gdtotg = T2 * dgdtot_dvg;
10060 gdtots = T2 * dgdtot_dvs;
10061 gdtotb = T2 * dgdtot_dvb;
10091 Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
10095 dT1_dVd = 1.0 /
T0;
10101 T3 =
Igidl * (1.0 + T2) / T1;
10102 Ggidld = T3 * dT1_dVd;
10103 Ggidlg = T3 * dT1_dVg;
10108 Ggidld =
Igidl * dT1_dVd;
10109 Ggidlg =
Igidl * dT1_dVg;
10118 Ggidld = Ggidld * T7 +
Igidl * T8;
10119 Ggidlg = Ggidlg * T7;
10120 Ggidlb = -
Igidl * T8;
10144 Igisl = Ggisls = Ggislg = Ggislb = 0.0;
10148 dT1_dVd = 1.0 /
T0;
10154 T3 =
Igisl * (1.0 + T2) / T1;
10155 Ggisls = T3 * dT1_dVd;
10156 Ggislg = T3 * dT1_dVg;
10161 Ggisls =
Igisl * dT1_dVd;
10162 Ggislg =
Igisl * dT1_dVg;
10171 Ggisls = Ggisls * T7 +
Igisl * T8;
10172 Ggislg = Ggislg * T7;
10173 Ggislb = -
Igisl * T8;
10188 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
10190 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
10191 T1 = 0.5 * (1.0 + V3 /
T0);
10192 Vfbeff = Vfb - 0.5 * (V3 +
T0);
10193 dVfbeff_dVg = T1 * dVgs_eff_dVg;
10196 Voxacc = Vfb - Vfbeff;
10197 dVoxacc_dVg = -dVfbeff_dVg;
10198 dVoxacc_dVb = -dVfbeff_dVb;
10201 Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10205 T3 = Vgs_eff - Vfbeff - Vbseff -
Vgsteff;
10208 Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb = 0.0;
10213 dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + dVgsteff_dVg;
10214 dVoxdepinv_dVd = dVgsteff_dVd;
10215 dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb;
10219 T1 = sqrt(T0 * T0 + T3);
10222 dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
10223 dVoxdepinv_dVd = -T2 * dVgsteff_dVd;
10224 dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb);
10228 dVoxdepinv_dVg += dVgsteff_dVg;
10229 dVoxdepinv_dVd += dVgsteff_dVd;
10230 dVoxdepinv_dVb += dVgsteff_dVb;
10251 dVaux_dVg = dVgs_eff_dVg;
10258 VxNVt = (Vgs_eff -
von) / T0;
10261 Vaux = Vgs_eff -
von;
10262 dVaux_dVg = dVgs_eff_dVg;
10263 dVaux_dVd = -dVth_dVd;
10264 dVaux_dVb = -dVth_dVb;
10271 dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10275 ExpVxNVt = exp(VxNVt);
10276 Vaux = T0 * log(1.0 + ExpVxNVt);
10277 dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10285 dVaux_dVd = -dVgs_eff_dVg * dVth_dVd;
10286 dVaux_dVb = -dVgs_eff_dVg * dVth_dVb;
10288 dVaux_dVg *= dVgs_eff_dVg;
10291 T2 = Vgs_eff * Vaux;
10292 dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10293 dT2_dVd = Vgs_eff * dVaux_dVd;
10294 dT2_dVb = Vgs_eff * dVaux_dVb;
10302 - T4 * Voxdepinv * Voxdepinv);
10307 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10312 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10317 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10318 dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10319 dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10320 dT6_dVg *= dVoxdepinv_dVg;
10323 Igc = T11 * T2 * T6;
10324 dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10325 dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10326 dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10331 dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
10336 T12 = Vgsteff + 1.0e-20;
10337 T13 = T11 / T12 / T12;
10339 Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
10340 dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
10341 - 3.0 * Vdseff / T12));
10342 dPigcd_dVd = 0.5 * T14 * dVdseff_dVd;
10343 dPigcd_dVb = 0.5 * T14 * dVdseff_dVb;
10347 dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg;
10348 dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd;
10349 dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb;
10350 dT7_dVg *= dVgsteff_dVg;
10351 dT7_dVb *= dVbseff_dVb;
10352 T8 = T7 * T7 + 2.0e-4;
10353 dT8_dVg = 2.0 * T7;
10354 dT8_dVd = dT8_dVg * dT7_dVd;
10355 dT8_dVb = dT8_dVg * dT7_dVb;
10356 dT8_dVg *= dT7_dVg;
10361 dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10366 dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10371 dT9_dVg = T9 * dT7_dVg;
10372 dT9_dVd = T9 * dT7_dVd;
10373 dT9_dVb = T9 * dT7_dVb;
10377 T1 = T9 - 1.0 + 1.0e-4;
10378 T10 = (T1 - T7) / T8;
10379 dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
10380 dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
10381 dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
10384 dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10385 dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10386 dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10388 T1 = T9 - 1.0 - 1.0e-4;
10389 T10 = (T7 * T9 - T1) / T8;
10390 dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
10391 - T10 * dT8_dVg) / T8;
10392 dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
10393 - T10 * dT8_dVd) / T8;
10394 dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
10395 - T10 * dT8_dVb) / T8;
10397 dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10398 dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10399 dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10404 gIgcsb = dIgcs_dVb * dVbseff_dVb;
10408 gIgcdb = dIgcd_dVb * dVbseff_dVb;
10411 vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10436 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 *
vgs_eff)
10439 Igs = T11 * T2 * T6;
10440 dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10441 dIgs_dVs = -dIgs_dVg;
10444 vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10470 Igd = T11 * T2 * T6;
10471 dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10472 dIgd_dVd = -dIgd_dVg;
10493 T1 = -Vgs_eff + Vbseff + Vfb;
10498 dVaux_dVg = -dVgs_eff_dVg;
10504 dVaux_dVg = dVaux_dVb = 0.0;
10508 ExpVxNVt = exp(VxNVt);
10509 Vaux = T0 * log(1.0 + ExpVxNVt);
10510 dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt);
10511 dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg;
10514 T2 = (Vgs_eff - Vbseff) * Vaux;
10515 dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10516 dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10520 T12 = -7.45669e11 * toxe;
10525 - T4 * Voxacc * Voxacc);
10530 dT6_dVg = dT6_dVb = 0.0;
10535 dT6_dVg = dT6_dVb = 0.0;
10540 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc);
10541 dT6_dVb = dT6_dVg * dVoxacc_dVb;
10542 dT6_dVg *= dVoxacc_dVg;
10545 Igbacc = T11 * T2 * T6;
10546 dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10547 dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10556 dVaux_dVg = dVoxdepinv_dVg;
10557 dVaux_dVd = dVoxdepinv_dVd;
10558 dVaux_dVb = dVoxdepinv_dVb;
10563 dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10567 ExpVxNVt = exp(VxNVt);
10568 Vaux = T0 * log(1.0 + ExpVxNVt);
10569 dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10570 dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd;
10571 dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb;
10572 dVaux_dVg *= dVoxdepinv_dVg;
10575 T2 = (Vgs_eff - Vbseff) * Vaux;
10576 dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10577 dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd;
10578 dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10586 - T4 * Voxdepinv * Voxdepinv);
10591 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10596 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10601 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10602 dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10603 dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10604 dT6_dVg *= dVoxdepinv_dVg;
10607 Igbinv = T11 * T2 * T6;
10608 dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10609 dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10610 dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10612 Igb = Igbinv + Igbacc;
10613 gIgbg = dIgbinv_dVg + dIgbacc_dVg;
10614 gIgbd = dIgbinv_dVd;
10615 gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb;
10677 Vdsat = Vgsteff /
Abulk;
10679 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * Vdsat);
10682 Vdseff = Vdsat - 0.5 * (T0 + T1);
10688 T5 = Vdsat * T3 / (T1 -
T0);
10689 Vdseff = Vdsat * T4;
10697 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
10702 * (Vgsteff - 0.5 * T0 + Abulk * T3);
10728 dVbseff_dVb = -dPhis_dVb;
10733 Vgst = Vgs_eff - Vth;
10735 dVgst_dVb = -dVth_dVb;
10736 dVgst_dVg = dVgs_eff_dVg;
10739 Arg1 = Vgs_eff - Vbseff - Vfb;
10749 cgsb =
CoxWL * (dVbseff_dVb - dVgs_eff_dVg);
10759 else if (Vgst <= 0.0)
10762 T2 = sqrt(T1 * T1 + Arg1);
10767 T0 =
CoxWL * T1 / T2;
10768 cggb = T0 * dVgs_eff_dVg;
10770 cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg);
10782 One_Third_CoxWL =
CoxWL / 3.0;
10783 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
10787 Vdsat = Vgst / AbulkCV;
10788 dVdsat_dVg = dVgs_eff_dVg / AbulkCV;
10789 dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
10799 T2 = -Two_Third_CoxWL * Vgst;
10803 cggb = One_Third_CoxWL * (3.0
10804 - dVdsat_dVg) * dVgs_eff_dVg;
10805 T2 = -One_Third_CoxWL * dVdsat_dVb;
10814 - Two_Third_CoxWL * dVgs_eff_dVg);
10815 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10821 Alphaz = Vgst / Vdsat;
10822 T1 = 2.0 * Vdsat -
Vds;
10823 T2 = Vds / (3.0 * T1);
10827 T7 = 2.0 * Vds - T1 - 3.0 * T3;
10828 T8 = T3 - T1 - 2.0 *
Vds;
10838 T11 = -
CoxWL * T5 * dVdsat_dVb;
10842 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10843 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10846 T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
10847 cdgb = (T7 * dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg;
10848 T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
10849 cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
10852 T9 = 2.0 * T4 * (1.0 + T5);
10853 T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg)
10855 T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
10856 T12 = T4 * (2.0 * T2 + T5 - 1.0);
10857 T0 = -(T10 + T11 + T12);
10861 cbsb = -(cgsb + cdsb +
T0);
10870 T2 = -Two_Third_CoxWL * Vgst;
10874 cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg;
10875 T2 = -One_Third_CoxWL * dVdsat_dVb;
10879 T3 = 0.4 * Two_Third_CoxWL;
10880 cdgb = -T3 * dVgs_eff_dVg;
10882 T4 = T3 * dVth_dVb;
cdsb = -(T4 +
cdgb);
10884 cbgb = -(
cggb - Two_Third_CoxWL * dVgs_eff_dVg);
10885 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10891 Alphaz = Vgst / Vdsat;
10892 T1 = 2.0 * Vdsat -
Vds;
10893 T2 = Vds / (3.0 * T1);
10898 - 0.5 * (Vds - T3));
10903 tmp = -
CoxWL * T5 * dVdsat_dVb;
10909 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10910 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10912 T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds
10915 T7 = Vds - T1 - T8 * T6;
10919 tmp1 = T4 * (2.0 - 4.0 * tmp * T6
10920 + T8 * (16.0 * Vdsat - 6.0 *
Vds));
10922 cdgb = (T7 * dAlphaz_dVg - tmp1
10923 * dVdsat_dVg) * dVgs_eff_dVg;
10924 T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
10925 cddb = T4 * (2.0 - (1.0 / (3.0 * T1
10926 * T1) + 2.0 * tmp) * T6 + T8
10927 * (6.0 * Vdsat - 2.4 *
Vds));
10930 T7 = 2.0 * (T1 + T3);
10933 T0 = 4.0 * T4 * (1.0 - T5);
10934 T12 = (-T7 * dAlphaz_dVg -
cdgb
10935 - T0 * dVdsat_dVg) * dVgs_eff_dVg;
10936 T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
10937 T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) -
cddb;
10938 tmp = -(T10 + T11 + T12);
10952 T2 = -Two_Third_CoxWL * Vgst;
10956 cggb = One_Third_CoxWL * (3.0
10957 - dVdsat_dVg) * dVgs_eff_dVg;
10958 T2 = -One_Third_CoxWL * dVdsat_dVb;
10962 cdgb = -One_Third_CoxWL * dVgs_eff_dVg;
10964 T4 = One_Third_CoxWL * dVth_dVb;
10968 - Two_Third_CoxWL * dVgs_eff_dVg);
10969 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10975 Alphaz = Vgst / Vdsat;
10976 T1 = 2.0 * Vdsat -
Vds;
10977 T2 = Vds / (3.0 * T1);
10982 - 0.5 * (Vds - T3));
10987 tmp = -
CoxWL * T5 * dVdsat_dVb;
10992 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10993 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10999 T0 = T4 * (2.0 * T5 - 2.0);
11001 cdgb = (T0 * dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg;
11002 T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
11003 cddb = T4 * (1.0 - 2.0 * T2 - T5);
11018 dVbseffCV_dVb = 1.0;
11023 dVbseffCV_dVb = -dPhis_dVb;
11037 VgstNVt = (Vgst - voffcv) / T0;
11041 Vgsteff = Vgst - voffcv;
11042 dVgsteff_dVg = dVgs_eff_dVg;
11043 dVgsteff_dVd = -dVth_dVd;
11044 dVgsteff_dVb = -dVth_dVb;
11049 dVgsteff_dVg = 0.0;
11050 dVgsteff_dVd = Vgsteff / noff;
11051 dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
11052 dVgsteff_dVd *= dnoff_dVd;
11056 ExpVgst = exp(VgstNVt);
11057 Vgsteff = T0 * log(1.0 + ExpVgst);
11058 dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
11059 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
11060 / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
11061 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
11062 / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
11063 dVgsteff_dVg *= dVgs_eff_dVg;
11083 dT10_dVd = T10 * dn_dVd;
11084 dT10_dVb = T10 * dn_dVb;
11090 T3 = Vtm * log(1.0 + ExpVgst);
11093 dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
11094 dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
11095 dT10_dVg *= dVgs_eff_dVg;
11105 dT9_dVd = dn_dVd * T3;
11106 dT9_dVb = dn_dVb * T3;
11113 dT9_dVd = dn_dVd * T3;
11114 dT9_dVb = dn_dVb * T3;
11124 dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
11125 dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
11126 dT9_dVg *= dVgs_eff_dVg;
11129 Vgsteff = T10 / T9;
11131 dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
11132 dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
11133 dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
11145 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
11149 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
11152 T1 = 0.5 * (1.0 + V3 /
T0);
11153 Vfbeff = Vfb - 0.5 * (V3 +
T0);
11154 dVfbeff_dVg = T1 * dVgs_eff_dVg;
11155 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11156 Qac0 =
CoxWL * (Vfbeff - Vfb);
11157 dQac0_dVg =
CoxWL * dVfbeff_dVg;
11158 dQac0_dVb =
CoxWL * dVfbeff_dVb;
11161 T3 = Vgs_eff - Vfbeff - VbseffCV -
Vgsteff;
11174 T1 = sqrt(T0 * T0 + T3);
11175 T2 =
CoxWL * T0 / T1;
11180 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
11181 dQsub0_dVd = -T2 * dVgsteff_dVd;
11182 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb
11187 VdsatCV = Vgsteff / AbulkCV;
11190 dT0_dVg = 1.0 / AbulkCV;
11191 dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11192 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11194 dT1_dVd = -T0 / T1;
11195 dT1_dVb = dT1_dVg * dT0_dVb;
11196 dT1_dVg *= dT0_dVg;
11199 VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11200 dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11201 dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11202 dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11208 T5 = VdsatCV * T3 / (T1 -
T0);
11209 VdseffCV = VdsatCV * T4;
11210 dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11211 dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11212 dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11218 dVdseffCV_dVg = 0.0;
11219 dVdseffCV_dVb = 0.0;
11222 T0 = AbulkCV * VdseffCV;
11223 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
11224 T2 = VdseffCV / T1;
11227 T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11228 T5 = (6.0 * T0 * (4.0 * Vgsteff -
T0) / (T1 * T1) - 0.5);
11229 T6 = 12.0 * T2 * T2 *
Vgsteff;
11231 qgate =
CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
11232 Cgg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11233 Cgd1 =
CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
11234 Cgb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11235 + Cgg1 * dVgsteff_dVb;
11236 Cgg1 *= dVgsteff_dVg;
11238 T7 = 1.0 - AbulkCV;
11240 T4 = -T7 * (T4 - 1.0);
11242 T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11243 Cbg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11244 Cbd1 =
CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
11245 Cbb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11246 + Cbg1 * dVgsteff_dVb;
11247 Cbg1 *= dVgsteff_dVg;
11252 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0
11254 T7 = (4.0 * Vgsteff -
T0) / (T1 * T1);
11255 T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11256 T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11257 T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11258 Csg =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11259 Csd =
CoxWL * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
11260 Csb =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11261 +
Csg * dVgsteff_dVb;
11262 Csg *= dVgsteff_dVg;
11267 T2 = 0.5 *
CoxWL / (T1 * T1);
11268 T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
11269 * (Vgsteff - 4.0 * T0 / 3.0))
11270 - 2.0 * T0 * T0 * T0 / 15.0;
11272 T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff -
T0)
11274 T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
11275 * Vgsteff - 8.0 * T0 / 3.0)
11276 + 2.0 * T0 * T0 / 3.0);
11277 T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11278 T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11279 Csg = (T4 + T5 * dVdseffCV_dVg);
11280 Csd = T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
11281 Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11282 +
Csg * dVgsteff_dVb;
11283 Csg *= dVgsteff_dVg;
11288 Csg = -0.5 * (Cgg1 + Cbg1);
11289 Csb = -0.5 * (Cgb1 + Cbb1);
11290 Csd = -0.5 * (Cgd1 + Cbd1);
11293 qgate += Qac0 + Qsub0;
11294 qbulk -= (Qac0 + Qsub0);
11297 Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
11298 Cgd = dQsub0_dVd + Cgd1;
11299 Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
11301 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11302 Cbd = Cbd1 - dQsub0_dVd;
11303 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11305 Cgb *= dVbseff_dVb;
11306 Cbb *= dVbseff_dVb;
11307 Csb *= dVbseff_dVb;
11325 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 *
vfbzb);
11327 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * vfbzb);
11329 T1 = 0.5 * (1.0 + V3 /
T0);
11330 Vfbeff = vfbzb - 0.5 * (V3 +
T0);
11331 dVfbeff_dVg = T1 * dVgs_eff_dVg;
11332 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11336 T0 = (Vgs_eff - VbseffCV -
vfbzb) / Tox;
11337 dT0_dVg = dVgs_eff_dVg / Tox;
11338 dT0_dVb = -dVbseffCV_dVb / Tox;
11345 dTcen_dVb = dTcen_dVg * dT0_dVb;
11346 dTcen_dVg *= dT0_dVg;
11351 dTcen_dVg = dTcen_dVb = 0.0;
11356 dTcen_dVg = dTcen_dVb = 0.0;
11363 T1 = 0.5 * (1.0 + V3 / V4);
11367 Ccen = epssub / Tcen;
11368 T2 = Cox / (Cox + Ccen);
11369 Coxeff = T2 * Ccen;
11371 dCoxeff_dVg = T2 * T2 * T3;
11372 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11373 dCoxeff_dVg *= dTcen_dVg;
11376 Qac0 = CoxWLcen * (Vfbeff -
vfbzb);
11377 QovCox = Qac0 / Coxeff;
11378 dQac0_dVg = CoxWLcen * dVfbeff_dVg
11379 + QovCox * dCoxeff_dVg;
11380 dQac0_dVb = CoxWLcen * dVfbeff_dVb
11381 + QovCox * dCoxeff_dVb;
11384 T3 = Vgs_eff - Vfbeff - VbseffCV -
Vgsteff;
11397 T1 = sqrt(T0 * T0 + T3);
11398 T2 = CoxWLcen * T0 / T1;
11402 QovCox = Qsub0 / Coxeff;
11403 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11404 + QovCox * dCoxeff_dVg;
11405 dQsub0_dVd = -T2 * dVgsteff_dVd;
11406 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
11407 + QovCox * dCoxeff_dVb;
11421 DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
11422 dDeltaPhi_dVg = 2.0 * Vtm * (T1 -
T0) / (Denomi + T1 * Vgsteff);
11426 T0 = Vgsteff - DeltaPhi - 0.001;
11427 dT0_dVg = 1.0 - dDeltaPhi_dVg;
11428 T1 = sqrt(T0 * T0 + Vgsteff * 0.004);
11429 VgDP = 0.5 * (T0 + T1);
11430 dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1);
11438 dTcen_dVg = -Tcen * T2 / T1;
11439 dTcen_dVd = dTcen_dVg * dVgsteff_dVd;
11440 dTcen_dVb = dTcen_dVg * dVgsteff_dVb;
11441 dTcen_dVg *= dVgsteff_dVg;
11443 Ccen = epssub / Tcen;
11444 T0 = Cox / (Cox + Ccen);
11445 Coxeff = T0 * Ccen;
11447 dCoxeff_dVg = T0 * T0 * T1;
11448 dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
11449 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11450 dCoxeff_dVg *= dTcen_dVg;
11455 VdsatCV = VgDP / AbulkCV;
11458 dT0_dVg = dVgDP_dVg / AbulkCV;
11459 dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11460 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11462 dT1_dVd = -T0 / T1;
11463 dT1_dVb = dT1_dVg * dT0_dVb;
11464 dT1_dVg *= dT0_dVg;
11467 VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11468 dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11469 dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11470 dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11476 T5 = VdsatCV * T3 / (T1 -
T0);
11477 VdseffCV = VdsatCV * T4;
11478 dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11479 dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11480 dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11486 dVdseffCV_dVg = 0.0;
11487 dVdseffCV_dVb = 0.0;
11490 T0 = AbulkCV * VdseffCV;
11492 T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
11494 T4 = 1.0 - 12.0 * T3 * T3;
11495 T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 -
T0) / (T2 * T2) - 0.5);
11496 T6 = T5 * VdseffCV / AbulkCV;
11498 qgate = CoxWLcen * (T1 - T0 * (0.5 - T3));
11499 QovCox =
qgate / Coxeff;
11500 Cgg1 = CoxWLcen * (T4 * dVgDP_dVg
11501 + T5 * dVdseffCV_dVg);
11502 Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
11503 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11504 Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11505 + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11506 Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11509 T7 = 1.0 - AbulkCV;
11511 T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
11512 T10 = T9 * dVgDP_dVg;
11513 T11 = -T7 * T5 / AbulkCV;
11514 T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
11516 qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
11517 QovCox =
qbulk / Coxeff;
11518 Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
11519 Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
11520 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11521 Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
11522 + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11523 Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11528 qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
11529 - 0.5 * T0 * T0 / T2);
11530 QovCox =
qsrc / Coxeff;
11533 T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 -
T0) / T3);
11534 T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg;
11536 T6 = T7 * VdseffCV;
11538 Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
11539 Csd = CoxWLcen * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd
11540 + QovCox * dCoxeff_dVd;
11541 Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11542 +
Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11543 Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11549 T3 = 0.5 * CoxWLcen / (T2 * T2);
11550 T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
11551 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
11553 QovCox = qsrc / Coxeff;
11554 T8 = 4.0 / 3.0 * T1 * (T1 -
T0) + 0.4 * T0 * T0;
11555 T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
11556 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11557 T6 = AbulkCV * (qsrc / T2 + T3 * T8);
11558 T7 = T6 * VdseffCV / AbulkCV;
11560 Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg;
11561 Csd =
Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
11562 + QovCox * dCoxeff_dVd;
11563 Csb =
Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
11564 + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
11565 Csg =
Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11577 qbulk -= (Qac0 + Qsub0);
11580 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11581 Cbd = Cbd1 - dQsub0_dVd;
11582 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11588 Cgb *= dVbseff_dVb;
11589 Cbb *= dVbseff_dVb;
11590 Csb *= dVbseff_dVb;
11646 if (ckt->CKTmode & MODEINITTRAN)
11648 *(ckt->CKTstate1 +
qcheq) = *(ckt->CKTstate0 +
qcheq);
11652 error = NIintegrate(ckt, &geq, &ceq, 0.0,
qcheq);
11685 capbs = czbs + czbssw + czbsswg;
11694 sarg = 1.0 / sqrt(arg);
11698 sarg = exp(-MJS * log(arg));
11701 capbs = czbs * sarg;
11713 sarg = 1.0 / sqrt(arg);
11717 sarg = exp(-MJSWS * log(arg));
11720 * (1.0 - arg * sarg) / (1.0 - MJSWS);
11721 capbs += czbssw * sarg;
11728 sarg = 1.0 / sqrt(arg);
11732 sarg = exp(-MJSWGS * log(arg));
11735 capbs += czbsswg * sarg;
11740 T0 = czbs + czbssw + czbsswg;
11752 capbd = czbd + czbdsw + czbdswg;
11761 sarg = 1.0 / sqrt(arg);
11765 sarg = exp(-MJD * log(arg));
11768 capbd = czbd * sarg;
11780 sarg = 1.0 / sqrt(arg);
11784 sarg = exp(-MJSWD * log(arg));
11787 * (1.0 - arg * sarg) / (1.0 - MJSWD);
11788 capbd += czbdsw * sarg;
11794 sarg = 1.0 / sqrt(arg);
11796 sarg = exp(-MJSWGD * log(arg));
11798 * (1.0 - arg * sarg) / (1.0 - MJSWGD);
11799 capbd += czbdswg * sarg;
11804 T0 = czbd + czbdsw + czbdswg;
11856 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11857 T2 = 0.5 * (T0 - T1);
11862 * (0.5 - 0.5 * T0 / T1);
11867 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11868 T2 = 0.5 * (T0 - T1);
11872 * (0.5 - 0.5 * T0 / T1);
11937 bool bsuccess =
true;
11941 #ifdef Xyce_DEBUG_DEVICE
11944 Xyce::dout() << subsection_divider << std::endl;
11945 Xyce::dout() <<
" Begin of updatePrimaryState. \n";
11946 Xyce::dout() << std::endl;
12069 bool bsuccess=
true;
12074 #ifdef Xyce_DEBUG_DEVICE
12077 Xyce::dout() << subsection_divider << std::endl;
12078 Xyce::dout() <<
" MOSFET BSIM4 loadDAEQVector " << std::endl;
12079 Xyce::dout() <<
" name = " <<
getName() << std::endl;
12080 Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
12081 Xyce::dout() <<
" " << std::endl;
12087 double Qeqqg = 0.0;
12088 double Qeqqb = 0.0;
12089 double Qeqqd = 0.0;
12090 double Qeqqgmid = 0.0;
12091 double Qeqqjs = 0.0;
12092 double Qeqqjd = 0.0;
12093 double Qqdef = 0.0;
12094 double Qqcheq = 0.0;
12325 if (ckt->CKTmode & MODEINITTRAN)
12327 *(ckt->CKTstate1 + cqb) = *(ckt->CKTstate0 + cqb);
12328 *(ckt->CKTstate1 + cqg) = *(ckt->CKTstate0 + cqg);
12329 *(ckt->CKTstate1 + cqd) = *(ckt->CKTstate0 + cqd);
12333 *(ckt->CKTstate1 + cqgmid) = *(ckt->CKTstate0 + cqgmid);
12338 *(ckt->CKTstate1 + cqbs) = *(ckt->CKTstate0 + cqbs);
12339 *(ckt->CKTstate1 + cqbd) = *(ckt->CKTstate0 + cqbd);
13047 bool bsuccess =
true;
13052 #ifdef Xyce_DEBUG_DEVICE
13055 Xyce::dout() << std::endl << subsection_divider << std::endl;
13056 Xyce::dout() <<
" Begin of Instance::loadDAEFVector. ";
13057 Xyce::dout() <<
" origFlag = " <<
origFlag <<
" name = " <<
getName() << std::endl;
13059 Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13060 Xyce::dout() <<
" " << std::endl;
13140 Idtoteq_Jdxp = 0.0;
13173 Igtoteq_Jdxp = 0.0;
13271 Idtoteq_Jdxp = 0.0;
13304 Igtoteq_Jdxp = 0.0;
13318 double tmp_gcrgd =
gcrgd;
13358 ceqgdtot_Jdxp = 0.0;
13778 double tmp_gcrgd =
gcrgd;
13857 bool bsuccess =
true;
13867 #ifdef Xyce_DEBUG_DEVICE
13870 Xyce::dout() << std::endl << subsection_divider << std::endl;
13871 Xyce::dout() <<
" name = " <<
getName() << std::endl;
13974 bool bsuccess =
true;
13977 #ifdef Xyce_DEBUG_DEVICE
13980 Xyce::dout() << std::endl << subsection_divider << std::endl;
13981 Xyce::dout() <<
"Instance::loadDAEdFdx";
13982 Xyce::dout() <<
" name = " <<
getName() << std::endl;
14235 bool bsuccess =
true;
14254 double coxe,
double Vgs_arg,
14256 double & dVgs_eff_dVg)
14258 double T1(0.0), T2(0.0), T3(0.0), T4(0.0), T5(0.0), T6(0.0), T7(0.0), T8(0.0);
14263 if ((ngate > 1.0e18) && (ngate < 1.0e25) && (Vgs_arg > phi) && (epsgate!=0))
14265 T1 = 1.0e6 *
CONSTQ * epsgate * ngate / (coxe * coxe);
14266 T8 = Vgs_arg - phi;
14267 T4 = sqrt(1.0 + 2.0 * T8 / T1);
14268 T2 = 2.0 * T8 / (T4 + 1.0);
14269 T3 = 0.5 * T2 * T2 / T1;
14270 T7 = 1.12 - T3 - 0.05;
14271 T6 = sqrt(T7 * T7 + 0.224);
14272 T5 = 1.12 - 0.5 * (T7 + T6);
14273 Vgs_eff = Vgs_arg - T5;
14274 dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
14279 dVgs_eff_dVg = 1.0;
14293 (
double Nvtm,
double Ijth,
double Isb,
double XExpBV,
double & Vjm)
14295 double Tb(0.0), Tc(0.0), EVjmovNv(0.0);
14298 Tb = 1.0 + Ijth / Isb - Tc;
14299 EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc));
14300 Vjm = Nvtm * log(EVjmovNv);
14323 (
double nf_arg,
int minSD,
14324 double & nuIntD,
double & nuEndD,
double & nuIntS,
double & nuEndS)
14326 int NF =
static_cast<int>(nf_arg);
14330 nuEndD = nuEndS = 1.0;
14331 nuIntD = nuIntS = 2.0 *
Xycemax((nf_arg - 1.0) / 2.0, 0.0);
14338 nuIntD = 2.0 *
Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14347 nuIntS = 2.0 *
Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14365 (
double nf_arg,
int geo,
int minSD,
14366 double Weffcj,
double DMCG,
double DMCI,
double DMDG,
14367 double & Ps,
double & Pd,
double & As,
double & Ad)
14369 double T0(0.0), T1(0.0), T2(0.0);
14370 double ADiso(0.0), ADsha(0.0), ADmer(0.0), ASiso(0.0), ASsha(0.0), ASmer(0.0);
14371 double PDiso(0.0), PDsha(0.0), PDmer(0.0), PSiso(0.0), PSsha(0.0), PSmer(0.0);
14372 double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14375 NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14381 PSiso = PDiso = T0 + T0 + Weffcj;
14382 PSsha = PDsha = T1;
14383 PSmer = PDmer = T2;
14385 ASiso = ADiso = T0 * Weffcj;
14386 ASsha = ADsha = DMCG * Weffcj;
14387 ASmer = ADmer = DMDG * Weffcj;
14392 Ps = nuEndS * PSiso + nuIntS * PSsha;
14393 Pd = nuEndD * PDiso + nuIntD * PDsha;
14394 As = nuEndS * ASiso + nuIntS * ASsha;
14395 Ad = nuEndD * ADiso + nuIntD * ADsha;
14398 Ps = nuEndS * PSiso + nuIntS * PSsha;
14399 Pd = (nuEndD + nuIntD) * PDsha;
14400 As = nuEndS * ASiso + nuIntS * ASsha;
14401 Ad = (nuEndD + nuIntD) * ADsha;
14404 Ps = (nuEndS + nuIntS) * PSsha;
14405 Pd = nuEndD * PDiso + nuIntD * PDsha;
14406 As = (nuEndS + nuIntS) * ASsha;
14407 Ad = nuEndD * ADiso + nuIntD * ADsha;
14410 Ps = (nuEndS + nuIntS) * PSsha;
14411 Pd = (nuEndD + nuIntD) * PDsha;
14412 As = (nuEndS + nuIntS) * ASsha;
14413 Ad = (nuEndD + nuIntD) * ADsha;
14416 Ps = nuEndS * PSiso + nuIntS * PSsha;
14417 Pd = nuEndD * PDmer + nuIntD * PDsha;
14418 As = nuEndS * ASiso + nuIntS * ASsha;
14419 Ad = nuEndD * ADmer + nuIntD * ADsha;
14422 Ps = (nuEndS + nuIntS) * PSsha;
14423 Pd = nuEndD * PDmer + nuIntD * PDsha;
14424 As = (nuEndS + nuIntS) * ASsha;
14425 Ad = nuEndD * ADmer + nuIntD * ADsha;
14428 Ps = nuEndS * PSmer + nuIntS * PSsha;
14429 Pd = nuEndD * PDiso + nuIntD * PDsha;
14430 As = nuEndS * ASmer + nuIntS * ASsha;
14431 Ad = nuEndD * ADiso + nuIntD * ADsha;
14434 Ps = nuEndS * PSmer + nuIntS * PSsha;
14435 Pd = (nuEndD + nuIntD) * PDsha;
14436 As = nuEndS * ASmer + nuIntS * ASsha;
14437 Ad = (nuEndD + nuIntD) * ADsha;
14440 Ps = nuEndS * PSmer + nuIntS * PSsha;
14441 Pd = nuEndD * PDmer + nuIntD * PDsha;
14442 As = nuEndS * ASmer + nuIntS * ASsha;
14443 Ad = nuEndD * ADmer + nuIntD * ADsha;
14446 Ps = PSiso + (nf_arg - 1.0) * PSsha;
14447 Pd = nf_arg * PDsha;
14448 As = ASiso + (nf_arg - 1.0) * ASsha;
14449 Ad = nf_arg * ADsha;
14452 Ps = nf_arg * PSsha;
14453 Pd = PDiso + (nf_arg - 1.0) * PDsha;
14454 As = nf_arg * ASsha;
14455 Ad = ADiso + (nf_arg - 1.0) * ADsha;
14458 UserWarning(*
this) <<
"Specified GEO not matched\n";
14475 int geo,
int rgeo,
int minSD,
14476 double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14477 int Type,
double & Rtot)
14479 std::string msg=
"";
14480 double Rint(0.0), Rend (0.0);
14481 double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14485 NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14493 Rint = Rsh * DMCG / ( Weffcj * nuIntS);
14500 Rint = Rsh * DMCG / ( Weffcj * nuIntD);
14507 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14508 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14511 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14512 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14515 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14516 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14519 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14520 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14523 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14524 else Rend = Rsh * DMDG / Weffcj;
14527 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14528 else Rend = Rsh * DMDG / (Weffcj * nuEndD);
14531 if (Type == 1) Rend = Rsh * DMDG / Weffcj;
14532 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14535 if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS);
14536 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14539 Rend = Rsh * DMDG / Weffcj;
14544 Rend = 0.5 * Rsh * DMCG / Weffcj;
14548 Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14553 Rint = Rsh * DMCG / (Weffcj * nf_arg);
14560 Rint = Rsh * DMCG / (Weffcj * nf_arg);
14564 Rend = 0.5 * Rsh * DMCG / Weffcj;;
14568 Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14572 UserWarning(*
this) <<
"Specified GEO not matched\n";
14577 else if (Rend <= 0.0)
14580 Rtot = Rint * Rend / (Rint + Rend);
14584 UserWarning(*
this) <<
"Zero resistance returned from RdseffGeo\n";
14600 (
double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14601 double nuEnd,
int rgeo,
int Type,
double & Rend)
14603 std::string msg=
"";
14614 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14619 if ((DMCG + DMCI) == 0.0)
14620 msg =
"(DMCG + DMCI) can not be equal to zero\n";
14624 Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14627 UserWarning(*
this) <<
"Specified RGEO not matched\n";
14640 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14645 if ((DMCG + DMCI) == 0.0)
14646 msg =
"(DMCG + DMCI) can not be equal to zero\n";
14650 Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14653 UserWarning(*
this) <<
"Specified RGEO not matched\n";
14669 (
double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14670 int rgeo,
int Type,
double nuEnd,
double & Rend)
14672 std::string msg =
"";
14683 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14689 msg =
"DMCG can not be equal to zero\n";
14693 Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14696 UserWarning(*
this) <<
"Specified RGEO not matched\n";
14709 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14715 msg =
"DMCG can not be equal to zero\n";
14719 Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14722 UserWarning(*
this) <<
"Specified RGEO = %d not matched\n";
14747 UserWarning(*
this) <<
"Given pbs is less than 0.1. Pbs is set to 0.1";
14752 UserWarning(*
this) <<
"Given pbsws is less than 0.1. Pbsws is set to 0.1";
14757 UserWarning(*
this) <<
"Given pbswgs is less than 0.1. Pbswgs is set to 0.1";
14763 UserWarning(*
this) <<
"Given pbd is less than 0.1. Pbd is set to 0.1";
14768 UserWarning(*
this) <<
"Given pbswd is less than 0.1. Pbswd is set to 0.1";
14773 UserWarning(*
this) <<
"Given pbswgd is less than 0.1. Pbswgd is set to 0.1";
14793 std::vector<Instance*>::iterator iter;
14797 for (iter=first; iter!=last; ++iter)
14799 (*iter)->processParams();
14818 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
15492 sheetResistance(0.0),
15493 SjctSatCurDensity(0.0),
15494 DjctSatCurDensity(0.0),
15495 SjctSidewallSatCurDensity(0.0),
15496 DjctSidewallSatCurDensity(0.0),
15497 SjctGateSidewallSatCurDensity(0.0),
15498 DjctGateSidewallSatCurDensity(0.0),
15499 SbulkJctPotential(0.0),
15500 DbulkJctPotential(0.0),
15501 SbulkJctBotGradingCoeff(0.0),
15502 DbulkJctBotGradingCoeff(0.0),
15503 SbulkJctSideGradingCoeff(0.0),
15504 DbulkJctSideGradingCoeff(0.0),
15505 SbulkJctGateSideGradingCoeff(0.0),
15506 DbulkJctGateSideGradingCoeff(0.0),
15507 SsidewallJctPotential(0.0),
15508 DsidewallJctPotential(0.0),
15509 SGatesidewallJctPotential(0.0),
15510 DGatesidewallJctPotential(0.0),
15511 SunitAreaJctCap(0.0),
15512 DunitAreaJctCap(0.0),
15513 SunitLengthSidewallJctCap(0.0),
15514 DunitLengthSidewallJctCap(0.0),
15515 SunitLengthGateSidewallJctCap(0.0),
15516 DunitLengthGateSidewallJctCap(0.0),
15517 SjctEmissionCoeff(0.0),
15518 DjctEmissionCoeff(0.0),
15519 SjctTempExponent(0.0),
15520 DjctTempExponent(0.0),
15608 SjctTempSatCurDensity(0.0),
15609 SjctSidewallTempSatCurDensity(0.0),
15610 SjctGateSidewallTempSatCurDensity(0.0),
15614 DjctTempSatCurDensity(0.0),
15615 DjctSidewallTempSatCurDensity(0.0),
15616 DjctGateSidewallTempSatCurDensity(0.0),
15617 SunitAreaTempJctCap(0.0),
15618 DunitAreaTempJctCap(0.0),
15619 SunitLengthSidewallTempJctCap(0.0),
15620 DunitLengthSidewallTempJctCap(0.0),
15621 SunitLengthGateSidewallTempJctCap(0.0),
15622 DunitLengthGateSidewallTempJctCap(0.0),
15624 oxideTrapDensityA(0.0),
15625 oxideTrapDensityB(0.0),
15626 oxideTrapDensityC(0.0),
15636 gamma1Given(false),
15642 gamma2Given(false),
15647 rbsbx0Given(false),
15648 rbsby0Given(false),
15649 rbdbx0Given(false),
15650 rbdby0Given(false),
15651 lambdaGiven(false),
15667 else if (
getType() ==
"PMOS") {
15684 if (!
given(
"TNOM"))
15692 if (!
given(
"TOXP") )
15694 if (!
given(
"TOXM") )
15696 if (!
given(
"DSUB") )
15699 if (!
given(
"VTH0") )
15702 if (!
given(
"VDDEOT"))
15707 ua =(
mobMod == 2) ? 1.0E-15 : 1.0E-9;
15709 uc = (
mobMod == 1) ? -0.0465 : -0.0465E-9;
15711 uc1 =(
mobMod == 1) ? -0.056 : -0.056E-9;
15714 if (!
given(
"AIGC"))
15716 if (!
given(
"BIGC"))
15718 if (!
given(
"CIGC"))
15720 if (
given(
"AIGSD"))
15727 if (!
given(
"AIGS"))
15729 if (!
given(
"AIGD"))
15733 if (
given(
"BIGSD"))
15740 if (!
given(
"BIGS"))
15742 if (!
given(
"BIGD"))
15745 if (
given(
"CIGSD"))
15752 if (!
given(
"CIGS"))
15754 if (!
given(
"CIGD"))
15757 if (!
given(
"IJTHDFWD"))
15759 if (!
given(
"IJTHDREV"))
15761 if (!
given(
"XJBVD"))
15765 if (!
given(
"CKAPPAD"))
15767 if (!
given(
"DMCI"))
15773 if (!
given(
"LWLC"))
15779 if (!
given(
"WWLC"))
15786 if (!
given(
"AGISL"))
15788 if (
given(
"AGIDL"))
15792 if (!
given(
"BGISL"))
15794 if (
given(
"BGIDL"))
15797 if (!
given(
"CGISL"))
15799 if (
given(
"CGIDL"))
15802 if (!
given(
"EGISL"))
15804 if (
given(
"EGIDL"))
15808 if (!
given(
"DLCIG"))
15810 if (!
given(
"DLCIGD"))
15812 if (!
given(
"DLCIG"))
15831 if (!
given(
"JSWD"))
15833 if (!
given(
"JSWGD"))
15839 if (!
given(
"XTID"))
15843 if (!
given(
"MJSWD"))
15845 if (!
given(
"MJSWGS"))
15847 if (!
given(
"MJSWGD"))
15849 if (!
given(
"PBSWD"))
15851 if (!
given(
"PBSWGS"))
15853 if (!
given(
"PBSWGD"))
15857 if (!
given(
"CJSWD"))
15859 if (!
given(
"CJSWGS"))
15861 if (!
given(
"CJSWGD"))
15864 if (!
given(
"JTSD"))
15866 if (!
given(
"JTSSWD"))
15868 if (!
given(
"JTSSWGD"))
15871 if (!
given(
"NJTSD"))
15876 if (!
given(
"NJTSSWD"))
15878 if (
given(
"NJTSSW"))
15881 if (!
given(
"NJTSSWGD"))
15883 if (
given(
"NJTSSWG"))
15887 if (!
given(
"XTSD"))
15889 if (!
given(
"XTSSWD"))
15891 if (!
given(
"XTSSWGD"))
15894 if (!
given(
"TNJTSD"))
15896 if (
given(
"TNJTS"))
15899 if (!
given(
"TNJTSSWD"))
15901 if (
given(
"TNJTSSW"))
15904 if (!
given(
"TNJTSSWGD"))
15906 if (
given(
"TNJTSSWG"))
15910 if (!
given(
"VTSD"))
15912 if (!
given(
"VTSSWD"))
15914 if (!
given(
"VTSSWGD"))
15917 if (!
given(
"LAGISL"))
15919 if (
given(
"LAGIDL"))
15922 if (!
given(
"LBGISL"))
15924 if (
given(
"LBGIDL"))
15927 if (!
given(
"LCGISL"))
15929 if (
given(
"LCGIDL"))
15932 if (!
given(
"LEGISL"))
15934 if (
given(
"LEGIDL"))
15967 if (!
given(
"WAGISL"))
15969 if (
given(
"WAGIDL"))
15972 if (!
given(
"WBGISL"))
15974 if (
given(
"WBGIDL"))
15977 if (!
given(
"WCGISL"))
15979 if (
given(
"WCGIDL"))
15982 if (!
given(
"WEGISL"))
15984 if (
given(
"WEGIDL"))
16002 if (!
given(
"PAGISL"))
16004 if (
given(
"PAGIDL"))
16007 if (!
given(
"PBGISL"))
16009 if (
given(
"PBGIDL"))
16012 if (!
given(
"PCGISL"))
16014 if (
given(
"PCGIDL"))
16017 if (!
given(
"PEGISL"))
16019 if (
given(
"PEGIDL"))
16037 if (!
given(
"NOIA"))
16044 if (!
given(
"NOIB"))
16051 if (!
given(
"NOIC"))
16069 std::list<SizeDependParam*>::iterator it_dpL =
16071 std::list<SizeDependParam*>::iterator end_dpL =
16073 for( ; it_dpL != end_dpL; ++it_dpL )
16078 std::vector<Instance*>::iterator iter;
16082 for (iter=first; iter!=last; ++iter)
16099 std::vector<Instance*>::const_iterator iter;
16105 os <<
" name model name Parameters" << std::endl;
16107 for (i=0, iter=first; iter!=last; ++iter,++i)
16109 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
16135 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16156 std::list<SizeDependParam*>::iterator it_dpL =
16158 std::list<SizeDependParam*>::iterator end_dpL =
16160 for( ; it_dpL != end_dpL; ++it_dpL )
16182 bool bsuccess =
true;
16185 #pragma omp parallel for
16192 bsuccess = bsuccess && btmp;
16303 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
16451 double Qeqqg = 0.0;
16452 double Qeqqb = 0.0;
16453 double Qeqqd = 0.0;
16454 double Qeqqgmid = 0.0;
16455 double Qeqqjs = 0.0;
16456 double Qeqqjd = 0.0;
16457 double Qqdef = 0.0;
16458 double Qqcheq = 0.0;
16480 Qeqqgmid = mi.
qgmid;
16492 Qqcheq = -mi.
qcheq;
16503 Qeqqgmid = -mi.
qgmid;
16608 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17113 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17279 .registerDevice(
"m", 14)
17280 .registerDevice(
"m", 54)
17281 .registerModelType(
"pmos", 14)
17282 .registerModelType(
"nmos", 14)
17283 .registerModelType(
"pmos", 54)
17284 .registerModelType(
"nmos", 54);