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;
5147 tmpstr =
getName()+
"_drainprime";
5154 tmpstr =
getName()+
"_sourceprime";
5161 tmpstr =
getName()+
"_GatePrime";
5168 tmpstr =
getName()+
"_MidGate";
5179 tmpstr =
getName()+
"_SourceBody";
5183 tmpstr =
getName()+
"_DrainBody";
5197 tmpstr =
getName()+
"_branch_DS";
5203 tmpstr =
getName()+
"_branch_GS";
5209 tmpstr =
getName()+
"_branch_BS";
5232 Xyce::dout() << std::endl
5233 << section_divider << std::endl
5234 <<
" In Instance::registerStateLIDs" << std::endl
5235 <<
" name = " <<
getName() << std::endl
5236 <<
" Number of State LIDs: " << staLIDVecRef.size() << std::endl;
5266 #ifdef Xyce_DEBUG_DEVICE
5269 Xyce::dout() <<
" Local State indices:" << std::endl;
5270 Xyce::dout() << std::endl;
5271 Xyce::dout() <<
" li_state_qb = " <<
li_state_qb << std::endl;
5272 Xyce::dout() <<
" li_state_qg = " <<
li_state_qg << std::endl;
5273 Xyce::dout() <<
" li_state_qd = " <<
li_state_qd << std::endl;
5274 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs << std::endl;
5275 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd << std::endl;
5276 Xyce::dout() <<
" li_state_qcheq = " <<
li_state_qcheq << std::endl;
5277 Xyce::dout() <<
" li_state_qcdump = " <<
li_state_qcdump << std::endl;
5278 Xyce::dout() << std::endl;
5279 Xyce::dout() << section_divider << std::endl;
5342 std::vector<int> & map =
jacMap;
5343 std::vector< std::vector<int> > & map2 =
jacMap2;;
5345 Dd = jacLIDVec[map[0]][map2[0][0]];
5346 Ddp = jacLIDVec[map[0]][map2[0][1]];
5347 Dsp = jacLIDVec[map[0]][map2[0][2]];
5348 Dgp = jacLIDVec[map[0]][map2[0][3]];
5349 Dbp = jacLIDVec[map[0]][map2[0][4]];
5352 Dids = jacLIDVec[map[0]][map2[0][5]];
5355 GEge = jacLIDVec[map[1]][map2[1][0]];
5356 GEdp = jacLIDVec[map[1]][map2[1][1]];
5357 GEsp = jacLIDVec[map[1]][map2[1][2]];
5358 GEgp = jacLIDVec[map[1]][map2[1][3]];
5359 GEgm = jacLIDVec[map[1]][map2[1][4]];
5360 GEbp = jacLIDVec[map[1]][map2[1][5]];
5363 GEigs = jacLIDVec[map[1]][map2[1][6]];
5366 Ss = jacLIDVec[map[2]][map2[2][0]];
5367 Sdp = jacLIDVec[map[2]][map2[2][1]];
5368 Ssp = jacLIDVec[map[2]][map2[2][2]];
5369 Sgp = jacLIDVec[map[2]][map2[2][3]];
5370 Sbp = jacLIDVec[map[2]][map2[2][4]];
5376 Sibs = jacLIDVec[map[2]][map2[2][currentCol++]];
5380 Sids = jacLIDVec[map[2]][map2[2][currentCol++]];
5384 Sigs = jacLIDVec[map[2]][map2[2][currentCol++]];
5387 Bb = jacLIDVec[map[3]][map2[3][0]];
5388 Bbp = jacLIDVec[map[3]][map2[3][1]];
5389 Bsb = jacLIDVec[map[3]][map2[3][2]];
5390 Bdb = jacLIDVec[map[3]][map2[3][3]];
5393 Bibs = jacLIDVec[map[3]][map2[3][4]];
5396 DPd = jacLIDVec[map[4]][map2[4][0]];
5397 DPdp = jacLIDVec[map[4]][map2[4][1]];
5398 DPsp = jacLIDVec[map[4]][map2[4][2]];
5399 DPgp = jacLIDVec[map[4]][map2[4][3]];
5400 DPgm = jacLIDVec[map[4]][map2[4][4]];
5401 DPbp = jacLIDVec[map[4]][map2[4][5]];
5402 DPdb = jacLIDVec[map[4]][map2[4][6]];
5405 DPq = jacLIDVec[map[4]][map2[4][7]];
5408 SPs = jacLIDVec[map[5]][map2[5][0]];
5409 SPdp = jacLIDVec[map[5]][map2[5][1]];
5410 SPsp = jacLIDVec[map[5]][map2[5][2]];
5411 SPgp = jacLIDVec[map[5]][map2[5][3]];
5412 SPgm = jacLIDVec[map[5]][map2[5][4]];
5413 SPbp = jacLIDVec[map[5]][map2[5][5]];
5414 SPsb = jacLIDVec[map[5]][map2[5][6]];
5418 SPq = jacLIDVec[map[5]][map2[5][7]];
5421 GPge = jacLIDVec[map[6]][map2[6][0]];
5422 GPdp = jacLIDVec[map[6]][map2[6][1]];
5423 GPsp = jacLIDVec[map[6]][map2[6][2]];
5424 GPgp = jacLIDVec[map[6]][map2[6][3]];
5425 GPgm = jacLIDVec[map[6]][map2[6][4]];
5426 GPbp = jacLIDVec[map[6]][map2[6][5]];
5430 GPq = jacLIDVec[map[6]][map2[1][6]];
5433 GMge = jacLIDVec[map[7]][map2[7][0]];
5434 GMdp = jacLIDVec[map[7]][map2[7][1]];
5435 GMsp = jacLIDVec[map[7]][map2[7][2]];
5436 GMgp = jacLIDVec[map[7]][map2[7][3]];
5437 GMgm = jacLIDVec[map[7]][map2[7][4]];
5438 GMbp = jacLIDVec[map[7]][map2[7][5]];
5440 BPb = jacLIDVec[map[8]][map2[8][0]];
5441 BPdp = jacLIDVec[map[8]][map2[8][1]];
5442 BPsp = jacLIDVec[map[8]][map2[8][2]];
5443 BPgp = jacLIDVec[map[8]][map2[8][3]];
5444 BPgm = jacLIDVec[map[8]][map2[8][4]];
5445 BPbp = jacLIDVec[map[8]][map2[8][5]];
5446 BPsb = jacLIDVec[map[8]][map2[8][6]];
5447 BPdb = jacLIDVec[map[8]][map2[8][7]];
5449 SBb = jacLIDVec[map[9]][map2[9][0]];
5450 SBsp = jacLIDVec[map[9]][map2[9][1]];
5451 SBbp = jacLIDVec[map[9]][map2[9][2]];
5452 SBsb = jacLIDVec[map[9]][map2[9][3]];
5454 DBb = jacLIDVec[map[10]][map2[10][0]];
5455 DBdp = jacLIDVec[map[10]][map2[10][1]];
5456 DBbp = jacLIDVec[map[10]][map2[10][2]];
5457 DBdb = jacLIDVec[map[10]][map2[10][3]];
5463 Qdp = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5464 Qsp = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5465 Qgp = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5466 Qbp = jacLIDVec[map[currentRow]][map2[currentRow][3]];
5467 Qq = jacLIDVec[map[currentRow]][map2[currentRow][4]];
5473 IBSs = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5474 IBSb = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5475 IBSibs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5481 IDSd = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5482 IDSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5483 IDSids = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5489 IGSg = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5490 IGSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5491 IGSigs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5508 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5670 double tmp(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), Eg(0.0), Eg0(0.0), ni,epssub;
5671 double T0(0.0), T1(0.0);
5672 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);
5673 double delTemp(0.0), TRatio(0.0), Inv_L(0.0), Inv_W(0.0), Inv_LW(0.0), Vtm0, Tnom(0.0);
5674 double dumPs(0.0), dumPd(0.0), dumAs(0.0), dumAd(0.0), PowWeffWr(0.0);
5675 double Nvtms(0.0), Nvtmd(0.0), SourceSatCurrent(0.0), DrainSatCurrent(0.0);
5677 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);
5678 double W_tmp(0.0), Inv_ODeff(0.0), OD_offset(0.0), dk2_lod(0.0), deta0_lod(0.0);
5679 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);
5680 double kvsat(0.0), wlod(0.0), sceff(0.0), Wdrn(0.0);
5681 double V0, lt1, ltw, Theta0, Delt_vth, TempRatio, Vth_NarrowW, Lpe_Vb, Vth;
5682 double n,
Vgsteff, Vgs_eff, toxpf, toxpi, Tcen, toxe, epsrox, vddeot;
5686 bool bsuccess =
true;
5688 #ifdef Xyce_DEBUG_DEVICE
5691 Xyce::dout() << std::endl << subsection_divider << std::endl;
5692 Xyce::dout() <<
"Instance::updateTemperature\n";
5693 Xyce::dout() <<
"name = " <<
getName() << std::endl;
5698 if (temp_tmp != -999.0)
temp = temp_tmp;
5717 UserWarning(*
this) <<
"toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored";
5782 Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
5783 ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5784 * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
5792 ni =
model_.
ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5793 * exp((
T0 - Eg0) / (2.0 * Vtm0));
5800 Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
5811 T1 = log(temp / Tnom);
5870 delTemp = temp - Tnom;
5881 UserWarning(*
this) <<
"Temperature effect has caused cjs to be negative. Cjs is clamped to zero";
5887 UserWarning(*
this) <<
"Temperature effect has caused cjd to be negative. Cjd is clamped to zero";
5902 UserWarning(*
this) <<
"Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero";
5907 UserWarning(*
this) <<
"Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero";
5922 UserWarning(*
this) <<
"Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero";
5927 UserWarning(*
this) <<
"Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero";
5936 UserWarning(*
this) <<
"Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01";
5943 UserWarning(*
this) <<
"Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01";
5950 UserWarning(*
this) <<
"Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01";
5957 UserWarning(*
this) <<
"Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01";
5964 UserWarning(*
this) <<
"Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01";
5971 UserWarning(*
this) <<
"Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01";
6044 std::list<SizeDependParam*>::iterator it_dpL =
6046 std::list<SizeDependParam*>::iterator end_dpL =
6051 for( ; it_dpL != end_dpL; ++it_dpL )
6053 if( ((*it_dpL)->Length ==
l)
6054 && ((*it_dpL)->Width ==
w)
6055 && ((*it_dpL)->NFinger ==
nf) )
6109 <<
" Effective channel length <= 0";
6116 <<
" Effective channel width <= 0";
6123 <<
" Effective channel length for C-V <= 0";
6130 <<
" Effective channel width for C-V <= 0";
6137 <<
" Effective channel width for S/D junctions <= 0";
6725 T0 = (TRatio - 1.0);
6729 T1 = T2 = T3 = T4 = 0.0;
6775 UserWarning(*
this) <<
"Rdw at current temperature is negative; set to 0";
6780 UserWarning(*
this) <<
"Rdwmin at current temperature is negative; set to 0";
6787 UserWarning(*
this) <<
"Rsw at current temperature is negative; set to 0";
6792 UserWarning(*
this) <<
"Rswmin at current temperature is negative; set to 0";
6807 UserWarning(*
this) <<
"eu has been negative; reset to 0.0";
6913 UserWarning(*
this) <<
"k1 should be specified with k2";
6918 UserWarning(*
this) <<
"k2 should be specified with k1";
6923 UserWarning(*
this) <<
"nsub is ignored because k1 or k2 is given";
6927 UserWarning(*
this) <<
"xt is ignored because k1 or k2 is given";
6931 UserWarning(*
this) <<
"vbx is ignored because k1 or k2 is given";
6935 UserWarning(*
this) <<
"gamma1 is ignored because k1 or k2 is given";
6939 UserWarning(*
this) <<
"gamma2 is ignored because k1 or k2 is given";
7007 tmp = sqrt(epssub / (epsrox * CONSTEPS0)
7093 UserWarning(*
this) <<
"WLOD =is less than 0. 0.0 is used";
7097 W_tmp = Wnew + wlod;
7110 T0 = (TRatio - 1.0);
7121 if( (
sa > 0.0) && (
sb > 0.0) &&
7122 ((
nf == 1.0) || ((
nf > 1.0) && (
sd > 0.0))) )
7130 UserWarning(*
this) <<
"KVSAT is too small; -1.0 is used";
7135 UserWarning(*
this) <<
"KVSAT is too big; 1.0 is used";
7140 for(i = 0; i <
nf; i++)
7142 T0 = 1.0 / nf / (
sa + 0.5*Ldrn + i * (
sd +Ldrn));
7143 T1 = 1.0 / nf / (
sb + 0.5*Ldrn + i * (
sd +Ldrn));
7147 Inv_ODeff = Inv_sa + Inv_sb;
7186 * exp(-10.0 *
sc * T2)
7188 * exp(-10.0 * T1 * T2) ) / Wdrn;
7190 * exp(-20.0 *
sc * T2)
7192 * exp(-20.0 * T1 * T2) ) / Wdrn;
7196 UserWarning(*
this) <<
"No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive";
7207 UserWarning(*
this) <<
"ku0we = %g is negatively too high. Negative mobility!";
7235 else if (
vbsc < -30.0)
7271 rbsb = rbsbx * rbsby / (rbsbx + rbsby);
7278 rbdb = rbdbx * rbdby / (rbdbx + rbdby);
7281 if ((bodymode == 3)|| (bodymode == 5))
7293 rbpb = rbpbx*rbpby/(rbpbx + rbpby);
7316 if((
rbodyMod == 2) && (bodymode == 3))
7330 if((
rbodyMod == 2) && (bodymode == 1))
7358 UserWarning(*
this) <<
"The gate conductance reset to 1.0e3 mho";
7377 (
Pseff), dumPd, dumAs, dumAd);
7391 dumPs, (
Pdeff), dumAs, dumAd);
7399 dumPs, dumPd, (
Aseff), dumAd);
7406 dumPs, dumPd, dumAs, (
Adeff));
7435 UserWarning(*
this) <<
"Source conductance reset to 1.0e3 mho";
7468 UserWarning(*
this) <<
"Drain conductance reset to 1.0e3 mho";
7481 SourceSatCurrent = 1.0e-14;
7491 if (SourceSatCurrent > 0.0)
7531 UserWarning(*
this) <<
"ijthsrev too small and set to 10 times IsbSat";
7537 IVjsmRev = SourceSatCurrent * (1.0 + T1);
7538 SslpRev = -SourceSatCurrent * T1 / Nvtms;
7548 DrainSatCurrent = 1.0e-14;
7558 if (DrainSatCurrent > 0.0)
7594 UserWarning(*
this) <<
"ijthdrev too small and set to 10 times IdbSat";
7600 IVjdmRev = DrainSatCurrent * (1.0 + T1);
7601 DslpRev = -DrainSatCurrent * T1 / Nvtmd;
7609 T0 = (TRatio - 1.0);
7649 && (vddeot > tmp2) && (
T0!=0))
7654 T4 = sqrt(1.0 + 2.0 * T8 / T1);
7655 T2 = 2.0 * T8 / (T4 + 1.0);
7656 T3 = 0.5 * T2 * T2 / T1;
7657 T7 = 1.12 - T3 - 0.05;
7658 T6 = sqrt(T7 * T7 + 0.224);
7659 T5 = 1.12 - 0.5 * (T7 + T6);
7660 Vgs_eff = vddeot - T5;
7701 - Delt_vth - T2 +
paramPtr->
k3 * Vth_NarrowW + T1;
7713 T0 = 1.0 / (3.0 + 8.0 * tmp3);
7714 n = (1.0 + 3.0 * tmp3) *
T0;
7727 Vgsteff = Vgs_eff-Vth;
7734 tmp2 = 2.0e8 * toxpf;
7740 }
while ((niter<=4)&&(fabs(toxpf-toxpi)>1e-12));
7746 if (checkModel(model, here, ckt))
7747 { IFuid namarray[2];
7748 namarray[0] =
model_.name;
7750 (*(SPfrontEnd->IFerror)) (ERR_FATAL,
"Fatal error(s) detected during .5.0 parameter checking for %s in model %s", namarray);
7772 bool bsuccess =
true;
7775 double dgstot_dvd(0.0), dgstot_dvg(0.0), dgstot_dvs(0.0), dgstot_dvb(0.0);
7776 double dgdtot_dvd(0.0), dgdtot_dvg(0.0), dgdtot_dvs(0.0), dgdtot_dvb(0.0);
7777 double Rs(0.0), Rd(0.0);
7778 double dRs_dvg(0.0), dRd_dvg(0.0), dRs_dvb(0.0), dRd_dvb(0.0);
7779 double dT0_dvg(0.0), dT1_dvb(0.0), dT3_dvg(0.0), dT3_dvb(0.0);
7781 double vgd_old(0.0), vsbd_old(0.0), vsbd(0.0);
7782 double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
7783 double VgstNVt(0.0), ExpVgst(0.0);
7784 double czbd(0.0), czbdsw(0.0), czbdswg(0.0),
7785 czbs(0.0), czbssw(0.0), czbsswg(0.0);
7786 double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
7787 double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
7788 double MJD(0.0), MJSWD(0.0), MJSWGD(0.0);
7789 double MJS(0.0), MJSWS(0.0), MJSWGS(0.0);
7790 double Ggidld(0.0), Ggidlg(0.0), Ggidlb(0.0);
7791 double Voxacc(0.0), dVoxacc_dVg(0.0), dVoxacc_dVb(0.0);
7792 double Voxdepinv(0.0);
7793 double dVoxdepinv_dVg(0.0), dVoxdepinv_dVd(0.0), dVoxdepinv_dVb(0.0);
7794 double VxNVt(0.0), ExpVxNVt(0.0);
7795 double Vaux(0.0), dVaux_dVg(0.0), dVaux_dVd(0.0), dVaux_dVb(0.0);
7796 double Igc(0.0), dIgc_dVg(0.0), dIgc_dVd(0.0), dIgc_dVb(0.0);
7797 double dIgcs_dVg(0.0), dIgcs_dVd(0.0), dIgcs_dVb(0.0);
7798 double dIgcd_dVg(0.0), dIgcd_dVd(0.0), dIgcd_dVb(0.0);
7799 double dIgs_dVg(0.0), dIgs_dVs(0.0), dIgd_dVg(0.0), dIgd_dVd(0.0);
7800 double Igbacc(0.0), dIgbacc_dVg(0.0);
7801 double dIgbacc_dVb(0.0);
7802 double Igbinv(0.0), dIgbinv_dVg(0.0), dIgbinv_dVd(0.0), dIgbinv_dVb(0.0);
7803 double Pigcd(0.0), dPigcd_dVg(0.0), dPigcd_dVd(0.0), dPigcd_dVb(0.0);
7805 double Vgs_eff(0.0), Vfb(0.0);
7806 double Vth_NarrowW(0.0);
7807 double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
7808 double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
7809 double Vgst(0.0), dVgst_dVg(0.0), dVgst_dVb(0.0), dVgs_eff_dVg(0.0);
7810 double Nvtms(0.0), Nvtmd(0.0);
7811 double Vtm(0.0), Vtm0(0.0);
7812 double n(0.0), dn_dVb(0.0), dn_dVd(0.0), voffcv (0.0);
7813 double noff(0.0), dnoff_dVd(0.0), dnoff_dVb(0.0);
7814 double CoxWLcen(0.0), QovCox(0.0), LINK(0.0), V0(0.0);
7815 double DeltaPhi(0.0), dDeltaPhi_dVg(0.0), VgDP(0.0), dVgDP_dVg(0.0);
7816 double Cox(0.0), Tox(0.0);
7817 double Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
7819 double Coxeff(0.0), dCoxeff_dVd(0.0), dCoxeff_dVg(0.0), dCoxeff_dVb(0.0);
7820 double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
7821 double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
7824 double dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
7825 double dVdsat_dVg(0.0), dVdsat_dVb(0.0);
7826 double dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
7827 double dVasat_dVg(0.0), dVasat_dVb(0.0);
7828 double dVasat_dVd(0.0), Va(0.0), dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
7829 double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
7830 double Arg1(0.0), One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
7832 double T0,dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
7833 double T1,dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
7835 double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
7836 double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
7837 double T4(0.0), dT4_dVd(0.0), dT4_dVb(0.0);
7838 double T5(0.0), dT5_dVg(0.0), dT5_dVd(0.0), dT5_dVb(0.0);
7839 double T6(0.0), dT6_dVg(0.0), dT6_dVd(0.0), dT6_dVb(0.0);
7840 double T7(0.0), dT7_dVg(0.0), dT7_dVd(0.0), dT7_dVb(0.0);
7841 double T8(0.0), dT8_dVg(0.0), dT8_dVd(0.0), dT8_dVb(0.0);
7842 double T9(0.0), dT9_dVg(0.0), dT9_dVd(0.0), dT9_dVb(0.0);
7843 double T10(0.0), dT10_dVg(0.0), dT10_dVb(0.0), dT10_dVd(0.0);
7844 double T11(0.0), T12(0.0), T13(0.0), T14(0.0);
7846 double dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
7847 double Cclm(0.0), dCclm_dVg(0.0), dCclm_dVd(0.0), dCclm_dVb(0.0);
7848 double FP(0.0), dFP_dVg(0.0);
7849 double PvagTerm(0.0), dPvagTerm_dVg(0.0);
7850 double dPvagTerm_dVd(0.0), dPvagTerm_dVb(0.0);
7851 double VADITS(0.0), dVADITS_dVg(0.0), dVADITS_dVd(0.0);
7853 double dDITS_Sft_dVb(0.0), dDITS_Sft_dVd(0.0);
7854 double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
7855 double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
7856 double Xdep(0.0), dXdep_dVb(0.0);
7857 double lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
7858 double Delt_vth(0.0), dDelt_vth_dVb(0.0);
7859 double Theta0(0.0), dTheta0_dVb(0.0);
7861 double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
7862 double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
7863 double Lambda(0.0), dLambda_dVg(0.0);
7866 double dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
7867 double dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
7868 double VdseffCV(0.0),
7869 dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
7870 double diffVds(0.0);
7871 double dAbulk_dVg(0.0);
7872 double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
7873 double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
7874 double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
7875 double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
7876 double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
7877 double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
7878 double Ids(0.0), Gmb(0.0);
7879 double devbs_dvb(0.0), devbd_dvb(0.0);
7880 double Isub(0.0), Gbd(0.0), Gbg(0.0), Gbb(0.0), Gds(0.0);
7881 double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
7882 double CoxeffWovL(0.0);
7883 double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
7884 double Vgst2Vtm(0.0), VdsatCV(0.0);
7885 double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
7886 double AbulkCV(0.0), dAbulkCV_dVb(0.0);
7888 double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
7889 double Qac0(0.0), Qsub0(0.0);
7890 double dQac0_dVg(0.0), dQac0_dVb(0.0);
7891 double dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
7892 double Ggislg(0.0), Ggislb(0.0), Ggisls(0.0);
7893 double Nvtmrss(0.0), Nvtmrssws(0.0), Nvtmrsswgs(0.0);
7894 double Nvtmrsd(0.0), Nvtmrsswd(0.0), Nvtmrsswgd(0.0);
7896 double vs(0.0), Fsevl(0.0);
7897 double dvs_dVg(0.0), dvs_dVd(0.0), dvs_dVb(0.0), dFsevl_dVg(0.0);
7898 double dFsevl_dVd(0.0), dFsevl_dVb(0.0);
7899 double vgdx(0.0), vgsx(0.0),epssub(0.0),toxe(0.0),epsrox(0.0);
7900 double von_local(0.0);
7916 #ifdef Xyce_DEBUG_DEVICE
7919 Xyce::dout() << subsection_divider << std::endl;
7920 Xyce::dout() <<
" Instance::updateIntermediateVars\n";
7921 Xyce::dout() <<
" name = " <<
getName();
7923 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
7924 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
7925 Xyce::dout() <<
" " << std::endl;
8083 if ((*flagSolVectorPtr)[
li_Drain] == 0 ||
8086 (*flagSolVectorPtr)[
li_Body] == 0 ||
8194 #ifdef Xyce_DEBUG_DEVICE
8197 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8198 Xyce::dout() <<
" von_local = " << von_local << std::endl;
8199 Xyce::dout() <<
" CONSTvt0 = " <<
CONSTvt0 << std::endl;
8200 Xyce::dout() <<
" vcrit = " <<
model_.
vcrit << std::endl;
8201 Xyce::dout().width(3);
8203 Xyce::dout().width(5);Xyce::dout() <<
getName();
8204 Xyce::dout() <<
" old :";
8205 Xyce::dout()<<
" vgs:";
8207 Xyce::dout()<<
" vds:";
8209 Xyce::dout()<<
" vbs:";
8211 Xyce::dout()<<
" vbd:";
8213 Xyce::dout()<<
" vges:";
8215 Xyce::dout()<<
" vgms:";
8217 Xyce::dout()<<
" vged:";
8219 Xyce::dout()<<
" vgmd:";
8220 Xyce::dout() <<
vgmd_old << std::endl;
8221 Xyce::dout().width(3);
8223 Xyce::dout().width(5);Xyce::dout() <<
getName();
8224 Xyce::dout() <<
" Blim:";
8225 Xyce::dout()<<
" vgs:";
8226 Xyce::dout() <<
vgs;
8227 Xyce::dout()<<
" vds:";
8228 Xyce::dout() <<
vds;
8229 Xyce::dout()<<
" vbs:";
8230 Xyce::dout() <<
vbs;
8231 Xyce::dout()<<
" vbd:";
8232 Xyce::dout() <<
vbd;
8233 Xyce::dout()<<
" vges:";
8234 Xyce::dout() <<
vges;
8235 Xyce::dout()<<
" vgms:";
8236 Xyce::dout() <<
vgms;
8237 Xyce::dout()<<
" vged:";
8238 Xyce::dout() <<
vged;
8239 Xyce::dout()<<
" vgmd:";
8240 Xyce::dout() <<
vgmd << std::endl;
8241 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8313 if ((Check1 != 0) || (Check2 != 0))
8333 if ((Check1 != 0) || (Check2 != 0))
8341 #if 0 // relying on check doesn't work.
8350 double machprec= N_UTL_MachineDependentParams::MachinePrecision();
8363 fabs(
vbs_orig - vbs) > machprec ||
8365 fabs(
vds_orig - vds) > machprec ||
8413 #ifdef Xyce_DEBUG_DEVICE
8418 Xyce::dout().width(3);
8420 Xyce::dout().width(5);Xyce::dout() <<
getName();
8421 Xyce::dout() <<
" Alim:";
8422 Xyce::dout()<<
" vgs:";
8424 Xyce::dout()<<
" vds:";
8425 Xyce::dout() << vds <<
"(diff="<<vds-
vds_orig<<
")";
8426 Xyce::dout()<<
" vbs:";
8427 Xyce::dout() << vbs<<
"(diff="<<vbs-
vbs_orig<<
")";
8428 Xyce::dout()<<
" vbd:";
8430 Xyce::dout()<<
" vges:";
8432 Xyce::dout()<<
" vgms:";
8434 Xyce::dout()<<
" vged:";
8436 Xyce::dout()<<
" vgmd:";
8438 Xyce::dout()<<
" vbs_jct:";
8440 Xyce::dout()<<
" vbd_jct:";
8442 if (
origFlag) Xyce::dout() <<
" SAME";
8443 else Xyce::dout() <<
" DIFF";
8444 Xyce::dout() << std::endl;
8445 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8454 SourceSatCurrent = 1.0e-14;
8464 if (SourceSatCurrent <= 0.0)
8493 cbs = SourceSatCurrent * (evbs - 1.0)
8516 devbs_dvb = evbs / Nvtms;
8535 devbs_dvb = evbs / Nvtms;
8551 cbs = SourceSatCurrent * (evbs +
XExpBVS - 1.0
8569 DrainSatCurrent = 1.0e-14;
8579 if (DrainSatCurrent <= 0.0)
8608 cbd = DrainSatCurrent * (evbd - 1.0)
8631 devbd_dvb = evbd / Nvtmd;
8650 devbd_dvb = evbd / Nvtmd;
8666 cbd = DrainSatCurrent * (evbd +
XExpBVD - 1.0
8691 T0 = -
vbs_jct / Nvtmrss * T9;
8693 dT1_dVb = T10 / Nvtmrss * T9;
8701 dT1_dVb = T10 * dT0_dVb;
8709 dT2_dVb = T10 / Nvtmrsd * T9;
8717 dT2_dVb = T10 * dT0_dVb;
8723 T0 = -
vbs_jct / Nvtmrssws * T9;
8725 dT3_dVb = T10 / Nvtmrssws * T9;
8733 dT3_dVb = T10 * dT0_dVb;
8739 T0 = -
vbd_jct / Nvtmrsswd * T9;
8741 dT4_dVb = T10 / Nvtmrsswd * T9;
8749 dT4_dVb = T10 * dT0_dVb;
8755 T0 = -
vbs_jct / Nvtmrsswgs * T9;
8757 dT5_dVb = T10 / Nvtmrsswgs * T9;
8765 dT5_dVb = T10 * dT0_dVb;
8771 T0 = -
vbd_jct / Nvtmrsswgd * T9;
8773 dT6_dVb = T10 / Nvtmrsswgd * T9;
8781 dT6_dVb = T10 * dT0_dVb;
8835 #ifdef Xyce_DEBUG_DEVICE
8838 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
8840 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " <<
Vds << std::endl;
8841 Xyce::dout() <<
"HOMOTOPY INFO: before vgst = " <<
Vgs << std::endl;
8865 #ifdef Xyce_DEBUG_DEVICE
8868 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " <<
Vds << std::endl;
8869 Xyce::dout() <<
"HOMOTOPY INFO: after vgst = " <<
Vgs << std::endl;
8876 T1 = sqrt(T0 * T0 - 0.004 *
vbsc);
8879 Vbseff =
vbsc + 0.5 * (T0 + T1);
8880 dVbseff_dVb = 0.5 * (1.0 + T0 / T1);
8884 T2 = -0.002 / (T1 -
T0);
8885 Vbseff =
vbsc * (1.0 + T2);
8886 dVbseff_dVb = T2 *
vbsc / T1;
8891 T0 = T9 - Vbseff - 0.001;
8892 T1 = sqrt(T0 * T0 + 0.004 * T9);
8893 Vbseff = T9 - 0.5 * (T0 + T1);
8894 dVbseff_dVb *= 0.5 * (1.0 + T0 / T1);
8898 sqrtPhis = sqrt(Phis);
8899 dsqrtPhis_dVb = -0.5 / sqrtPhis;
8920 T4 = 1.0 / (3.0 + 8.0 *
T0);
8921 T1 = (1.0 + 3.0 *
T0) * T4;
8925 dlt1_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8935 T4 = 1.0 / (3.0 + 8.0 *
T0);
8936 T1 = (1.0 + 3.0 *
T0) * T4;
8940 dltw_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8950 dT1_dVb = -T0 * T1 * dlt1_dVb / lt1;
8951 dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 +
CONSTMIN_EXP)) / T4 / T4;
8970 dT1_dVb = -T0 * T1 * dltw_dVb / ltw;
8971 dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 +
CONSTMIN_EXP)) / T4 / T4;
8994 T9 = 1.0 / (3.0 - 2.0e4 * T3);
8995 T3 = (2.0e-4 - T3) * T9;
9003 DIBL_Sft = dDIBL_Sft_dVd *
Vds;
9010 +
paramPtr->
k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft;
9013 - dDelt_vth_dVb - dT2_dVb +
paramPtr->
k3b * Vth_NarrowW
9016 dVth_dVd = -dDIBL_Sft_dVd;
9020 tmp1 = epssub / Xdep;
9029 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9035 T0 = 1.0 / (3.0 + 8.0 * tmp4);
9036 n = (1.0 + 3.0 * tmp4) * T0;
9038 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9063 T4 = Vtm * log(Leff / T3);
9064 dT4_dVd = -Vtm * dT3_dVd / T3;
9071 dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd;
9072 dDITS_Sft_dVb = T4 * dn_dVb;
9075 dVth_dVd -= dDITS_Sft_dVd;
9076 dVth_dVb -= dDITS_Sft_dVb;
9108 Vgst = Vgs_eff - Vth;
9125 dT10_dVd = T10 * dn_dVd;
9126 dT10_dVb = T10 * dn_dVb;
9132 T3 = Vtm * log(1.0 + ExpVgst);
9135 dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
9136 dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
9137 dT10_dVg *= dVgs_eff_dVg;
9148 dT9_dVd = dn_dVd * T3;
9149 dT9_dVb = dn_dVb * T3;
9156 dT9_dVd = dn_dVd * T3;
9157 dT9_dVb = dn_dVb * T3;
9167 dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
9168 dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
9169 dT9_dVg *= dVgs_eff_dVg;
9174 dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
9175 dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
9176 dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
9187 T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9188 Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9196 Rds = dRds_dVg = dRds_dVb = 0.0;
9206 T3 = T2 + sqrt(T2 * T2 + 0.01);
9207 dT3_dVg = 1.0 + T2 / (T3 - T2);
9208 dT3_dVb = dT3_dVg * dT1_dVb;
9213 dRds_dVg = T4 * dT3_dVg;
9214 dRds_dVb = T4 * dT3_dVb;
9229 dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb;
9232 tmp1 = Leff + 2.0 * T9;
9238 dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
9242 Abulk0 = 1.0 + T1 * T2;
9243 dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
9246 dAbulk_dVg = -T1 * T8;
9248 dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
9252 T9 = 1.0 / (3.0 - 20.0 * Abulk0);
9253 Abulk0 = (0.2 - Abulk0) * T9;
9254 dAbulk0_dVb *= T9 * T9;
9259 T9 = 1.0 / (3.0 - 20.0 *
Abulk);
9270 T0 = 1.0 / (1.0 + T2);
9275 T1 = 1.0 / (0.8 + T2);
9276 T0 = (17.0 + 20.0 * T2) * T1;
9281 dAbulk_dVb = dAbulk_dVb * T0 +
Abulk * dT0_dVb;
9282 dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
9293 { T0 = Vgsteff + Vth + Vth - T14;
9296 T12 = sqrt(Vth * Vth + 0.0001);
9297 T9 = 1.0/(Vgsteff + 2*T12);
9302 T7 = - 2.0 * T6 * T9;
9304 dDenomi_dVg = (T2 + 2.0 *
paramPtr->
ub * T3) / toxe;
9305 T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9306 dDenomi_dVd = T13 * dVth_dVd;
9307 dDenomi_dVb = T13 * dVth_dVb +
paramPtr->
uc * T3;
9311 { T0 = Vgsteff + Vth + Vth - T14;
9315 T12 = sqrt(Vth * Vth + 0.0001);
9316 T9 = 1.0/(Vgsteff + 2*T12);
9321 T7 = - 2.0 * T6 * T9;
9324 T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9325 dDenomi_dVd = T13 * dVth_dVd;
9326 dDenomi_dVb = T13 * dVth_dVb +
paramPtr->
uc * T4;
9330 { T0 = (Vgsteff +
vtfbphi1) / toxe;
9335 T12 = sqrt(Vth * Vth + 0.0001);
9336 T9 = 1.0/(Vgsteff + 2*T12);
9341 T7 = - 2.0 * T6 * T9;
9343 dDenomi_dVg = T2 * dT1_dVg + T7;
9344 T13 = 2.0 * (T11 + T8);
9345 dDenomi_dVd = T13 * dVth_dVd;
9346 dDenomi_dVb = T13 * dVth_dVb + T1 *
paramPtr->
uc;
9355 T9 = 1.0 / (7.0 + 10.0 * T5);
9356 Denomi = (0.6 + T5) * T9;
9364 T9 = -
ueff / Denomi;
9365 dueff_dVg = T9 * dDenomi_dVg;
9366 dueff_dVd = T9 * dDenomi_dVd;
9367 dueff_dVb = T9 * dDenomi_dVb;
9371 WVCoxRds = WVCox * Rds;
9376 dEsatL_dVg = T0 * dueff_dVg;
9377 dEsatL_dVd = T0 * dueff_dVd;
9378 dEsatL_dVb = T0 * dueff_dVb;
9391 T2 = sqrt(T1 * T1 + 0.0004 * T0);
9392 Lambda =
paramPtr->
a2 + T0 - 0.5 * (T1 + T2);
9393 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
9399 Lambda = 0.5 * (T1 + T2);
9400 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
9403 Vgst2Vtm = Vgsteff + 2.0 * Vtm;
9406 tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9407 tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9411 tmp2 = dWeff_dVg / Weff;
9412 tmp3 = dWeff_dVb / Weff;
9414 if ((Rds == 0.0) && (Lambda == 1.0))
9420 T3 =
EsatL * Vgst2Vtm;
9423 dT0_dVg = -(
Abulk * dEsatL_dVg +
EsatL * dAbulk_dVg + 1.0) * T1;
9424 dT0_dVd = -(
Abulk * dEsatL_dVd) * T1;
9425 dT0_dVb = -(
Abulk * dEsatL_dVb + dAbulk_dVb *
EsatL) * T1;
9427 dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg +
EsatL *
T0;
9428 dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9429 dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9433 tmp1 = dLambda_dVg / (Lambda * Lambda);
9434 T9 =
Abulk * WVCoxRds;
9437 T6 = Vgst2Vtm * WVCoxRds;
9438 T0 = 2.0 *
Abulk * (T9 - 1.0 + 1.0 / Lambda);
9439 dT0_dVg = 2.0 * (T8 * tmp2 -
Abulk * tmp1
9440 + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9442 dT0_dVb = 2.0 * (T8 * (2.0 /
Abulk * dAbulk_dVb + tmp3)
9443 + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9445 T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) +
Abulk *
EsatL + 3.0 * T7;
9447 dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9448 +
Abulk * dEsatL_dVg +
EsatL * dAbulk_dVg + 3.0 * (T9
9449 + T7 * tmp2 + T6 * dAbulk_dVg);
9450 dT1_dVb =
Abulk * dEsatL_dVb +
EsatL * dAbulk_dVb
9451 + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9452 dT1_dVd =
Abulk * dEsatL_dVd;
9454 T2 = Vgst2Vtm * (
EsatL + 2.0 * T6);
9455 dT2_dVg =
EsatL + Vgst2Vtm * dEsatL_dVg
9456 + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9457 dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9458 dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9460 T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9461 Vdsat = (T1 - T3) / T0;
9463 dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg))
9465 dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd))
9467 dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb))
9470 dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9471 - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) /
T0;
9472 dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9473 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) /
T0;
9474 dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) /
T0;
9480 dT1_dVg = dVdsat_dVg;
9481 dT1_dVd = dVdsat_dVd - 1.0;
9482 dT1_dVb = dVdsat_dVb;
9488 dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9489 dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9490 dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9494 Vdseff = Vdsat - 0.5 * (T1 + T2);
9495 dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9496 dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9497 dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9501 T4 = T9 / (T2 - T1);
9503 T6 = Vdsat * T4 / (T2 - T1);
9505 dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg);
9506 dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd);
9507 dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb);
9530 T3 = -T2 / T1 * Leff;
9531 dT2_dVd = T3 * dueff_dVd;
9532 dT2_dVg = T3 * dueff_dVg;
9533 dT2_dVb = T3 * dueff_dVb;
9536 dT5_dVg = dEsatL_dVg * T4;
9537 dT5_dVd = dEsatL_dVd * T4;
9538 dT5_dVb = dEsatL_dVb * T4;
9539 T6 = 1.0 + diffVds * T5;
9540 dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5;
9541 dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5;
9542 dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5;
9543 T7 = 2.0 / (T6 * T6 + 1.0);
9546 dT8_dVg = T9 * dT6_dVg;
9547 dT8_dVd = T9 * dT6_dVd;
9548 dT8_dVb = T9 * dT6_dVb;
9549 T10 = 1.0 + T2 * T8;
9550 dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg;
9551 dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd;
9552 dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb;
9555 dT10_dVg = dT10_dVd = dT10_dVb = 0.0;
9559 dEsatL_dVg +=
EsatL * dT10_dVg;
9561 dEsatL_dVd +=
EsatL * dT10_dVd;
9563 dEsatL_dVb +=
EsatL * dT10_dVb;
9569 tmp4 = 1.0 - 0.5 *
Abulk * Vdsat / Vgst2Vtm;
9572 T0 =
EsatL + Vdsat + 2.0 * T9 * tmp4;
9574 T7 = 2.0 * WVCoxRds * tmp4;
9575 dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 *
Vgsteff)
9576 - T8 * (
Abulk * dVdsat_dVg -
Abulk * Vdsat / Vgst2Vtm
9577 + Vdsat * dAbulk_dVg);
9579 dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
9580 - T8 * (dAbulk_dVb * Vdsat +
Abulk * dVdsat_dVb);
9581 dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 *
Abulk * dVdsat_dVd;
9583 T9 = WVCoxRds *
Abulk;
9584 T1 = 2.0 / Lambda - 1.0 + T9;
9585 dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
9586 dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9589 dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9590 dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9591 dVasat_dVd = dT0_dVd / T1;
9596 dT0_dVg = 1.0 / tmp2;
9597 T0 = (Vgsteff + tmp1) * dT0_dVg;
9603 dTcen_dVg = -Tcen * T2 * dT0_dVg / T1;
9606 dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub;
9608 CoxeffWovL = Coxeff * Weff / Leff;
9609 beta =
ueff * CoxeffWovL;
9611 dbeta_dVg = CoxeffWovL * dueff_dVg + T3
9612 * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg);
9613 dbeta_dVd = CoxeffWovL * dueff_dVd;
9614 dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb;
9618 dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
9619 - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
9620 dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
9621 dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb *
Vdseff) / Vgst2Vtm;
9623 fgche1 = Vgsteff *
T0;
9624 dfgche1_dVg = Vgsteff * dT0_dVg +
T0;
9625 dfgche1_dVd = Vgsteff * dT0_dVd;
9626 dfgche1_dVb = Vgsteff * dT0_dVb;
9628 T9 = Vdseff /
EsatL;
9630 dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) /
EsatL;
9631 dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) /
EsatL;
9632 dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) /
EsatL;
9634 gche = beta * fgche1 / fgche2;
9635 dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
9636 - gche * dfgche2_dVg) / fgche2;
9637 dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
9638 - gche * dfgche2_dVd) / fgche2;
9639 dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
9640 - gche * dfgche2_dVb) / fgche2;
9642 T0 = 1.0 + gche * Rds;
9644 T1 = (1.0 - Idl * Rds) / T0;
9646 dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg;
9647 dIdl_dVd = T1 * dgche_dVd;
9648 dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb;
9659 FP = 1.0 / (1.0 + T9);
9660 dFP_dVg = FP * FP * T9 / Vgst2Vtm;
9668 PvagTerm = 1.0 + T9;
9669 dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg /
EsatL);
9670 dPvagTerm_dVb = -T9 * dEsatL_dVb /
EsatL;
9671 dPvagTerm_dVd = -T9 * dEsatL_dVd /
EsatL;
9675 T4 = 1.0 / (17.0 + 20.0 * T9);
9676 PvagTerm = (0.8 + T9) * T4;
9678 dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg /
EsatL) * T4;
9680 dPvagTerm_dVb = -T9 * dEsatL_dVb;
9681 dPvagTerm_dVd = -T9 * dEsatL_dVd;
9686 T0 = 1.0 + Rds * Idl;
9687 dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg;
9688 dT0_dVd = Rds * dIdl_dVd;
9689 dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb;
9693 dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat;
9694 dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat;
9695 dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat;
9698 dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm
9699 + dT0_dVg / T0 + dT1_dVg / T1);
9700 dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0
9702 dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0
9704 VACLM = Cclm * diffVds;
9706 dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm;
9707 dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm;
9708 dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm;
9713 dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
9714 dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0;
9722 dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
9723 + Vgst2Vtm * Vdsat * dAbulk_dVg;
9724 dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9725 dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
9728 dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
9729 dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
9730 dT1_dVd = Abulk * dVdsat_dVd;
9734 VADIBL = (Vgst2Vtm - T0 / T1) / T2;
9735 dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
9736 dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
9737 dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
9742 T3 = 1.0 / (1.0 + T7);
9750 T4 = 1.0 / (0.8 + T7);
9751 T3 = (17.0 + 20.0 * T7) * T4;
9753 dVADIBL_dVb = dVADIBL_dVb * T3
9759 dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg;
9760 dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb;
9761 dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd;
9767 dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
9772 dVa_dVg = dVasat_dVg + dVACLM_dVg;
9773 dVa_dVb = dVasat_dVb + dVACLM_dVb;
9774 dVa_dVd = dVasat_dVd + dVACLM_dVd;
9793 dVADITS_dVg = VADITS * dFP_dVg;
9800 dVADITS_dVg = dVADITS_dVd = 0;
9810 T1 = T0 * VASCBE / diffVds;
9811 dVASCBE_dVg = T1 * dVdseff_dVg;
9812 dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
9813 dVASCBE_dVb = T1 * dVdseff_dVb;
9818 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9824 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9828 T9 = diffVds / VADIBL;
9831 dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL;
9832 dIdsa_dVd = T0 * dIdl_dVd + Idl
9833 * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL;
9834 dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL;
9837 T9 = diffVds / VADITS;
9839 dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS;
9840 dIdsa_dVd = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS;
9841 dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS;
9845 T0 = log(Va / Vasat);
9846 dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat;
9847 dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat;
9848 dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat;
9851 dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm;
9852 dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm;
9853 dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm;
9855 dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg;
9856 dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb;
9857 dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd;
9864 Isub = Gbd = Gbb = Gbg = 0.0;
9872 T1 = T2 * diffVds * exp(T0);
9873 T3 = T1 / diffVds * (T0 - 1.0);
9874 dT1_dVg = T3 * dVdseff_dVg;
9875 dT1_dVd = T3 * (dVdseff_dVd - 1.0);
9876 dT1_dVb = T3 * dVdseff_dVb;
9882 dT1_dVg = -T3 * dVdseff_dVg;
9883 dT1_dVd = T3 * (1.0 - dVdseff_dVd);
9884 dT1_dVb = -T3 * dVdseff_dVb;
9888 Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg)
9890 Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd)
9892 Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb)
9895 Gbd += Gbg * dVgsteff_dVd;
9896 Gbb += Gbg * dVgsteff_dVb;
9897 Gbg *= dVgsteff_dVg;
9906 T9 = diffVds / VASCBE;
9910 Gm = T0 * dIdsa_dVg - Idsa
9911 * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
9912 Gds = T0 * dIdsa_dVd + Idsa
9913 * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE;
9914 Gmb = T0 * dIdsa_dVb - Idsa
9915 * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE;
9918 tmp1 = Gds +
Gm * dVgsteff_dVd;
9919 tmp2 = Gmb +
Gm * dVgsteff_dVb;
9922 Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg;
9923 Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd)
9925 Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb)
9926 + Vdseff * tmp2) * dVbseff_dVb;
9933 T12 = 1.0 / Leff / CoxeffWovL;
9937 dvs_dVg =
Gm * T11 +
cdrain * T10 * dVgsteff_dVg;
9938 dvs_dVd = Gds * T11 +
cdrain * T10 * dVgsteff_dVd;
9939 dvs_dVb = Gmb * T11 +
cdrain * T10 * dVgsteff_dVb;
9945 T2 = 1.0 + exp(T0 * log(T1));
9946 T3 = (T2 - 1.0) * T0 / vs;
9947 Fsevl = 1.0 / exp(log(T2)/ T0);
9948 dT2_dVg = T3 * dvs_dVg;
9949 dT2_dVd = T3 * dvs_dVd;
9950 dT2_dVb = T3 * dvs_dVb;
9951 T4 = -1.0 / T0 * Fsevl / T2;
9952 dFsevl_dVg = T4 * dT2_dVg;
9953 dFsevl_dVd = T4 * dT2_dVd;
9954 dFsevl_dVb = T4 * dT2_dVb;
9966 Gmb +=
cdrain * dFsevl_dVb;
9968 Gds +=
cdrain * dFsevl_dVd;
9984 dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
9985 dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
9986 dT0_dVg = dbeta_dVg * T9;
10006 T11 = grgeltd +
gcrg;
10007 gcrg = grgeltd * gcrg / T11;
10008 T12 = T10 / T11 / T11;
10020 T1 = sqrt(T0 * T0 + 1.0e-4);
10029 T2 = 1.0 / T0 + T1;
10030 T3 = T2 + sqrt(T2 * T2 + 0.01);
10031 dT3_dvg = T3 / (T3 - T2);
10032 dT3_dvb = dT3_dvg * dT1_dvb;
10033 dT3_dvg *= dT0_dvg;
10037 dRs_dvg = T4 * dT3_dvg;
10038 dRs_dvb = T4 * dT3_dvb;
10044 dgstot_dvg = T0 * dRs_dvg;
10045 dgstot_dvb = T0 * dRs_dvb;
10046 dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd);
10050 T1 = sqrt(T0 * T0 + 1.0e-4);
10059 T2 = 1.0 / T0 + T1;
10060 T3 = T2 + sqrt(T2 * T2 + 0.01);
10061 dT3_dvg = T3 / (T3 - T2);
10062 dT3_dvb = dT3_dvg * dT1_dvb;
10063 dT3_dvg *= dT0_dvg;
10067 dRd_dvg = T4 * dT3_dvg;
10068 dRd_dvb = T4 * dT3_dvb;
10074 dgdtot_dvg = T0 * dRd_dvg;
10075 dgdtot_dvb = T0 * dRd_dvb;
10076 dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs);
10084 gdtotd = T2 * dgdtot_dvd;
10085 gdtotg = T2 * dgdtot_dvg;
10086 gdtots = T2 * dgdtot_dvs;
10087 gdtotb = T2 * dgdtot_dvb;
10117 Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
10121 dT1_dVd = 1.0 /
T0;
10127 T3 =
Igidl * (1.0 + T2) / T1;
10128 Ggidld = T3 * dT1_dVd;
10129 Ggidlg = T3 * dT1_dVg;
10134 Ggidld =
Igidl * dT1_dVd;
10135 Ggidlg =
Igidl * dT1_dVg;
10144 Ggidld = Ggidld * T7 +
Igidl * T8;
10145 Ggidlg = Ggidlg * T7;
10146 Ggidlb = -
Igidl * T8;
10170 Igisl = Ggisls = Ggislg = Ggislb = 0.0;
10174 dT1_dVd = 1.0 /
T0;
10180 T3 =
Igisl * (1.0 + T2) / T1;
10181 Ggisls = T3 * dT1_dVd;
10182 Ggislg = T3 * dT1_dVg;
10187 Ggisls =
Igisl * dT1_dVd;
10188 Ggislg =
Igisl * dT1_dVg;
10197 Ggisls = Ggisls * T7 +
Igisl * T8;
10198 Ggislg = Ggislg * T7;
10199 Ggislb = -
Igisl * T8;
10214 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
10216 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
10217 T1 = 0.5 * (1.0 + V3 /
T0);
10218 Vfbeff = Vfb - 0.5 * (V3 +
T0);
10219 dVfbeff_dVg = T1 * dVgs_eff_dVg;
10222 Voxacc = Vfb - Vfbeff;
10223 dVoxacc_dVg = -dVfbeff_dVg;
10224 dVoxacc_dVb = -dVfbeff_dVb;
10227 Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10231 T3 = Vgs_eff - Vfbeff - Vbseff -
Vgsteff;
10234 Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb = 0.0;
10239 dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + dVgsteff_dVg;
10240 dVoxdepinv_dVd = dVgsteff_dVd;
10241 dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb;
10245 T1 = sqrt(T0 * T0 + T3);
10248 dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
10249 dVoxdepinv_dVd = -T2 * dVgsteff_dVd;
10250 dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb);
10254 dVoxdepinv_dVg += dVgsteff_dVg;
10255 dVoxdepinv_dVd += dVgsteff_dVd;
10256 dVoxdepinv_dVb += dVgsteff_dVb;
10277 dVaux_dVg = dVgs_eff_dVg;
10284 VxNVt = (Vgs_eff -
von) / T0;
10287 Vaux = Vgs_eff -
von;
10288 dVaux_dVg = dVgs_eff_dVg;
10289 dVaux_dVd = -dVth_dVd;
10290 dVaux_dVb = -dVth_dVb;
10297 dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10301 ExpVxNVt = exp(VxNVt);
10302 Vaux = T0 * log(1.0 + ExpVxNVt);
10303 dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10311 dVaux_dVd = -dVgs_eff_dVg * dVth_dVd;
10312 dVaux_dVb = -dVgs_eff_dVg * dVth_dVb;
10314 dVaux_dVg *= dVgs_eff_dVg;
10317 T2 = Vgs_eff * Vaux;
10318 dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10319 dT2_dVd = Vgs_eff * dVaux_dVd;
10320 dT2_dVb = Vgs_eff * dVaux_dVb;
10328 - T4 * Voxdepinv * Voxdepinv);
10333 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10338 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10343 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10344 dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10345 dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10346 dT6_dVg *= dVoxdepinv_dVg;
10349 Igc = T11 * T2 * T6;
10350 dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10351 dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10352 dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10357 dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
10362 T12 = Vgsteff + 1.0e-20;
10363 T13 = T11 / T12 / T12;
10365 Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
10366 dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
10367 - 3.0 * Vdseff / T12));
10368 dPigcd_dVd = 0.5 * T14 * dVdseff_dVd;
10369 dPigcd_dVb = 0.5 * T14 * dVdseff_dVb;
10373 dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg;
10374 dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd;
10375 dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb;
10376 dT7_dVg *= dVgsteff_dVg;
10377 dT7_dVb *= dVbseff_dVb;
10378 T8 = T7 * T7 + 2.0e-4;
10379 dT8_dVg = 2.0 * T7;
10380 dT8_dVd = dT8_dVg * dT7_dVd;
10381 dT8_dVb = dT8_dVg * dT7_dVb;
10382 dT8_dVg *= dT7_dVg;
10387 dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10392 dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10397 dT9_dVg = T9 * dT7_dVg;
10398 dT9_dVd = T9 * dT7_dVd;
10399 dT9_dVb = T9 * dT7_dVb;
10403 T1 = T9 - 1.0 + 1.0e-4;
10404 T10 = (T1 - T7) / T8;
10405 dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
10406 dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
10407 dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
10410 dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10411 dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10412 dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10414 T1 = T9 - 1.0 - 1.0e-4;
10415 T10 = (T7 * T9 - T1) / T8;
10416 dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
10417 - T10 * dT8_dVg) / T8;
10418 dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
10419 - T10 * dT8_dVd) / T8;
10420 dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
10421 - T10 * dT8_dVb) / T8;
10423 dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10424 dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10425 dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10430 gIgcsb = dIgcs_dVb * dVbseff_dVb;
10434 gIgcdb = dIgcd_dVb * dVbseff_dVb;
10437 vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10462 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 *
vgs_eff)
10465 Igs = T11 * T2 * T6;
10466 dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10467 dIgs_dVs = -dIgs_dVg;
10470 vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10496 Igd = T11 * T2 * T6;
10497 dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10498 dIgd_dVd = -dIgd_dVg;
10519 T1 = -Vgs_eff + Vbseff + Vfb;
10524 dVaux_dVg = -dVgs_eff_dVg;
10530 dVaux_dVg = dVaux_dVb = 0.0;
10534 ExpVxNVt = exp(VxNVt);
10535 Vaux = T0 * log(1.0 + ExpVxNVt);
10536 dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt);
10537 dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg;
10540 T2 = (Vgs_eff - Vbseff) * Vaux;
10541 dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10542 dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10546 T12 = -7.45669e11 * toxe;
10551 - T4 * Voxacc * Voxacc);
10556 dT6_dVg = dT6_dVb = 0.0;
10561 dT6_dVg = dT6_dVb = 0.0;
10566 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc);
10567 dT6_dVb = dT6_dVg * dVoxacc_dVb;
10568 dT6_dVg *= dVoxacc_dVg;
10571 Igbacc = T11 * T2 * T6;
10572 dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10573 dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10582 dVaux_dVg = dVoxdepinv_dVg;
10583 dVaux_dVd = dVoxdepinv_dVd;
10584 dVaux_dVb = dVoxdepinv_dVb;
10589 dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10593 ExpVxNVt = exp(VxNVt);
10594 Vaux = T0 * log(1.0 + ExpVxNVt);
10595 dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10596 dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd;
10597 dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb;
10598 dVaux_dVg *= dVoxdepinv_dVg;
10601 T2 = (Vgs_eff - Vbseff) * Vaux;
10602 dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10603 dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd;
10604 dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10612 - T4 * Voxdepinv * Voxdepinv);
10617 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10622 dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10627 dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10628 dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10629 dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10630 dT6_dVg *= dVoxdepinv_dVg;
10633 Igbinv = T11 * T2 * T6;
10634 dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10635 dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10636 dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10638 Igb = Igbinv + Igbacc;
10639 gIgbg = dIgbinv_dVg + dIgbacc_dVg;
10640 gIgbd = dIgbinv_dVd;
10641 gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb;
10703 Vdsat = Vgsteff /
Abulk;
10705 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * Vdsat);
10708 Vdseff = Vdsat - 0.5 * (T0 + T1);
10714 T5 = Vdsat * T3 / (T1 -
T0);
10715 Vdseff = Vdsat * T4;
10723 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
10728 * (Vgsteff - 0.5 * T0 + Abulk * T3);
10754 dVbseff_dVb = -dPhis_dVb;
10759 Vgst = Vgs_eff - Vth;
10761 dVgst_dVb = -dVth_dVb;
10762 dVgst_dVg = dVgs_eff_dVg;
10765 Arg1 = Vgs_eff - Vbseff - Vfb;
10775 cgsb =
CoxWL * (dVbseff_dVb - dVgs_eff_dVg);
10785 else if (Vgst <= 0.0)
10788 T2 = sqrt(T1 * T1 + Arg1);
10793 T0 =
CoxWL * T1 / T2;
10794 cggb = T0 * dVgs_eff_dVg;
10796 cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg);
10808 One_Third_CoxWL =
CoxWL / 3.0;
10809 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
10813 Vdsat = Vgst / AbulkCV;
10814 dVdsat_dVg = dVgs_eff_dVg / AbulkCV;
10815 dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
10825 T2 = -Two_Third_CoxWL * Vgst;
10829 cggb = One_Third_CoxWL * (3.0
10830 - dVdsat_dVg) * dVgs_eff_dVg;
10831 T2 = -One_Third_CoxWL * dVdsat_dVb;
10840 - Two_Third_CoxWL * dVgs_eff_dVg);
10841 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10847 Alphaz = Vgst / Vdsat;
10848 T1 = 2.0 * Vdsat -
Vds;
10849 T2 = Vds / (3.0 * T1);
10853 T7 = 2.0 * Vds - T1 - 3.0 * T3;
10854 T8 = T3 - T1 - 2.0 *
Vds;
10864 T11 = -
CoxWL * T5 * dVdsat_dVb;
10868 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10869 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10872 T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
10873 cdgb = (T7 * dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg;
10874 T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
10875 cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
10878 T9 = 2.0 * T4 * (1.0 + T5);
10879 T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg)
10881 T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
10882 T12 = T4 * (2.0 * T2 + T5 - 1.0);
10883 T0 = -(T10 + T11 + T12);
10887 cbsb = -(cgsb + cdsb +
T0);
10896 T2 = -Two_Third_CoxWL * Vgst;
10900 cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg;
10901 T2 = -One_Third_CoxWL * dVdsat_dVb;
10905 T3 = 0.4 * Two_Third_CoxWL;
10906 cdgb = -T3 * dVgs_eff_dVg;
10908 T4 = T3 * dVth_dVb;
cdsb = -(T4 +
cdgb);
10910 cbgb = -(
cggb - Two_Third_CoxWL * dVgs_eff_dVg);
10911 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10917 Alphaz = Vgst / Vdsat;
10918 T1 = 2.0 * Vdsat -
Vds;
10919 T2 = Vds / (3.0 * T1);
10924 - 0.5 * (Vds - T3));
10929 tmp = -
CoxWL * T5 * dVdsat_dVb;
10935 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10936 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10938 T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds
10941 T7 = Vds - T1 - T8 * T6;
10945 tmp1 = T4 * (2.0 - 4.0 * tmp * T6
10946 + T8 * (16.0 * Vdsat - 6.0 *
Vds));
10948 cdgb = (T7 * dAlphaz_dVg - tmp1
10949 * dVdsat_dVg) * dVgs_eff_dVg;
10950 T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
10951 cddb = T4 * (2.0 - (1.0 / (3.0 * T1
10952 * T1) + 2.0 * tmp) * T6 + T8
10953 * (6.0 * Vdsat - 2.4 *
Vds));
10956 T7 = 2.0 * (T1 + T3);
10959 T0 = 4.0 * T4 * (1.0 - T5);
10960 T12 = (-T7 * dAlphaz_dVg -
cdgb
10961 - T0 * dVdsat_dVg) * dVgs_eff_dVg;
10962 T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
10963 T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) -
cddb;
10964 tmp = -(T10 + T11 + T12);
10978 T2 = -Two_Third_CoxWL * Vgst;
10982 cggb = One_Third_CoxWL * (3.0
10983 - dVdsat_dVg) * dVgs_eff_dVg;
10984 T2 = -One_Third_CoxWL * dVdsat_dVb;
10988 cdgb = -One_Third_CoxWL * dVgs_eff_dVg;
10990 T4 = One_Third_CoxWL * dVth_dVb;
10994 - Two_Third_CoxWL * dVgs_eff_dVg);
10995 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
11001 Alphaz = Vgst / Vdsat;
11002 T1 = 2.0 * Vdsat -
Vds;
11003 T2 = Vds / (3.0 * T1);
11008 - 0.5 * (Vds - T3));
11013 tmp = -
CoxWL * T5 * dVdsat_dVb;
11018 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
11019 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
11025 T0 = T4 * (2.0 * T5 - 2.0);
11027 cdgb = (T0 * dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg;
11028 T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
11029 cddb = T4 * (1.0 - 2.0 * T2 - T5);
11044 dVbseffCV_dVb = 1.0;
11049 dVbseffCV_dVb = -dPhis_dVb;
11063 VgstNVt = (Vgst - voffcv) / T0;
11067 Vgsteff = Vgst - voffcv;
11068 dVgsteff_dVg = dVgs_eff_dVg;
11069 dVgsteff_dVd = -dVth_dVd;
11070 dVgsteff_dVb = -dVth_dVb;
11075 dVgsteff_dVg = 0.0;
11076 dVgsteff_dVd = Vgsteff / noff;
11077 dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
11078 dVgsteff_dVd *= dnoff_dVd;
11082 ExpVgst = exp(VgstNVt);
11083 Vgsteff = T0 * log(1.0 + ExpVgst);
11084 dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
11085 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
11086 / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
11087 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
11088 / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
11089 dVgsteff_dVg *= dVgs_eff_dVg;
11109 dT10_dVd = T10 * dn_dVd;
11110 dT10_dVb = T10 * dn_dVb;
11116 T3 = Vtm * log(1.0 + ExpVgst);
11119 dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
11120 dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
11121 dT10_dVg *= dVgs_eff_dVg;
11131 dT9_dVd = dn_dVd * T3;
11132 dT9_dVb = dn_dVb * T3;
11139 dT9_dVd = dn_dVd * T3;
11140 dT9_dVb = dn_dVb * T3;
11150 dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
11151 dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
11152 dT9_dVg *= dVgs_eff_dVg;
11155 Vgsteff = T10 / T9;
11157 dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
11158 dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
11159 dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
11171 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
11175 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
11178 T1 = 0.5 * (1.0 + V3 /
T0);
11179 Vfbeff = Vfb - 0.5 * (V3 +
T0);
11180 dVfbeff_dVg = T1 * dVgs_eff_dVg;
11181 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11182 Qac0 =
CoxWL * (Vfbeff - Vfb);
11183 dQac0_dVg =
CoxWL * dVfbeff_dVg;
11184 dQac0_dVb =
CoxWL * dVfbeff_dVb;
11187 T3 = Vgs_eff - Vfbeff - VbseffCV -
Vgsteff;
11200 T1 = sqrt(T0 * T0 + T3);
11201 T2 =
CoxWL * T0 / T1;
11206 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
11207 dQsub0_dVd = -T2 * dVgsteff_dVd;
11208 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb
11213 VdsatCV = Vgsteff / AbulkCV;
11216 dT0_dVg = 1.0 / AbulkCV;
11217 dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11218 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11220 dT1_dVd = -T0 / T1;
11221 dT1_dVb = dT1_dVg * dT0_dVb;
11222 dT1_dVg *= dT0_dVg;
11225 VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11226 dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11227 dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11228 dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11234 T5 = VdsatCV * T3 / (T1 -
T0);
11235 VdseffCV = VdsatCV * T4;
11236 dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11237 dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11238 dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11244 dVdseffCV_dVg = 0.0;
11245 dVdseffCV_dVb = 0.0;
11248 T0 = AbulkCV * VdseffCV;
11249 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
11250 T2 = VdseffCV / T1;
11253 T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11254 T5 = (6.0 * T0 * (4.0 * Vgsteff -
T0) / (T1 * T1) - 0.5);
11255 T6 = 12.0 * T2 * T2 *
Vgsteff;
11257 qgate =
CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
11258 Cgg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11259 Cgd1 =
CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
11260 Cgb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11261 + Cgg1 * dVgsteff_dVb;
11262 Cgg1 *= dVgsteff_dVg;
11264 T7 = 1.0 - AbulkCV;
11266 T4 = -T7 * (T4 - 1.0);
11268 T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11269 Cbg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11270 Cbd1 =
CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
11271 Cbb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11272 + Cbg1 * dVgsteff_dVb;
11273 Cbg1 *= dVgsteff_dVg;
11278 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0
11280 T7 = (4.0 * Vgsteff -
T0) / (T1 * T1);
11281 T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11282 T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11283 T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11284 Csg =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
11285 Csd =
CoxWL * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
11286 Csb =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11287 +
Csg * dVgsteff_dVb;
11288 Csg *= dVgsteff_dVg;
11293 T2 = 0.5 *
CoxWL / (T1 * T1);
11294 T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
11295 * (Vgsteff - 4.0 * T0 / 3.0))
11296 - 2.0 * T0 * T0 * T0 / 15.0;
11298 T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff -
T0)
11300 T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
11301 * Vgsteff - 8.0 * T0 / 3.0)
11302 + 2.0 * T0 * T0 / 3.0);
11303 T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11304 T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11305 Csg = (T4 + T5 * dVdseffCV_dVg);
11306 Csd = T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
11307 Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11308 +
Csg * dVgsteff_dVb;
11309 Csg *= dVgsteff_dVg;
11314 Csg = -0.5 * (Cgg1 + Cbg1);
11315 Csb = -0.5 * (Cgb1 + Cbb1);
11316 Csd = -0.5 * (Cgd1 + Cbd1);
11319 qgate += Qac0 + Qsub0;
11320 qbulk -= (Qac0 + Qsub0);
11323 Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
11324 Cgd = dQsub0_dVd + Cgd1;
11325 Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
11327 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11328 Cbd = Cbd1 - dQsub0_dVd;
11329 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11331 Cgb *= dVbseff_dVb;
11332 Cbb *= dVbseff_dVb;
11333 Csb *= dVbseff_dVb;
11351 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 *
vfbzb);
11353 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * vfbzb);
11355 T1 = 0.5 * (1.0 + V3 /
T0);
11356 Vfbeff = vfbzb - 0.5 * (V3 +
T0);
11357 dVfbeff_dVg = T1 * dVgs_eff_dVg;
11358 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11362 T0 = (Vgs_eff - VbseffCV -
vfbzb) / Tox;
11363 dT0_dVg = dVgs_eff_dVg / Tox;
11364 dT0_dVb = -dVbseffCV_dVb / Tox;
11371 dTcen_dVb = dTcen_dVg * dT0_dVb;
11372 dTcen_dVg *= dT0_dVg;
11377 dTcen_dVg = dTcen_dVb = 0.0;
11382 dTcen_dVg = dTcen_dVb = 0.0;
11389 T1 = 0.5 * (1.0 + V3 / V4);
11393 Ccen = epssub / Tcen;
11394 T2 = Cox / (Cox + Ccen);
11395 Coxeff = T2 * Ccen;
11397 dCoxeff_dVg = T2 * T2 * T3;
11398 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11399 dCoxeff_dVg *= dTcen_dVg;
11402 Qac0 = CoxWLcen * (Vfbeff -
vfbzb);
11403 QovCox = Qac0 / Coxeff;
11404 dQac0_dVg = CoxWLcen * dVfbeff_dVg
11405 + QovCox * dCoxeff_dVg;
11406 dQac0_dVb = CoxWLcen * dVfbeff_dVb
11407 + QovCox * dCoxeff_dVb;
11410 T3 = Vgs_eff - Vfbeff - VbseffCV -
Vgsteff;
11423 T1 = sqrt(T0 * T0 + T3);
11424 T2 = CoxWLcen * T0 / T1;
11428 QovCox = Qsub0 / Coxeff;
11429 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11430 + QovCox * dCoxeff_dVg;
11431 dQsub0_dVd = -T2 * dVgsteff_dVd;
11432 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
11433 + QovCox * dCoxeff_dVb;
11447 DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
11448 dDeltaPhi_dVg = 2.0 * Vtm * (T1 -
T0) / (Denomi + T1 * Vgsteff);
11452 T0 = Vgsteff - DeltaPhi - 0.001;
11453 dT0_dVg = 1.0 - dDeltaPhi_dVg;
11454 T1 = sqrt(T0 * T0 + Vgsteff * 0.004);
11455 VgDP = 0.5 * (T0 + T1);
11456 dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1);
11464 dTcen_dVg = -Tcen * T2 / T1;
11465 dTcen_dVd = dTcen_dVg * dVgsteff_dVd;
11466 dTcen_dVb = dTcen_dVg * dVgsteff_dVb;
11467 dTcen_dVg *= dVgsteff_dVg;
11469 Ccen = epssub / Tcen;
11470 T0 = Cox / (Cox + Ccen);
11471 Coxeff = T0 * Ccen;
11473 dCoxeff_dVg = T0 * T0 * T1;
11474 dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
11475 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11476 dCoxeff_dVg *= dTcen_dVg;
11481 VdsatCV = VgDP / AbulkCV;
11484 dT0_dVg = dVgDP_dVg / AbulkCV;
11485 dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11486 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11488 dT1_dVd = -T0 / T1;
11489 dT1_dVb = dT1_dVg * dT0_dVb;
11490 dT1_dVg *= dT0_dVg;
11493 VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11494 dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11495 dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11496 dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11502 T5 = VdsatCV * T3 / (T1 -
T0);
11503 VdseffCV = VdsatCV * T4;
11504 dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11505 dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11506 dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11512 dVdseffCV_dVg = 0.0;
11513 dVdseffCV_dVb = 0.0;
11516 T0 = AbulkCV * VdseffCV;
11518 T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
11520 T4 = 1.0 - 12.0 * T3 * T3;
11521 T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 -
T0) / (T2 * T2) - 0.5);
11522 T6 = T5 * VdseffCV / AbulkCV;
11524 qgate = CoxWLcen * (T1 - T0 * (0.5 - T3));
11525 QovCox =
qgate / Coxeff;
11526 Cgg1 = CoxWLcen * (T4 * dVgDP_dVg
11527 + T5 * dVdseffCV_dVg);
11528 Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
11529 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11530 Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11531 + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11532 Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11535 T7 = 1.0 - AbulkCV;
11537 T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
11538 T10 = T9 * dVgDP_dVg;
11539 T11 = -T7 * T5 / AbulkCV;
11540 T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
11542 qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
11543 QovCox =
qbulk / Coxeff;
11544 Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
11545 Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
11546 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11547 Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
11548 + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11549 Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11554 qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
11555 - 0.5 * T0 * T0 / T2);
11556 QovCox =
qsrc / Coxeff;
11559 T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 -
T0) / T3);
11560 T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg;
11562 T6 = T7 * VdseffCV;
11564 Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
11565 Csd = CoxWLcen * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd
11566 + QovCox * dCoxeff_dVd;
11567 Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11568 +
Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11569 Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11575 T3 = 0.5 * CoxWLcen / (T2 * T2);
11576 T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
11577 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
11579 QovCox = qsrc / Coxeff;
11580 T8 = 4.0 / 3.0 * T1 * (T1 -
T0) + 0.4 * T0 * T0;
11581 T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
11582 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11583 T6 = AbulkCV * (qsrc / T2 + T3 * T8);
11584 T7 = T6 * VdseffCV / AbulkCV;
11586 Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg;
11587 Csd =
Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
11588 + QovCox * dCoxeff_dVd;
11589 Csb =
Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
11590 + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
11591 Csg =
Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11603 qbulk -= (Qac0 + Qsub0);
11606 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11607 Cbd = Cbd1 - dQsub0_dVd;
11608 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11614 Cgb *= dVbseff_dVb;
11615 Cbb *= dVbseff_dVb;
11616 Csb *= dVbseff_dVb;
11672 if (ckt->CKTmode & MODEINITTRAN)
11674 *(ckt->CKTstate1 +
qcheq) = *(ckt->CKTstate0 +
qcheq);
11678 error = NIintegrate(ckt, &geq, &ceq, 0.0,
qcheq);
11711 capbs = czbs + czbssw + czbsswg;
11720 sarg = 1.0 / sqrt(arg);
11724 sarg = exp(-MJS * log(arg));
11727 capbs = czbs * sarg;
11739 sarg = 1.0 / sqrt(arg);
11743 sarg = exp(-MJSWS * log(arg));
11746 * (1.0 - arg * sarg) / (1.0 - MJSWS);
11747 capbs += czbssw * sarg;
11754 sarg = 1.0 / sqrt(arg);
11758 sarg = exp(-MJSWGS * log(arg));
11761 capbs += czbsswg * sarg;
11766 T0 = czbs + czbssw + czbsswg;
11778 capbd = czbd + czbdsw + czbdswg;
11787 sarg = 1.0 / sqrt(arg);
11791 sarg = exp(-MJD * log(arg));
11794 capbd = czbd * sarg;
11806 sarg = 1.0 / sqrt(arg);
11810 sarg = exp(-MJSWD * log(arg));
11813 * (1.0 - arg * sarg) / (1.0 - MJSWD);
11814 capbd += czbdsw * sarg;
11820 sarg = 1.0 / sqrt(arg);
11822 sarg = exp(-MJSWGD * log(arg));
11824 * (1.0 - arg * sarg) / (1.0 - MJSWGD);
11825 capbd += czbdswg * sarg;
11830 T0 = czbd + czbdsw + czbdswg;
11882 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11883 T2 = 0.5 * (T0 - T1);
11888 * (0.5 - 0.5 * T0 / T1);
11893 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11894 T2 = 0.5 * (T0 - T1);
11898 * (0.5 - 0.5 * T0 / T1);
11963 bool bsuccess =
true;
11967 #ifdef Xyce_DEBUG_DEVICE
11970 Xyce::dout() << subsection_divider << std::endl;
11971 Xyce::dout() <<
" Begin of updatePrimaryState. \n";
11972 Xyce::dout() << std::endl;
12095 bool bsuccess=
true;
12100 #ifdef Xyce_DEBUG_DEVICE
12103 Xyce::dout() << subsection_divider << std::endl;
12104 Xyce::dout() <<
" MOSFET BSIM4 loadDAEQVector " << std::endl;
12105 Xyce::dout() <<
" name = " <<
getName() << std::endl;
12106 Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
12107 Xyce::dout() <<
" " << std::endl;
12113 double Qeqqg = 0.0;
12114 double Qeqqb = 0.0;
12115 double Qeqqd = 0.0;
12116 double Qeqqgmid = 0.0;
12117 double Qeqqjs = 0.0;
12118 double Qeqqjd = 0.0;
12119 double Qqdef = 0.0;
12120 double Qqcheq = 0.0;
12351 if (ckt->CKTmode & MODEINITTRAN)
12353 *(ckt->CKTstate1 + cqb) = *(ckt->CKTstate0 + cqb);
12354 *(ckt->CKTstate1 + cqg) = *(ckt->CKTstate0 + cqg);
12355 *(ckt->CKTstate1 + cqd) = *(ckt->CKTstate0 + cqd);
12359 *(ckt->CKTstate1 + cqgmid) = *(ckt->CKTstate0 + cqgmid);
12364 *(ckt->CKTstate1 + cqbs) = *(ckt->CKTstate0 + cqbs);
12365 *(ckt->CKTstate1 + cqbd) = *(ckt->CKTstate0 + cqbd);
13073 bool bsuccess =
true;
13078 #ifdef Xyce_DEBUG_DEVICE
13081 Xyce::dout() << std::endl << subsection_divider << std::endl;
13082 Xyce::dout() <<
" Begin of Instance::loadDAEFVector. ";
13083 Xyce::dout() <<
" origFlag = " <<
origFlag <<
" name = " <<
getName() << std::endl;
13085 Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13086 Xyce::dout() <<
" " << std::endl;
13166 Idtoteq_Jdxp = 0.0;
13199 Igtoteq_Jdxp = 0.0;
13297 Idtoteq_Jdxp = 0.0;
13330 Igtoteq_Jdxp = 0.0;
13344 double tmp_gcrgd =
gcrgd;
13384 ceqgdtot_Jdxp = 0.0;
13804 double tmp_gcrgd =
gcrgd;
13883 bool bsuccess =
true;
13893 #ifdef Xyce_DEBUG_DEVICE
13896 Xyce::dout() << std::endl << subsection_divider << std::endl;
13897 Xyce::dout() <<
" name = " <<
getName() << std::endl;
14000 bool bsuccess =
true;
14003 #ifdef Xyce_DEBUG_DEVICE
14006 Xyce::dout() << std::endl << subsection_divider << std::endl;
14007 Xyce::dout() <<
"Instance::loadDAEdFdx";
14008 Xyce::dout() <<
" name = " <<
getName() << std::endl;
14261 bool bsuccess =
true;
14280 double coxe,
double Vgs_arg,
14282 double & dVgs_eff_dVg)
14284 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);
14289 if ((ngate > 1.0e18) && (ngate < 1.0e25) && (Vgs_arg > phi) && (epsgate!=0))
14291 T1 = 1.0e6 *
CONSTQ * epsgate * ngate / (coxe * coxe);
14292 T8 = Vgs_arg - phi;
14293 T4 = sqrt(1.0 + 2.0 * T8 / T1);
14294 T2 = 2.0 * T8 / (T4 + 1.0);
14295 T3 = 0.5 * T2 * T2 / T1;
14296 T7 = 1.12 - T3 - 0.05;
14297 T6 = sqrt(T7 * T7 + 0.224);
14298 T5 = 1.12 - 0.5 * (T7 + T6);
14299 Vgs_eff = Vgs_arg - T5;
14300 dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
14305 dVgs_eff_dVg = 1.0;
14319 (
double Nvtm,
double Ijth,
double Isb,
double XExpBV,
double & Vjm)
14321 double Tb(0.0), Tc(0.0), EVjmovNv(0.0);
14324 Tb = 1.0 + Ijth / Isb - Tc;
14325 EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc));
14326 Vjm = Nvtm * log(EVjmovNv);
14349 (
double nf_arg,
int minSD,
14350 double & nuIntD,
double & nuEndD,
double & nuIntS,
double & nuEndS)
14352 int NF =
static_cast<int>(nf_arg);
14356 nuEndD = nuEndS = 1.0;
14357 nuIntD = nuIntS = 2.0 * Xycemax((nf_arg - 1.0) / 2.0, 0.0);
14364 nuIntD = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14373 nuIntS = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14391 (
double nf_arg,
int geo,
int minSD,
14392 double Weffcj,
double DMCG,
double DMCI,
double DMDG,
14393 double & Ps,
double & Pd,
double & As,
double & Ad)
14395 double T0(0.0), T1(0.0), T2(0.0);
14396 double ADiso(0.0), ADsha(0.0), ADmer(0.0), ASiso(0.0), ASsha(0.0), ASmer(0.0);
14397 double PDiso(0.0), PDsha(0.0), PDmer(0.0), PSiso(0.0), PSsha(0.0), PSmer(0.0);
14398 double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14401 NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14407 PSiso = PDiso = T0 + T0 + Weffcj;
14408 PSsha = PDsha = T1;
14409 PSmer = PDmer = T2;
14411 ASiso = ADiso = T0 * Weffcj;
14412 ASsha = ADsha = DMCG * Weffcj;
14413 ASmer = ADmer = DMDG * Weffcj;
14418 Ps = nuEndS * PSiso + nuIntS * PSsha;
14419 Pd = nuEndD * PDiso + nuIntD * PDsha;
14420 As = nuEndS * ASiso + nuIntS * ASsha;
14421 Ad = nuEndD * ADiso + nuIntD * ADsha;
14424 Ps = nuEndS * PSiso + nuIntS * PSsha;
14425 Pd = (nuEndD + nuIntD) * PDsha;
14426 As = nuEndS * ASiso + nuIntS * ASsha;
14427 Ad = (nuEndD + nuIntD) * ADsha;
14430 Ps = (nuEndS + nuIntS) * PSsha;
14431 Pd = nuEndD * PDiso + nuIntD * PDsha;
14432 As = (nuEndS + nuIntS) * ASsha;
14433 Ad = nuEndD * ADiso + nuIntD * ADsha;
14436 Ps = (nuEndS + nuIntS) * PSsha;
14437 Pd = (nuEndD + nuIntD) * PDsha;
14438 As = (nuEndS + nuIntS) * ASsha;
14439 Ad = (nuEndD + nuIntD) * ADsha;
14442 Ps = nuEndS * PSiso + nuIntS * PSsha;
14443 Pd = nuEndD * PDmer + nuIntD * PDsha;
14444 As = nuEndS * ASiso + nuIntS * ASsha;
14445 Ad = nuEndD * ADmer + nuIntD * ADsha;
14448 Ps = (nuEndS + nuIntS) * PSsha;
14449 Pd = nuEndD * PDmer + nuIntD * PDsha;
14450 As = (nuEndS + nuIntS) * ASsha;
14451 Ad = nuEndD * ADmer + nuIntD * ADsha;
14454 Ps = nuEndS * PSmer + nuIntS * PSsha;
14455 Pd = nuEndD * PDiso + nuIntD * PDsha;
14456 As = nuEndS * ASmer + nuIntS * ASsha;
14457 Ad = nuEndD * ADiso + nuIntD * ADsha;
14460 Ps = nuEndS * PSmer + nuIntS * PSsha;
14461 Pd = (nuEndD + nuIntD) * PDsha;
14462 As = nuEndS * ASmer + nuIntS * ASsha;
14463 Ad = (nuEndD + nuIntD) * ADsha;
14466 Ps = nuEndS * PSmer + nuIntS * PSsha;
14467 Pd = nuEndD * PDmer + nuIntD * PDsha;
14468 As = nuEndS * ASmer + nuIntS * ASsha;
14469 Ad = nuEndD * ADmer + nuIntD * ADsha;
14472 Ps = PSiso + (nf_arg - 1.0) * PSsha;
14473 Pd = nf_arg * PDsha;
14474 As = ASiso + (nf_arg - 1.0) * ASsha;
14475 Ad = nf_arg * ADsha;
14478 Ps = nf_arg * PSsha;
14479 Pd = PDiso + (nf_arg - 1.0) * PDsha;
14480 As = nf_arg * ASsha;
14481 Ad = ADiso + (nf_arg - 1.0) * ADsha;
14484 UserWarning(*
this) <<
"Specified GEO not matched\n";
14501 int geo,
int rgeo,
int minSD,
14502 double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14503 int Type,
double & Rtot)
14505 std::string msg=
"";
14506 double Rint(0.0), Rend (0.0);
14507 double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14511 NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14519 Rint = Rsh * DMCG / ( Weffcj * nuIntS);
14526 Rint = Rsh * DMCG / ( Weffcj * nuIntD);
14533 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14534 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14537 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14538 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14541 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14542 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14545 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14546 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14549 if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14550 else Rend = Rsh * DMDG / Weffcj;
14553 if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14554 else Rend = Rsh * DMDG / (Weffcj * nuEndD);
14557 if (Type == 1) Rend = Rsh * DMDG / Weffcj;
14558 else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14561 if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS);
14562 else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14565 Rend = Rsh * DMDG / Weffcj;
14570 Rend = 0.5 * Rsh * DMCG / Weffcj;
14574 Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14579 Rint = Rsh * DMCG / (Weffcj * nf_arg);
14586 Rint = Rsh * DMCG / (Weffcj * nf_arg);
14590 Rend = 0.5 * Rsh * DMCG / Weffcj;;
14594 Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14598 UserWarning(*
this) <<
"Specified GEO not matched\n";
14603 else if (Rend <= 0.0)
14606 Rtot = Rint * Rend / (Rint + Rend);
14610 UserWarning(*
this) <<
"Zero resistance returned from RdseffGeo\n";
14626 (
double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14627 double nuEnd,
int rgeo,
int Type,
double & Rend)
14629 std::string msg=
"";
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";
14666 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14671 if ((DMCG + DMCI) == 0.0)
14672 msg =
"(DMCG + DMCI) can not be equal to zero\n";
14676 Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14679 UserWarning(*
this) <<
"Specified RGEO not matched\n";
14695 (
double Weffcj,
double Rsh,
double DMCG,
double DMCI,
double DMDG,
14696 int rgeo,
int Type,
double nuEnd,
double & Rend)
14698 std::string msg =
"";
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 not matched\n";
14735 Rend = Rsh * DMCG / (Weffcj * nuEnd);
14741 msg =
"DMCG can not be equal to zero\n";
14745 Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14748 UserWarning(*
this) <<
"Specified RGEO = %d not matched\n";
14773 UserWarning(*
this) <<
"Given pbs is less than 0.1. Pbs is set to 0.1";
14778 UserWarning(*
this) <<
"Given pbsws is less than 0.1. Pbsws is set to 0.1";
14783 UserWarning(*
this) <<
"Given pbswgs is less than 0.1. Pbswgs is set to 0.1";
14789 UserWarning(*
this) <<
"Given pbd is less than 0.1. Pbd is set to 0.1";
14794 UserWarning(*
this) <<
"Given pbswd is less than 0.1. Pbswd is set to 0.1";
14799 UserWarning(*
this) <<
"Given pbswgd is less than 0.1. Pbswgd is set to 0.1";
14819 std::vector<Instance*>::iterator iter;
14823 for (iter=first; iter!=last; ++iter)
14825 (*iter)->processParams();
14844 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
15518 sheetResistance(0.0),
15519 SjctSatCurDensity(0.0),
15520 DjctSatCurDensity(0.0),
15521 SjctSidewallSatCurDensity(0.0),
15522 DjctSidewallSatCurDensity(0.0),
15523 SjctGateSidewallSatCurDensity(0.0),
15524 DjctGateSidewallSatCurDensity(0.0),
15525 SbulkJctPotential(0.0),
15526 DbulkJctPotential(0.0),
15527 SbulkJctBotGradingCoeff(0.0),
15528 DbulkJctBotGradingCoeff(0.0),
15529 SbulkJctSideGradingCoeff(0.0),
15530 DbulkJctSideGradingCoeff(0.0),
15531 SbulkJctGateSideGradingCoeff(0.0),
15532 DbulkJctGateSideGradingCoeff(0.0),
15533 SsidewallJctPotential(0.0),
15534 DsidewallJctPotential(0.0),
15535 SGatesidewallJctPotential(0.0),
15536 DGatesidewallJctPotential(0.0),
15537 SunitAreaJctCap(0.0),
15538 DunitAreaJctCap(0.0),
15539 SunitLengthSidewallJctCap(0.0),
15540 DunitLengthSidewallJctCap(0.0),
15541 SunitLengthGateSidewallJctCap(0.0),
15542 DunitLengthGateSidewallJctCap(0.0),
15543 SjctEmissionCoeff(0.0),
15544 DjctEmissionCoeff(0.0),
15545 SjctTempExponent(0.0),
15546 DjctTempExponent(0.0),
15634 SjctTempSatCurDensity(0.0),
15635 SjctSidewallTempSatCurDensity(0.0),
15636 SjctGateSidewallTempSatCurDensity(0.0),
15640 DjctTempSatCurDensity(0.0),
15641 DjctSidewallTempSatCurDensity(0.0),
15642 DjctGateSidewallTempSatCurDensity(0.0),
15643 SunitAreaTempJctCap(0.0),
15644 DunitAreaTempJctCap(0.0),
15645 SunitLengthSidewallTempJctCap(0.0),
15646 DunitLengthSidewallTempJctCap(0.0),
15647 SunitLengthGateSidewallTempJctCap(0.0),
15648 DunitLengthGateSidewallTempJctCap(0.0),
15650 oxideTrapDensityA(0.0),
15651 oxideTrapDensityB(0.0),
15652 oxideTrapDensityC(0.0),
15662 gamma1Given(false),
15668 gamma2Given(false),
15673 rbsbx0Given(false),
15674 rbsby0Given(false),
15675 rbdbx0Given(false),
15676 rbdby0Given(false),
15677 lambdaGiven(false),
15693 else if (
getType() ==
"PMOS") {
15710 if (!
given(
"TNOM"))
15718 if (!
given(
"TOXP") )
15720 if (!
given(
"TOXM") )
15722 if (!
given(
"DSUB") )
15725 if (!
given(
"VTH0") )
15728 if (!
given(
"VDDEOT"))
15733 ua =(
mobMod == 2) ? 1.0E-15 : 1.0E-9;
15735 uc = (
mobMod == 1) ? -0.0465 : -0.0465E-9;
15737 uc1 =(
mobMod == 1) ? -0.056 : -0.056E-9;
15740 if (!
given(
"AIGC"))
15742 if (!
given(
"BIGC"))
15744 if (!
given(
"CIGC"))
15746 if (
given(
"AIGSD"))
15753 if (!
given(
"AIGS"))
15755 if (!
given(
"AIGD"))
15759 if (
given(
"BIGSD"))
15766 if (!
given(
"BIGS"))
15768 if (!
given(
"BIGD"))
15771 if (
given(
"CIGSD"))
15778 if (!
given(
"CIGS"))
15780 if (!
given(
"CIGD"))
15783 if (!
given(
"IJTHDFWD"))
15785 if (!
given(
"IJTHDREV"))
15787 if (!
given(
"XJBVD"))
15791 if (!
given(
"CKAPPAD"))
15793 if (!
given(
"DMCI"))
15799 if (!
given(
"LWLC"))
15805 if (!
given(
"WWLC"))
15812 if (!
given(
"AGISL"))
15814 if (
given(
"AGIDL"))
15818 if (!
given(
"BGISL"))
15820 if (
given(
"BGIDL"))
15823 if (!
given(
"CGISL"))
15825 if (
given(
"CGIDL"))
15828 if (!
given(
"EGISL"))
15830 if (
given(
"EGIDL"))
15834 if (!
given(
"DLCIG"))
15836 if (!
given(
"DLCIGD"))
15838 if (!
given(
"DLCIG"))
15857 if (!
given(
"JSWD"))
15859 if (!
given(
"JSWGD"))
15865 if (!
given(
"XTID"))
15869 if (!
given(
"MJSWD"))
15871 if (!
given(
"MJSWGS"))
15873 if (!
given(
"MJSWGD"))
15875 if (!
given(
"PBSWD"))
15877 if (!
given(
"PBSWGS"))
15879 if (!
given(
"PBSWGD"))
15883 if (!
given(
"CJSWD"))
15885 if (!
given(
"CJSWGS"))
15887 if (!
given(
"CJSWGD"))
15890 if (!
given(
"JTSD"))
15892 if (!
given(
"JTSSWD"))
15894 if (!
given(
"JTSSWGD"))
15897 if (!
given(
"NJTSD"))
15902 if (!
given(
"NJTSSWD"))
15904 if (
given(
"NJTSSW"))
15907 if (!
given(
"NJTSSWGD"))
15909 if (
given(
"NJTSSWG"))
15913 if (!
given(
"XTSD"))
15915 if (!
given(
"XTSSWD"))
15917 if (!
given(
"XTSSWGD"))
15920 if (!
given(
"TNJTSD"))
15922 if (
given(
"TNJTS"))
15925 if (!
given(
"TNJTSSWD"))
15927 if (
given(
"TNJTSSW"))
15930 if (!
given(
"TNJTSSWGD"))
15932 if (
given(
"TNJTSSWG"))
15936 if (!
given(
"VTSD"))
15938 if (!
given(
"VTSSWD"))
15940 if (!
given(
"VTSSWGD"))
15943 if (!
given(
"LAGISL"))
15945 if (
given(
"LAGIDL"))
15948 if (!
given(
"LBGISL"))
15950 if (
given(
"LBGIDL"))
15953 if (!
given(
"LCGISL"))
15955 if (
given(
"LCGIDL"))
15958 if (!
given(
"LEGISL"))
15960 if (
given(
"LEGIDL"))
15993 if (!
given(
"WAGISL"))
15995 if (
given(
"WAGIDL"))
15998 if (!
given(
"WBGISL"))
16000 if (
given(
"WBGIDL"))
16003 if (!
given(
"WCGISL"))
16005 if (
given(
"WCGIDL"))
16008 if (!
given(
"WEGISL"))
16010 if (
given(
"WEGIDL"))
16028 if (!
given(
"PAGISL"))
16030 if (
given(
"PAGIDL"))
16033 if (!
given(
"PBGISL"))
16035 if (
given(
"PBGIDL"))
16038 if (!
given(
"PCGISL"))
16040 if (
given(
"PCGIDL"))
16043 if (!
given(
"PEGISL"))
16045 if (
given(
"PEGIDL"))
16063 if (!
given(
"NOIA"))
16070 if (!
given(
"NOIB"))
16077 if (!
given(
"NOIC"))
16095 std::list<SizeDependParam*>::iterator it_dpL =
16097 std::list<SizeDependParam*>::iterator end_dpL =
16099 for( ; it_dpL != end_dpL; ++it_dpL )
16104 std::vector<Instance*>::iterator iter;
16108 for (iter=first; iter!=last; ++iter)
16125 std::vector<Instance*>::const_iterator iter;
16131 os <<
" name model name Parameters" << std::endl;
16133 for (i=0, iter=first; iter!=last; ++iter,++i)
16135 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
16161 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16182 std::list<SizeDependParam*>::iterator it_dpL =
16184 std::list<SizeDependParam*>::iterator end_dpL =
16186 for( ; it_dpL != end_dpL; ++it_dpL )
16208 bool bsuccess =
true;
16211 #pragma omp parallel for
16218 bsuccess = bsuccess && btmp;
16477 double Qeqqg = 0.0;
16478 double Qeqqb = 0.0;
16479 double Qeqqd = 0.0;
16480 double Qeqqgmid = 0.0;
16481 double Qeqqjs = 0.0;
16482 double Qeqqjd = 0.0;
16483 double Qqdef = 0.0;
16484 double Qqcheq = 0.0;
16506 Qeqqgmid = mi.
qgmid;
16518 Qqcheq = -mi.
qcheq;
16529 Qeqqgmid = -mi.
qgmid;
16634 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17139 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17305 .registerDevice(
"m", 14)
17306 .registerDevice(
"m", 54)
17307 .registerModelType(
"pmos", 14)
17308 .registerModelType(
"nmos", 14)
17309 .registerModelType(
"pmos", 54)
17310 .registerModelType(
"nmos", 54);