48 #include <Xyce_config.h>
67 #ifndef Xyce_USE_BSIM3_CONST
77 #include <N_ERH_ErrorMgr.h>
81 #include <N_LAS_Matrix.h>
82 #include <N_LAS_Vector.h>
87 #ifdef Xyce_USE_BSIM3_CONST
89 #define CONSTMAX_EXP 5.834617425e+14
90 #define CONSTMIN_EXP 1.713908431e-15
92 #define CONSTEXP_THRESHOLD 34.0
93 #define CONSTEPSOX 3.453133e-11
94 #define CONSTEPSSI 1.03594e-10
96 #define CONSTQ 1.60219e-19
98 #define CONSTDELTA_1 0.02
99 #define CONSTDELTA_2 0.02
100 #define CONSTDELTA_3 0.02
101 #define CONSTDELTA_4 0.02
103 #define CONSTroot2 sqrt(2.0)
104 #define CONSTCtoK (273.15)
105 #define CONSTREFTEMP (300.15)
107 #define CONSTboltz 1.3806226e-23
108 #define CONSTKoverQ 8.617087e-5 // Kb / q where q = 1.60219e-19
110 #define CONSTvt0 (CONSTboltz * (27.0 +CONSTCtoK)/CONSTQ)
112 #define CONSTEg300 (1.1150877) // band gap for Si at T=300.15K (room temp)
113 #define CONSTEg0 (1.16) // band gap for Si at T=0K. (eV)
114 #define CONSTalphaEg (7.02e-4) // (eV/K)
115 #define CONSTbetaEg (1108.0) // (K)
117 #define CONSTNi0 (1.45e10) // carrier concentration at room temp.
129 namespace MOSFET_B3 {
198 "Initial condition of no voltage drops accross device");
242 NULL,
U_MSM1,
CAT_DC,
"Saturation velocity at temp = TNOM");
246 NULL,
U_MSM1,
CAT_TEMP,
"Temperature coefficient for saturation velocity");
250 NULL,
U_NONE,
CAT_DC,
"Bulk charge effect coefficient for channel length");
266 NULL,
U_VOLTM1,
CAT_DC,
"Body-bias coefficient of bulk charge effect");
281 NULL,
U_CMM3,
CAT_DC,
"Poly gate doping concentration");
301 U_VOLT,
CAT_DC,
"Maximum applied body-bias in threshold voltage calculation");
315 NULL,
U_VOLT,
CAT_TEMP,
"Themperature coefficient for threshold voltage");
319 NULL,
U_VM,
CAT_TEMP,
"Channel length dependence of the temerature coefficient for the threshold voltage");
323 NULL,
U_NONE,
CAT_TEMP,
"Body-bias coefficient fo the threshold voltage temperature effect");
328 U_NONE,
CAT_DC,
"second-order body effect coefficient");
344 NULL,
U_METER,
CAT_DC,
"Lateral non-uniform doping parameter");
348 NULL,
U_NONE,
CAT_DC,
"First coefficient of short-channel effect effect on threshold voltage");
352 NULL,
U_NONE,
CAT_DC,
"Second coefficient of short-channel effect effect on threshold voltage");
356 NULL,
U_VOLTM1,
CAT_DC,
"Body-bias coefficient of short-channel effect effect on threshold voltage");
360 NULL,
U_METERM1,
CAT_DC,
"First coefficient of narrow-width effect effect on threshold voltage for small channel length");
364 NULL,
U_METERM1,
CAT_DC,
"Second coefficient of narrow-width effect effect on threshold voltage for small channel length");
368 NULL,
U_VOLTM1,
CAT_DC,
"Body-bias coefficient of narrow-width effect effect on threshold voltage for small channel length");
372 NULL,
U_NONE,
CAT_DC,
"L-depedance Coefficient of the DIBL correction parameter in Rout");
376 NULL,
U_NONE,
CAT_DC,
"DIBL coefficient exponent in subthreshhold region");
381 U_VOLT,
CAT_DC,
"Threshold voltage at Vbs = 0 for large L");
385 NULL,
U_MVM1,
CAT_DC,
"First-order mobility degradation coefficient");
393 NULL,
U_M2VM2,
CAT_DC,
"First-order mobility degradation coefficient");
401 NULL,
U_MVM2,
CAT_DC,
"Body effect of mobility degridation coefficient");
418 NULL,
U_VOLT,
CAT_DC,
"Offset voltage in the subthreshold region at large W and L");
438 NULL,
U_NONE,
CAT_DC,
"DIBL coefficient in subthreshold region");
442 NULL,
U_VOLTM1,
CAT_DC,
"Body-bias coefficient for the subthreshold DIBL effect");
446 NULL,
U_NONE,
CAT_DC,
"Channel length modulation parameter");
450 NULL,
U_NONE,
CAT_DC,
"First output resistance DIBL effect correction parameter");
454 NULL,
U_NONE,
CAT_DC,
"Second output resistance DIBL effect correction parameter");
458 NULL,
U_VOLTM1,
CAT_DC,
"Body effect coefficient of DIBL correction parameter");
462 NULL,
U_VMM1,
CAT_DC,
"First substrate current body effect parameter");
466 NULL,
U_VMM1,
CAT_DC,
"second substrate current body effect parameter");
470 NULL,
U_NONE,
CAT_DC,
"Gate dependence of early voltage");
478 NULL,
U_NONE,
CAT_DC,
"Width offset from Weff for Rds Calculation");
482 NULL,
U_MVMH,
CAT_DC,
"Coefficient of gate depedence of Weff");
486 NULL,
U_MVMH,
CAT_DC,
"Coefficient of substrate body bias dependence of Weff");
490 NULL,
U_METER,
CAT_DC,
"Bulk charge effect coefficient for channel width");
498 NULL,
U_MVM1,
CAT_DC,
"First parameter of impact-ionization current");
506 NULL,
U_VOLT,
CAT_DC,
"Second parameter of impact-ionization current");
523 NULL,
U_FARADMM1,
CAT_CAP,
"Light-doped source-gate region overlap capacitance");
531 NULL,
U_FARADMM1,
CAT_CAP,
"Coefficient for lightly doped region overlap capacitance fireing field capacitance");
539 NULL,
U_VOLT,
CAT_CAP,
"Flat-band voltage parameter (for CAPMOD = 0 only)");
547 NULL,
U_NONE,
CAT_CAP,
"Exponetial term for the short-channel model");
551 NULL,
U_METER,
CAT_CAP,
"Width offset fitting parameter from C-V");
555 NULL,
U_METER,
CAT_CAP,
"Length offset fitting parameter from C-V");
559 NULL,
U_NONE,
CAT_CAP,
"CV parameter in Vgsteff, CV for weak to strong inversion");
563 NULL,
U_VOLT,
CAT_CAP,
"CV parameter in Vgsteff, CV for weak to strong inversion");
567 NULL,
U_MVM1,
CAT_CAP,
"Exponetial coefficient for charge thickness in capmod = 3 for accumulation and depletion regions");
571 NULL,
U_NONE,
CAT_CAP,
"Coefficient for the gate-bias dependent surface potential");
1595 &MOSFET_B3::Model::useFring,
1605 NULL,
U_FARADMM1,
CAT_CAP,
"Non-LLD region source-gate overlap capacitance per unit channel length");
1609 NULL,
U_FARADMM1,
CAT_CAP,
"Non-LLD region drain-gate overlap capacitance per unit channel length");
1613 NULL,
U_FARADMM1,
CAT_CAP,
"Gate-bulk overlap capacitance per unit channel length");
1621 NULL,
U_OHM,
CAT_RES,
"Drain, source diffusion sheet resistance");
1629 NULL,
U_AMPMM1,
CAT_DC,
"Sidewall saturation current per unit length");
1641 NULL,
U_VOLT,
CAT_CAP,
"Source/drain side junction built-in potential");
1645 NULL,
U_VOLT,
CAT_CAP,
"Source/drain gate sidewall junction built-in potential");
1661 NULL,
U_NONE,
CAT_CAP,
"Source/grain gate sidewall junction capacitance grading coeficient");
1665 NULL,
U_FARADMM1,
CAT_CAP,
"Source/grain gate sidewall junction capacitance per unit width");
1673 NULL,
U_NONE,
CAT_TEMP,
"Junction current temperature exponent coefficient");
1705 NULL,
U_METER,
CAT_DC,
"Length of offset fiting parameter from I-V without bias");
1713 NULL,
U_MEXPLL,
CAT_GEOMETRY,
"Coefficient of length dependence for CV channel length offset");
1737 NULL,
U_MEXPLLLW,
CAT_GEOMETRY,
"Coefficient of length and width dependence for CV channel length offset");
1741 NULL,
U_METER,
CAT_DC,
"Width-offset fitting parameter from I-V without bias");
1773 NULL,
U_MEXPWLWW,
CAT_GEOMETRY,
"Coefficient of length and width dependence for CV channel width offset");
1815 p.
addPar (
"VERSION", std::string(
"3.2.2"),
false,
NO_DEP,
1895 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
1914 l (getDeviceOptions().defl),
1915 w (getDeviceOptions().defw),
1916 drainArea (getDeviceOptions().defad),
1917 sourceArea (getDeviceOptions().defas),
1919 sourceSquares (1.0),
1920 drainPerimeter (0.0),
1921 sourcePerimeter (0.0),
1922 sourceConductance (0.0),
1923 drainConductance (0.0),
1930 numberParallel (1.0),
1968 limitedFlag (false),
1973 temp (getDeviceOptions().temp.getImmutableValue<double>()),
1974 ChargeComputationNeeded (true),
2057 dDeltaPhi_dVg (0.0),
2058 dDeltaPhi_dVd (0.0),
2059 dDeltaPhi_dVb (0.0),
2061 jctTempSatCurDensity (0.0),
2062 jctSidewallTempSatCurDensity (0.0),
2063 unitAreaJctCapTemp (0.0),
2064 unitLengthSidewallJctCapTemp (0.0),
2065 unitLengthGateSidewallJctCapTemp (0.0),
2124 ScalingFactor (0.0),
2142 li_store_dev_id (-1),
2143 li_store_dev_is (-1),
2144 li_store_dev_ig (-1),
2145 li_store_dev_ib (-1),
2151 li_state_qcheq (-1),
2152 li_state_qcdump (-1),
2160 li_SourcePrime (-1),
2168 ADrainEquDrainNodeOffset (-1),
2169 ADrainEquDrainPrimeNodeOffset (-1),
2170 ADrainEquIdsOffset (-1),
2172 AGateEquGateNodeOffset (-1),
2173 AGateEquBulkNodeOffset (-1),
2174 AGateEquDrainPrimeNodeOffset (-1),
2175 AGateEquSourcePrimeNodeOffset (-1),
2176 AGateEquChargeVarOffset (-1),
2177 AGateEquIgsOffset (-1),
2179 ASourceEquSourceNodeOffset (-1),
2180 ASourceEquSourcePrimeNodeOffset (-1),
2181 ASourceEquIbsOffset (-1),
2182 ASourceEquIdsOffset (-1),
2183 ASourceEquIgsOffset (-1),
2185 ABulkEquGateNodeOffset (-1),
2186 ABulkEquBulkNodeOffset (-1),
2187 ABulkEquDrainPrimeNodeOffset (-1),
2188 ABulkEquSourcePrimeNodeOffset (-1),
2189 ABulkEquChargeVarOffset (-1),
2190 ABulkEquIbsOffset (-1),
2192 ADrainPrimeEquDrainNodeOffset (-1),
2193 ADrainPrimeEquGateNodeOffset (-1),
2194 ADrainPrimeEquBulkNodeOffset (-1),
2195 ADrainPrimeEquDrainPrimeNodeOffset (-1),
2196 ADrainPrimeEquSourcePrimeNodeOffset (-1),
2197 ADrainPrimeEquChargeVarOffset (-1),
2199 ASourcePrimeEquGateNodeOffset (-1),
2200 ASourcePrimeEquSourceNodeOffset (-1),
2201 ASourcePrimeEquBulkNodeOffset (-1),
2202 ASourcePrimeEquDrainPrimeNodeOffset (-1),
2203 ASourcePrimeEquSourcePrimeNodeOffset (-1),
2204 ASourcePrimeEquChargeVarOffset (-1),
2206 AChargeEquChargeVarOffset (-1),
2207 AChargeEquDrainPrimeNodeOffset (-1),
2208 AChargeEquGateNodeOffset (-1),
2209 AChargeEquSourcePrimeNodeOffset (-1),
2210 AChargeEquBulkNodeOffset (-1),
2211 icVBSEquVsOffset (-1),
2212 icVBSEquVbOffset (-1),
2213 icVBSEquIbsOffset (-1),
2214 icVDSEquVdOffset (-1),
2215 icVDSEquVsOffset (-1),
2216 icVDSEquIdsOffset (-1),
2217 icVGSEquVgOffset (-1),
2218 icVGSEquVsOffset (-1),
2219 icVGSEquIgsOffset (-1),
2223 f_DrainEquDrainNodePtr(0),
2224 f_DrainEquDrainPrimeNodePtr(0),
2225 f_DrainEquIdsPtr(0),
2228 f_GateEquGateNodePtr(0),
2229 f_GateEquBulkNodePtr(0),
2230 f_GateEquDrainPrimeNodePtr(0),
2231 f_GateEquSourcePrimeNodePtr(0),
2232 f_GateEquChargeVarPtr(0),
2236 f_SourceEquSourceNodePtr(0),
2237 f_SourceEquSourcePrimeNodePtr(0),
2238 f_SourceEquIbsPtr(0),
2239 f_SourceEquIdsPtr(0),
2240 f_SourceEquIgsPtr(0),
2243 f_BulkEquGateNodePtr(0),
2244 f_BulkEquBulkNodePtr(0),
2245 f_BulkEquDrainPrimeNodePtr(0),
2246 f_BulkEquSourcePrimeNodePtr(0),
2247 f_BulkEquChargeVarPtr(0),
2251 f_DrainPrimeEquDrainNodePtr(0),
2252 f_DrainPrimeEquGateNodePtr(0),
2253 f_DrainPrimeEquBulkNodePtr(0),
2254 f_DrainPrimeEquDrainPrimeNodePtr(0),
2255 f_DrainPrimeEquSourcePrimeNodePtr(0),
2256 f_DrainPrimeEquChargeVarPtr(0),
2259 f_SourcePrimeEquGateNodePtr(0),
2260 f_SourcePrimeEquSourceNodePtr(0),
2261 f_SourcePrimeEquBulkNodePtr(0),
2262 f_SourcePrimeEquDrainPrimeNodePtr(0),
2263 f_SourcePrimeEquSourcePrimeNodePtr(0),
2264 f_SourcePrimeEquChargeVarPtr(0),
2267 f_ChargeEquChargeVarPtr(0),
2268 f_ChargeEquDrainPrimeNodePtr(0),
2269 f_ChargeEquGateNodePtr(0),
2270 f_ChargeEquSourcePrimeNodePtr(0),
2271 f_ChargeEquBulkNodePtr(0),
2276 f_icVBSEquIbsPtr(0),
2281 f_icVDSEquIdsPtr(0),
2286 f_icVGSEquIgsPtr(0),
2289 q_DrainEquDrainNodePtr(0),
2290 q_DrainEquDrainPrimeNodePtr(0),
2291 q_DrainEquIdsPtr(0),
2294 q_GateEquGateNodePtr(0),
2295 q_GateEquBulkNodePtr(0),
2296 q_GateEquDrainPrimeNodePtr(0),
2297 q_GateEquSourcePrimeNodePtr(0),
2298 q_GateEquChargeVarPtr(0),
2302 q_SourceEquSourceNodePtr(0),
2303 q_SourceEquSourcePrimeNodePtr(0),
2304 q_SourceEquIbsPtr(0),
2305 q_SourceEquIdsPtr(0),
2306 q_SourceEquIgsPtr(0),
2309 q_BulkEquGateNodePtr(0),
2310 q_BulkEquBulkNodePtr(0),
2311 q_BulkEquDrainPrimeNodePtr(0),
2312 q_BulkEquSourcePrimeNodePtr(0),
2313 q_BulkEquChargeVarPtr(0),
2317 q_DrainPrimeEquDrainNodePtr(0),
2318 q_DrainPrimeEquGateNodePtr(0),
2319 q_DrainPrimeEquBulkNodePtr(0),
2320 q_DrainPrimeEquDrainPrimeNodePtr(0),
2321 q_DrainPrimeEquSourcePrimeNodePtr(0),
2322 q_DrainPrimeEquChargeVarPtr(0),
2325 q_SourcePrimeEquGateNodePtr(0),
2326 q_SourcePrimeEquSourceNodePtr(0),
2327 q_SourcePrimeEquBulkNodePtr(0),
2328 q_SourcePrimeEquDrainPrimeNodePtr(0),
2329 q_SourcePrimeEquSourcePrimeNodePtr(0),
2330 q_SourcePrimeEquChargeVarPtr(0),
2333 q_ChargeEquChargeVarPtr(0),
2334 q_ChargeEquDrainPrimeNodePtr(0),
2335 q_ChargeEquGateNodePtr(0),
2336 q_ChargeEquSourcePrimeNodePtr(0),
2337 q_ChargeEquBulkNodePtr(0),
2342 q_icVBSEquIbsPtr(0),
2347 q_icVDSEquIdsPtr(0),
2352 q_icVGSEquIgsPtr(0),
2355 blockHomotopyID (0),
2356 randomPerturb (0.0),
2358 updateTemperatureCalled_ (false)
2420 #ifdef Xyce_DEBUG_DEVICE
2423 Xyce::dout() <<
"Instance::Instance jacStampMap_DS_SC" << std::endl;
2426 Xyce::dout() <<
"jacStamp_DC_SC[ " <<
jacMap_DC_SC[k] <<
" ] = { ";
2431 Xyce::dout() <<
"}" << std::endl;
2434 Xyce::dout() <<
"Instance::Instance jacStampMap_DS" << std::endl;
2435 for (
int k = 0; k<
jacMap_DC.size(); ++k )
2437 Xyce::dout() <<
"jacStamp_DC[ " <<
jacMap_DC[k] <<
" ] = { ";
2438 for (
int q = 0; q <
jacMap2_DC[k].size(); ++q )
2442 Xyce::dout() <<
"}" << std::endl;
2445 Xyce::dout() <<
"Instance::Instance jacStampMap_SC" << std::endl;
2446 for (
int k = 0; k<
jacMap_SC.size(); ++k )
2448 Xyce::dout() <<
"jacStamp_SC[ " <<
jacMap_SC[k] <<
" ] = { ";
2449 for (
int q = 0; q <
jacMap2_SC[k].size(); ++q )
2453 Xyce::dout() <<
"}" << std::endl;
2456 Xyce::dout() <<
"Instance::Instance jacStampMap" << std::endl;
2457 for (
int k = 0; k<
jacMap.size(); ++k )
2459 Xyce::dout() <<
"jacStamp[ " <<
jacMap[k] <<
" ] = { ";
2460 for (
int q = 0; q <
jacMap2[k].size(); ++q )
2464 Xyce::dout() <<
"}" << std::endl;
2494 if (
given(
"NQSMOD"))
2496 std::string msg =
"Instance::Instance";
2497 msg +=
" nsqMod = 1. Not allowed yet. Setting to 0.\n";
2498 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
2503 UserWarning(*
this) <<
"Channel length out of range";
2508 UserWarning(*
this) <<
"Channel width out of range";
2526 int numExtraCol = 0;
2527 int qCol = -1, icVBSCol = -1, icVDSCol = -1, icVGSCol = -1;
2536 icVBSCol = currentCol;
2542 icVDSCol = currentCol;
2548 icVGSCol = currentCol;
2630 numNonZeros = 5 + (
nqsMod ? 1:0 );
2645 numNonZeros = 5 + (
nqsMod ? 1:0 );
2709 std::vector< std::vector<int> > jacStampSpecialMergedTemp;
2710 std::vector<int> jacSpecialMapTemp;
2711 std::vector< std::vector<int> > jacSpecialMapTemp2;
2714 jacStampSpecialMergedTemp, jacSpecialMapTemp, jacSpecialMapTemp2,
2717 jacStampMap( jacStampSpecialMergedTemp, jacSpecialMapTemp, jacSpecialMapTemp2,
2758 #ifdef Xyce_DEBUG_DEVICE
2761 Xyce::dout() <<
"Instance::Instance jacStampSpecial" << std::endl;
2764 Xyce::dout() <<
"jacSpecialMap[" <<
jacSpecialMap[k] <<
" ] = { ";
2769 Xyce::dout() <<
"}" << std::endl;
2772 Xyce::dout() <<
"Instance::Instance jacStampSpecialMerged" << std::endl;
2780 Xyce::dout() <<
"}" << std::endl;
2808 const std::vector<int> & extLIDVecRef )
2821 #ifdef Xyce_DEBUG_DEVICE
2824 Xyce::dout() << section_divider << std::endl;
2825 Xyce::dout() <<
" In Instance::register LIDs\n\n";
2826 Xyce::dout() <<
" name = " <<
getName() << std::endl;
2827 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
2828 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
2864 DevelFatal(*this).in(
"Instance::registerLIDs")
2865 <<
"Tried to specify an initial condition on V_Bulk_Source when Bulk and Source nodes are the same node";
2874 DevelFatal(*this).in(
"Instance::registerLIDs")
2875 <<
"Tried to specify an initial condition on V_Drain_Source when Drain and Source nodes are the same node";
2884 DevelFatal(*this).in(
"Instance::registerLIDs")
2885 <<
"Tried to specify an initial condition on V_Gate_Source when Gate and Source nodes are the same node";
2890 #ifdef Xyce_DEBUG_DEVICE
2893 Xyce::dout() <<
"\n local variable indices:\n";
2894 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
2895 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
2896 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
2897 Xyce::dout() <<
" li_Bulk = " <<
li_Bulk << std::endl;
2900 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
2902 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
2905 Xyce::dout() <<
" li_Charge = " <<
li_Charge << std::endl;
2908 Xyce::dout() <<
" li_Ibs = " <<
li_Ibs << std::endl;
2911 Xyce::dout() <<
" li_Ids = " <<
li_Ids << std::endl;
2914 Xyce::dout() <<
" li_Igs = " <<
li_Igs << std::endl;
2915 Xyce::dout() << section_divider << std::endl;
2997 #ifdef Xyce_DEBUG_DEVICE
3000 Xyce::dout() << std::endl;
3001 Xyce::dout() << section_divider << std::endl;
3002 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
3003 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3004 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
3031 #ifdef Xyce_DEBUG_DEVICE
3034 Xyce::dout() <<
" Local State indices:" << std::endl;
3035 Xyce::dout() << std::endl;
3036 Xyce::dout() <<
" li_state_qb = " <<
li_state_qb << std::endl;
3037 Xyce::dout() <<
" li_state_qg = " <<
li_state_qg << std::endl;
3038 Xyce::dout() <<
" li_state_qd = " <<
li_state_qd << std::endl;
3039 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs << std::endl;
3040 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd << std::endl;
3041 Xyce::dout() <<
" li_state_qcheq = " <<
li_state_qcheq << std::endl;
3042 Xyce::dout() <<
" li_state_qcdump = " <<
li_state_qcdump << std::endl;
3043 Xyce::dout() <<
" li_state_qdef = " <<
li_state_qdef << std::endl;
3044 Xyce::dout() << section_divider << std::endl;
3114 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3115 ": NQSMOD not supported for DIRECT MATRIX ACCESS\n" );
3118 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3119 "Instance::jacobianStamp should not get here!\n" );
3135 std::vector<int> map;
3136 std::vector< std::vector<int> > map2;
3182 #ifdef Xyce_DEBUG_DEVICE
3185 Xyce::dout() <<
"Instance::registerJacLIDs map selected" << std::endl;
3186 for (
int k = 0; k<map.size(); ++k )
3188 Xyce::dout() <<
"map[ " << k <<
"] = " << map[k] <<
" map2[] = { ";
3189 for (
int q = 0; q < map2[k].size(); ++q )
3191 Xyce::dout() << map2[k][q] <<
" ";
3193 Xyce::dout() <<
"}" << std::endl;
3196 for(
int k = 0; k<jacLIDVec.size(); ++k )
3198 Xyce::dout() <<
"jacLIDVec[ " << k <<
"] = { ";
3199 for (
int q = 0; q < jacLIDVec[k].size(); ++q )
3201 Xyce::dout() << jacLIDVec[k][q] <<
" ";
3203 Xyce::dout() <<
"}" << std::endl;
3333 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3334 ": NQSMOD not supported.\n" );
3348 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
3597 double tmp, tmp1, tmp2, tmp3, Eg;
3598 double T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
3599 double delTemp, TRatio, Inv_L, Inv_W, Inv_LW;
3602 double Nvtm, SourceSatCurrent, DrainSatCurrent;
3609 bool bsuccess =
true;
3611 #ifdef Xyce_DEBUG_DEVICE
3614 Xyce::dout() << std::endl << subsection_divider << std::endl;
3615 Xyce::dout() <<
"Instance::updateTemperature\n";
3616 Xyce::dout() <<
"name = " <<
getName() << std::endl;
3621 if (temp_tmp != -999.0)
temp = temp_tmp;
3647 delTemp = temp - Tnom;
3658 lout() <<
"Temperature effect has caused cj to be negative. Cj clamped to zero.\n" << std::endl;
3671 lout() <<
"Temperature effect has caused cjsw to be negative. Cjsw clamped to zero.\n" << std::endl;
3684 lout() <<
"Temperature effect has caused cjswg to be negative. Cjswg clamped to zero.\n" << std::endl;
3692 lout() <<
"Temperature effect has caused pb to be < 0.01. Pb clamped to 0.01.\n" << std::endl;
3700 lout() <<
"Temperature effect has caused pbsw to be < 0.01. Pbsw clamped to 0.01.\n" << std::endl;
3708 lout() <<
"Temperature effect has caused pbswg to be < 0.01. Pbswg clamped to 0.01.\n" << std::endl;
3718 std::list<SizeDependParam*>::iterator it_dpL =
3720 std::list<SizeDependParam*>::iterator end_dpL =
3725 for( ; it_dpL != end_dpL; ++it_dpL )
3726 if( (*it_dpL)->Length ==
l && (*it_dpL)->Width ==
w )
3772 UserWarning0(*
this) <<
"Effective channel length <= 0";
3784 UserWarning0(*
this) <<
"Effective channel length for C-V <= 0";
3790 UserWarning(*
this) <<
"Effective channel width for C-V <= 0";
4226 T0 = (TRatio - 1.0);
4241 #ifdef CHECK_MODEL_DONE
4242 if (checkModel((*M_iter), iterI, ckt))
4244 UserError0(*
this) <<
"Error(s) detected during V3.2 parameter checking for " << name.c_str() <<
" in model " <<
model_.name;
4287 UserWarning0(*
this) <<
"k1 should be specified with k2.";
4293 UserWarning0(*
this) <<
"k2 should be specified with k1.";
4299 UserWarning0(*
this) <<
"nsub is ignored because k1 or k2 is given.";
4304 UserWarning0(*
this) <<
"xt is ignored because k1 or k2 is given.";
4309 UserWarning0(*
this) <<
"vbx is ignored because k1 or k2 is given.";
4314 UserWarning0(*
this) <<
"gamma1 is ignored because k1 or k2 is given.";
4319 UserWarning0(*
this) <<
"gamma2 is ignored because k1 or k2 is given.";
4392 T2 = (T0 + 2.0 * T0 * T0);
4405 T2 = T1 * (1.0 + 2.0 * T1);
4410 T2 = T1 * (1.0 + 2.0 * T1);
4420 T3 = T1 * (1.0 + 2.0 * T1);
4425 T3 = T1 * (1.0 + 2.0 * T1);
4450 SourceSatCurrent = 1.0e-14;
4459 if ((SourceSatCurrent > 0.0) && (
model_.
ijth > 0.0))
4468 DrainSatCurrent = 1.0e-14;
4477 if ((DrainSatCurrent > 0.0) && (
model_.
ijth > 0.0))
4498 bool bsuccess =
true;
4501 double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
4504 double VgstNVt(0.0), ExpVgst(0.0);
4506 double czbd(0.0), czbdsw(0.0), czbdswg(0.0), czbs(0.0), czbssw(0.0), czbsswg(0.0);
4507 double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
4509 double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
4511 double MJ(0.0), MJSW(0.0), MJSWG(0.0);
4514 double Vds(0.0), Vgs(0.0), Vbs(0.0);
4515 double Vgs_eff(0.0), Vfb(0.0);
4516 double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
4517 double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
4522 double n(0.0), dn_dVb(0.0), dn_dVd(0.0), voffcv(0.0), noff(0.0), dnoff_dVd(0.0), dnoff_dVb(0.0);
4523 double ExpArg(0.0), V0(0.0), CoxWLcen(0.0), QovCox(0.0), LINK(0.0);
4524 double DeltaPhi(0.0);
4526 double Cox(0.0), Tox(0.0), Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
4527 double Ccen(0.0), Coxeff(0.0), dCoxeff_dVg(0.0), dCoxeff_dVd(0.0), dCoxeff_dVb(0.0);
4528 double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
4530 double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
4535 double EsatL(0.0), dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
4537 double dVdsat_dVg(0.0), dVdsat_dVb(0.0), dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
4538 double dVasat_dVg(0.0), dVasat_dVb(0.0), dVasat_dVd(0.0), Va(0.0);
4540 double dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
4541 double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
4544 double One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
4546 double T0(0.0), dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
4547 double T1(0.0), dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
4548 double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
4549 double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
4558 double T11(0.0), T12(0.0);
4560 double tmp(0.0), Abulk(0.0), dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
4562 double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
4563 double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
4565 double Xdep(0.0), dXdep_dVb(0.0), lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
4566 double Delt_vth(0.0), dDelt_vth_dVb(0.0);
4568 double Theta0(0.0), dTheta0_dVb(0.0);
4570 double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
4572 double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
4574 double Lambda(0.0), dLambda_dVg(0.0);
4578 double Vgsteff(0.0), dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
4579 double Vdseff(0.0), dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
4580 double VdseffCV(0.0), dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
4581 double diffVds(0.0);
4583 double dAbulk_dVg(0.0);
4584 double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
4585 double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
4586 double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
4587 double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
4588 double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
4589 double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
4592 double Gds(0.0), Gmb(0.0);
4595 double Gbd(0.0), Gbg(0.0), Gbb(0.0);
4596 double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
4597 double CoxWovL(0.0);
4598 double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
4599 double Vgst2Vtm(0.0), VdsatCV(0.0);
4601 double dVdsatCV_dVg(0.0), dVdsatCV_dVb(0.0);
4602 double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
4603 double AbulkCV(0.0), dAbulkCV_dVb(0.0);
4605 double gtau_diff(0.0), gtau_drift(0.0);
4610 double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
4612 double Qac0(0.0), Qsub0(0.0);
4613 double dQac0_dVg(0.0), dQac0_dVb(0.0), dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
4614 double von_local(0.0);
4628 #ifdef Xyce_DEBUG_DEVICE
4631 Xyce::dout() << subsection_divider << std::endl;
4632 Xyce::dout() <<
" Instance::updateIntermediateVars\n";
4633 Xyce::dout() <<
" name = " <<
getName();
4635 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
4636 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4637 Xyce::dout() <<
" " << std::endl;
4676 #ifdef Xyce_DEBUG_DEVICE
4679 Xyce::dout() <<
" Vg = " <<
Vg << std::endl;
4680 Xyce::dout() <<
" Vb = " <<
Vb << std::endl;
4681 Xyce::dout() <<
" Vs = " <<
Vs << std::endl;
4682 Xyce::dout() <<
" Vd = " <<
Vd << std::endl;
4683 Xyce::dout() <<
" Vsp = " <<
Vsp << std::endl;
4684 Xyce::dout() <<
" Vdp = " <<
Vdp << std::endl;
4685 Xyce::dout() <<
" Qtotal = " <<
Qtotal << std::endl;
4742 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
4810 #ifdef Xyce_DEBUG_DEVICE
4813 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4814 Xyce::dout() <<
" von_local = " << von_local << std::endl;
4815 Xyce::dout() <<
" CONSTvt0 = " <<
CONSTvt0 << std::endl;
4816 Xyce::dout() <<
" vcrit = " <<
model_.
vcrit << std::endl;
4817 Xyce::dout().width(3);
4819 Xyce::dout().width(5);Xyce::dout() <<
getName();
4820 Xyce::dout() <<
" old :";
4821 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4823 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4825 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4827 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4828 Xyce::dout() <<
vbd_old << std::endl;
4829 Xyce::dout().width(3);
4831 Xyce::dout().width(5);Xyce::dout() <<
getName();
4832 Xyce::dout() <<
" Blim:";
4833 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4834 Xyce::dout() <<
vgs;
4835 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4836 Xyce::dout() <<
vds;
4837 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4838 Xyce::dout() <<
vbs;
4839 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4840 Xyce::dout() <<
vbd << std::endl;
4841 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4881 #ifdef Xyce_NEW_ORIG_TEST
4883 double vds_diff = fabs(vds -
vds_orig);
4887 bool noOrigFlag_vgs = 0;
4888 bool noOrigFlag_vds = 0;
4889 bool noOrigFlag_vbs = 0;
4890 bool noOrigFlag_vgd = 0;
4892 if (vgs_diff != 0.0)
4896 if ( fabs(vgs_diff/
vgs_orig) > reltol) noOrigFlag_vgs = 1;
4900 if ( fabs(vgs_diff) > voltTol ) noOrigFlag_vgs = 1;
4904 if (vds_diff != 0.0)
4908 if ( fabs(vds_diff/
vds_orig) > reltol) noOrigFlag_vds = 1;
4912 if ( fabs(vds_diff) > voltTol ) noOrigFlag_vds = 1;
4916 if (vbs_diff != 0.0)
4920 if ( fabs(vbs_diff/
vbs_orig) > reltol) noOrigFlag_vbs = 1;
4924 if ( fabs(vbs_diff) > voltTol ) noOrigFlag_vbs = 1;
4928 if (vgd_diff != 0.0)
4932 if ( fabs(vgd_diff/
vgd_orig) > reltol) noOrigFlag_vgd = 1;
4936 if ( fabs(vgd_diff) > voltTol ) noOrigFlag_vgd = 1;
4940 origFlag = !( noOrigFlag_vgs || noOrigFlag_vds ||
4941 noOrigFlag_vbs || noOrigFlag_vgd);
4951 #ifdef Xyce_DEBUG_DEVICE
4954 Xyce::dout().width(3);
4956 Xyce::dout().width(5);Xyce::dout() <<
getName();
4957 Xyce::dout() <<
" Alim:";
4958 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4959 Xyce::dout() <<
vgs;
4960 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4961 Xyce::dout() <<
vds;
4962 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4963 Xyce::dout() <<
vbs;
4964 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4965 Xyce::dout() <<
vbd;
4966 if (
origFlag) Xyce::dout() <<
" SAME";
4967 else Xyce::dout() <<
" DIFF";
4968 Xyce::dout() << std::endl;
4969 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4990 #ifdef Xyce_DEBUG_DEVICE
4993 Xyce::dout() <<
" mod type = " <<
model_.
modType << std::endl;
4994 Xyce::dout() <<
"dtype = " <<
model_.
dtype << std::endl;
4995 Xyce::dout() <<
" vbs = " << vbs << std::endl;
4996 Xyce::dout() <<
" vds = " << vds << std::endl;
4997 Xyce::dout() <<
" vgs = " <<
vgs << std::endl;
4999 Xyce::dout() <<
" vbd = " <<
vbd << std::endl;
5000 Xyce::dout() <<
" vgd = " <<
vgd << std::endl;
5001 Xyce::dout() <<
" vgb = " <<
vgs << std::endl;
5002 Xyce::dout() <<
" qdef = " <<
qdef << std::endl;
5011 SourceSatCurrent = 1.0e-14;
5021 if (SourceSatCurrent <= 0.0)
5030 evbs = exp(vbs / Nvtm);
5038 evbs = exp(vbs / Nvtm);
5055 DrainSatCurrent = 1.0e-14;
5065 if (DrainSatCurrent <= 0.0)
5074 evbd = exp(
vbd / Nvtm);
5082 evbd = exp(
vbd / Nvtm);
5117 #ifdef Xyce_DEBUG_DEVICE
5120 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
5122 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " << Vds << std::endl;
5123 Xyce::dout() <<
"HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
5147 #ifdef Xyce_DEBUG_DEVICE
5150 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << Vds << std::endl;
5151 Xyce::dout() <<
"HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
5159 dVbseff_dVb = 0.5 * (1.0 + T0 /
T1global);
5161 if (Vbseff < Vbs) Vbseff = Vbs;
5167 dPhis_dVb = -T0 * T0;
5169 dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis /
paramPtr->
phis3;
5175 sqrtPhis = sqrt(Phis);
5176 dsqrtPhis_dVb = -0.5 / sqrtPhis;
5196 T4 = 1.0 / (3.0 + 8.0 * T0);
5197 T1 = (1.0 + 3.0 * T0) * T4;
5202 dlt1_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
5212 T4 = 1.0 / (3.0 + 8.0 * T0);
5213 T1 = (1.0 + 3.0 * T0) * T4;
5218 dltw_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
5224 Theta0 = T1 * (1.0 + 2.0 * T1);
5225 dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
5226 dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
5231 Theta0 = T1 * (1.0 + 2.0 * T1);
5243 T2 = T1 * (1.0 + 2.0 * T1);
5244 dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
5245 dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
5250 T2 = T1 * (1.0 + 2.0 * T1);
5269 T9 = 1.0 / (3.0 - 2.0e4 * T3);
5270 T3 = (2.0e-4 - T3) * T9;
5279 DIBL_Sft = dDIBL_Sft_dVd * Vds;
5293 dVth_dVd = -dDIBL_Sft_dVd;
5304 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
5310 T0 = 1.0 / (3.0 + 8.0 * tmp4);
5311 n = (1.0 + 3.0 * tmp4) * T0;
5313 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
5326 T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1);
5328 T2 = T1 * (T4 - 1.0);
5329 T3 = 0.5 * T2 * T2 / T1;
5330 T7 = 1.12 - T3 - 0.05;
5331 T6 = sqrt(T7 * T7 + 0.224);
5332 T5 = 1.12 - 0.5 * (T7 + T6);
5334 dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
5341 Vgst = Vgs_eff - Vth;
5344 T10 = 2.0 * n * Vtm;
5345 VgstNVt = Vgst / T10;
5353 dVgsteff_dVd = -dVth_dVd;
5354 dVgsteff_dVb = -dVth_dVb;
5361 dVgsteff_dVg = Vgsteff / (n * Vtm);
5362 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd);
5363 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb);
5368 ExpVgst = exp(VgstNVt);
5369 T1 = T10 * log(1.0 + ExpVgst);
5370 dT1_dVg = ExpVgst / (1.0 + ExpVgst);
5371 dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + T1 / n * dn_dVb;
5372 dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + T1 / n * dn_dVd;
5375 T2 = 1.0 - T10 * dT2_dVg;
5377 dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd)
5378 + (T2 - 1.0) / n * dn_dVd;
5380 dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb)
5381 + (T2 - 1.0) / n * dn_dVb;
5386 dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 *
dVgs_eff_dVg;
5387 dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3;
5388 dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3;
5399 T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
5400 Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
5415 T1 = 1.0 / (17.0 + 20.0 * T0);
5424 dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb;
5427 tmp1 = Leff + 2.0 * T9;
5433 dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
5437 Abulk0 = 1.0 + T1 * T2;
5438 dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
5441 dAbulk_dVg = -T1 * T8;
5442 Abulk = Abulk0 + dAbulk_dVg * Vgsteff;
5443 dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
5447 T9 = 1.0 / (3.0 - 20.0 * Abulk0);
5448 Abulk0 = (0.2 - Abulk0) * T9;
5449 dAbulk0_dVb *= T9 * T9;
5454 T9 = 1.0 / (3.0 - 20.0 * Abulk);
5455 Abulk = (0.2 - Abulk) * T9;
5464 T0 = 1.0 / (1.0 + T2);
5469 T1 = 1.0 / (0.8 + T2);
5470 T0 = (17.0 + 20.0 * T2) * T1;
5475 dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb;
5476 dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
5483 T0 = Vgsteff + Vth + Vth;
5488 dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
5489 dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb +
paramPtr->
uc * T3;
5504 T0 = Vgsteff + Vth + Vth;
5511 dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
5512 dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb +
paramPtr->
uc * T4;
5521 T9 = 1.0 / (7.0 + 10.0 * T5);
5522 Denomi = (0.6 + T5) * T9;
5530 T9 = -
ueff / Denomi;
5531 dueff_dVg = T9 * dDenomi_dVg;
5532 dueff_dVd = T9 * dDenomi_dVd;
5533 dueff_dVb = T9 * dDenomi_dVb;
5537 WVCoxRds = WVCox * Rds;
5540 EsatL = Esat * Leff;
5542 dEsatL_dVg = T0 * dueff_dVg;
5543 dEsatL_dVd = T0 * dueff_dVd;
5544 dEsatL_dVb = T0 * dueff_dVb;
5558 T2 = sqrt(T1 * T1 + 0.0004 * T0);
5559 Lambda =
paramPtr->
a2 + T0 - 0.5 * (T1 + T2);
5560 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
5566 Lambda = 0.5 * (T1 + T2);
5567 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
5570 Vgst2Vtm = Vgsteff + 2.0 * Vtm;
5573 tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
5574 tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
5578 tmp2 = dWeff_dVg / Weff;
5579 tmp3 = dWeff_dVb / Weff;
5582 if ((Rds == 0.0) && (Lambda == 1.0))
5584 T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm);
5588 T3 = EsatL * Vgst2Vtm;
5591 dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
5592 dT0_dVd = -(Abulk * dEsatL_dVd) * T1;
5593 dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1;
5595 dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
5596 dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
5597 dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
5601 tmp1 = dLambda_dVg / (Lambda * Lambda);
5602 T9 = Abulk * WVCoxRds;
5605 T6 = Vgst2Vtm * WVCoxRds;
5606 T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda);
5607 dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1
5608 + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
5610 dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3)
5611 + (1.0 / Lambda - 1.0) * dAbulk_dVb);
5613 T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7;
5615 dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
5616 + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
5617 + T7 * tmp2 + T6 * dAbulk_dVg);
5619 dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb
5620 + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
5622 dT1_dVd = Abulk * dEsatL_dVd;
5624 T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
5625 dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
5626 + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
5628 dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
5629 dT2_dVd = Vgst2Vtm * dEsatL_dVd;
5631 T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
5632 Vdsat = (T1 - T3) / T0;
5634 dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) / T3;
5635 dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) / T3;
5636 dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) / T3;
5638 dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
5639 - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
5641 dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
5642 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
5644 dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
5650 dT1_dVg = dVdsat_dVg;
5651 dT1_dVd = dVdsat_dVd - 1.0;
5652 dT1_dVb = dVdsat_dVb;
5657 dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
5658 dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
5659 dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
5661 Vdseff = Vdsat - 0.5 * (T1 + T2);
5662 dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
5663 dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
5664 dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
5675 tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm;
5676 T9 = WVCoxRds * Vgsteff;
5678 T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
5680 T7 = 2.0 * WVCoxRds * tmp4;
5681 dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff)
5682 - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm
5683 + Vdsat * dAbulk_dVg);
5685 dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
5686 - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
5687 dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd;
5689 T9 = WVCoxRds * Abulk;
5690 T1 = 2.0 / Lambda - 1.0 + T9;
5691 dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
5692 dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
5695 dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
5696 dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
5697 dVasat_dVd = dT0_dVd / T1;
5699 if (Vdseff > Vds) Vdseff = Vds;
5701 diffVds = Vds - Vdseff;
5707 dT0_dVb = -T0 / Abulk * dAbulk_dVb;
5708 dT0_dVg = -T0 / Abulk * dAbulk_dVg;
5710 T2 = Vgsteff / EsatL;
5711 T1 = Leff * (Abulk + T2);
5712 dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg);
5713 dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL);
5714 dT1_dVd = -T2 * dEsatL_dVd / Esat;
5717 VACLM = T9 * diffVds;
5718 dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg
5719 + T1 * diffVds * dT0_dVg;
5721 dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds
5724 dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd);
5729 dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
5737 dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
5738 + Vgst2Vtm * Vdsat * dAbulk_dVg;
5740 dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
5741 dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
5744 dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
5745 dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
5746 dT1_dVd = Abulk * dVdsat_dVd;
5751 VADIBL = (Vgst2Vtm - T0 / T1) / T2;
5752 dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
5753 dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
5754 dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
5759 T3 = 1.0 / (1.0 + T7);
5767 T4 = 1.0 / (0.8 + T7);
5768 T3 = (17.0 + 20.0 * T7) * T4;
5770 dVADIBL_dVb = dVADIBL_dVb * T3 - VADIBL *
paramPtr->
pdiblb * T4 * T4;
5779 dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
5788 dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL);
5789 dT0_dVb = -T9 * dEsatL_dVb / EsatL;
5790 dT0_dVd = -T9 * dEsatL_dVd / EsatL;
5794 T1 = 1.0 / (17.0 + 20.0 * T9);
5795 T0 = (0.8 + T9) * T1;
5797 dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1;
5800 dT0_dVb = -T9 * dEsatL_dVb;
5801 dT0_dVd = -T9 * dEsatL_dVd;
5804 tmp1 = VACLM * VACLM;
5805 tmp2 = VADIBL * VADIBL;
5806 tmp3 = VACLM + VADIBL;
5808 T1 = VACLM * VADIBL / tmp3;
5810 dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3;
5811 dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3;
5812 dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3;
5814 Va = Vasat + T0 * T1;
5815 dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg;
5816 dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd;
5817 dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb;
5826 T1 = T0 * VASCBE / diffVds;
5827 dVASCBE_dVg = T1 * dVdseff_dVg;
5828 dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
5829 dVASCBE_dVb = T1 * dVdseff_dVb;
5834 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
5840 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
5845 beta =
ueff * CoxWovL;
5846 dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff;
5847 dbeta_dVd = CoxWovL * dueff_dVd;
5848 dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff;
5850 T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm;
5851 dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
5852 - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
5853 dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
5854 dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm;
5856 fgche1 = Vgsteff * T0;
5857 dfgche1_dVg = Vgsteff * dT0_dVg + T0;
5858 dfgche1_dVd = Vgsteff * dT0_dVd;
5859 dfgche1_dVb = Vgsteff * dT0_dVb;
5861 T9 = Vdseff / EsatL;
5863 dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
5864 dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
5865 dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
5867 gche = beta * fgche1 / fgche2;
5868 dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
5869 - gche * dfgche2_dVg) / fgche2;
5871 dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
5872 - gche * dfgche2_dVd) / fgche2;
5874 dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
5875 - gche * dfgche2_dVb) / fgche2;
5877 T0 = 1.0 + gche * Rds;
5881 dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0
5882 - Idl * gche / T0 * dRds_dVg ;
5884 dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0;
5885 dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb
5886 - Idl * dRds_dVb * gche) / T0;
5891 dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va;
5892 dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd
5893 - T9 * dVa_dVd) / Va;
5895 dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va;
5897 T9 = diffVds / VASCBE;
5901 Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
5902 Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd
5903 - T9 * dVASCBE_dVd) / VASCBE;
5904 Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb
5905 + T9 * dVASCBE_dVb) / VASCBE;
5907 Gds +=
Gm * dVgsteff_dVd;
5908 Gmb +=
Gm * dVgsteff_dVb;
5916 Isub = Gbd = Gbb = Gbg = 0.0;
5924 T1 = T2 * diffVds * exp(T0);
5925 T3 = T1 / diffVds * (T0 - 1.0);
5926 dT1_dVg = T3 * dVdseff_dVg;
5927 dT1_dVd = T3 * (dVdseff_dVd - 1.0);
5928 dT1_dVb = T3 * dVdseff_dVb;
5934 dT1_dVg = -T3 * dVdseff_dVg;
5935 dT1_dVd = T3 * (1.0 - dVdseff_dVd);
5936 dT1_dVb = -T3 * dVdseff_dVb;
5939 Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg;
5940 Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd;
5941 Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb;
5943 Gbd += Gbg * dVgsteff_dVd;
5944 Gbb += Gbg * dVgsteff_dVb;
5945 Gbg *= dVgsteff_dVg;
5985 dVbseff_dVb = -dPhis_dVb;
5990 Vgst = Vgs_eff - Vth;
5996 Arg1 = Vgs_eff - Vbseff - Vfb;
6017 else if (Vgst <= 0.0)
6020 T2 = sqrt(T1 * T1 + Arg1);
6025 T0 =
CoxWL * T1 / T2;
6041 One_Third_CoxWL =
CoxWL / 3.0;
6042 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
6047 Vdsat = Vgst / AbulkCV;
6049 dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
6058 T2 = -Two_Third_CoxWL * Vgst;
6063 T2 = -One_Third_CoxWL * dVdsat_dVb;
6073 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6081 Alphaz = Vgst / Vdsat;
6082 T1 = 2.0 * Vdsat - Vds;
6083 T2 = Vds / (3.0 * T1);
6087 T7 = 2.0 * Vds - T1 - 3.0 * T3;
6088 T8 = T3 - T1 - 2.0 * Vds;
6098 T11 = -
CoxWL * T5 * dVdsat_dVb;
6103 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6104 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6108 T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
6111 T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
6112 cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
6115 T9 = 2.0 * T4 * (1.0 + T5);
6116 T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) *
dVgs_eff_dVg;
6117 T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
6118 T12 = T4 * (2.0 * T2 + T5 - 1.0);
6119 T0 = -(T10 + T11 + T12);
6124 cbsb = -(cgsb + cdsb + T0);
6135 T2 = -Two_Third_CoxWL * Vgst;
6141 T2 = -One_Third_CoxWL * dVdsat_dVb;
6145 T3 = 0.4 * Two_Third_CoxWL;
6153 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6160 Alphaz = Vgst / Vdsat;
6161 T1 = 2.0 * Vdsat - Vds;
6162 T2 = Vds / (3.0 * T1);
6170 tmp = -
CoxWL * T5 * dVdsat_dVb;
6175 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6176 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6178 T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + 1.2 * Vds * Vds;
6180 T7 = Vds - T1 - T8 * T6;
6184 tmp1 = T4*(2.0 - 4.0 * tmp * T6 + T8 *(16.0 * Vdsat - 6.0 *Vds));
6188 T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
6189 cddb = T4 * (2.0 - (1.0 / (3.0 * T1
6190 * T1) + 2.0 * tmp) * T6 + T8
6191 * (6.0 * Vdsat - 2.4 * Vds));
6195 T7 = 2.0 * (T1 + T3);
6198 T0 = 4.0 * T4 * (1.0 - T5);
6199 T12 = (-T7 * dAlphaz_dVg -
cdgb
6201 T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
6202 T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5)
6205 tmp = -(T10 + T11 + T12);
6219 T2 = -Two_Third_CoxWL * Vgst;
6224 T2 = -One_Third_CoxWL * dVdsat_dVb;
6230 T4 = One_Third_CoxWL * dVth_dVb;
6234 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6241 Alphaz = Vgst / Vdsat;
6242 T1 = 2.0 * Vdsat - Vds;
6243 T2 = Vds / (3.0 * T1);
6253 tmp = -
CoxWL * T5 * dVdsat_dVb;
6258 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6259 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6265 T0 = T4 * (2.0 * T5 - 2.0);
6268 T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
6269 cddb = T4 * (1.0 - 2.0 * T2 - T5);
6285 dVbseffCV_dVb = 1.0;
6290 dVbseffCV_dVb = -dPhis_dVb;
6301 VgstNVt = (Vgst - voffcv) / T0;
6305 Vgsteff = Vgst - voffcv;
6307 dVgsteff_dVd = -dVth_dVd;
6308 dVgsteff_dVb = -dVth_dVb;
6314 dVgsteff_dVd = Vgsteff / noff;
6315 dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
6316 dVgsteff_dVd *= dnoff_dVd;
6320 ExpVgst = exp(VgstNVt);
6321 Vgsteff = T0 * log(1.0 + ExpVgst);
6322 dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
6323 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
6324 / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
6325 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
6326 / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
6333 Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff;
6340 Cgb = -
CoxWL * (dVbseffCV_dVb + dVgsteff_dVb);
6345 T1 = sqrt(T0 * T0 + Arg1);
6346 T2 =
CoxWL * T0 / T1;
6351 Cgd = -T2 * dVgsteff_dVd;
6352 Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb);
6359 One_Third_CoxWL =
CoxWL / 3.0;
6360 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
6363 VdsatCV = Vgsteff / AbulkCV;
6367 dVdsatCV_dVg = 1.0 / AbulkCV;
6368 dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
6369 T0 = Vgsteff - VdsatCV / 3.0;
6370 dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0;
6371 dT0_dVb = -dVdsatCV_dVb / 3.0;
6373 Cgg1 =
CoxWL * dT0_dVg;
6374 Cgb1 =
CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb;
6375 Cgd1 = Cgg1 * dVgsteff_dVd;
6376 Cgg1 *= dVgsteff_dVg;
6381 T0 = VdsatCV - Vgsteff;
6382 dT0_dVg = dVdsatCV_dVg - 1.0;
6383 dT0_dVb = dVdsatCV_dVb;
6384 qbulk += One_Third_CoxWL * T0;
6385 Cbg1 = One_Third_CoxWL * dT0_dVg;
6386 Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb;
6387 Cbd1 = Cbg1 * dVgsteff_dVd;
6388 Cbg1 *= dVgsteff_dVg;
6395 else T0 = -One_Third_CoxWL;
6397 qsrc = T0 * Vgsteff;
6398 Csg = T0 * dVgsteff_dVg;
6399 Csb = T0 * dVgsteff_dVb;
6400 Csd = T0 * dVgsteff_dVd;
6408 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20);
6411 dT3_dVg = -12.0 * T2 * T2 * AbulkCV;
6412 dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5;
6413 dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff;
6416 Cgg1 =
CoxWL * (1.0 + dT3_dVg);
6417 Cgb1 =
CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb;
6418 Cgd1 =
CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd;
6419 Cgg1 *= dVgsteff_dVg;
6424 qbulk +=
CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3);
6425 Cbg1 = -
CoxWL * ((1.0 - AbulkCV) * dT3_dVg);
6426 Cbb1 = -
CoxWL * ((1.0 - AbulkCV) * dT3_dVb
6427 + (0.5 * Vds - T3) * dAbulkCV_dVb)
6428 + Cbg1 * dVgsteff_dVb;
6429 Cbd1 = -
CoxWL * (1.0 - AbulkCV) * dT3_dVd
6430 + Cbg1 * dVgsteff_dVd;
6431 Cbg1 *= dVgsteff_dVg;
6439 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0 - T0 * T0 / T1);
6440 Csg = -
CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 * AbulkCV);
6441 Csb = -
CoxWL * (0.25 * Vds * dAbulkCV_dVb
6442 - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0)
6443 * dAbulkCV_dVb) + Csg * dVgsteff_dVb;
6444 Csd = -
CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0
6445 / T1 / T1 * (4.0 * Vgsteff - T0))
6446 + Csg * dVgsteff_dVd;
6447 Csg *= dVgsteff_dVg;
6452 T2 = 0.5 *
CoxWL / (T1 * T1);
6453 T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
6454 * (Vgsteff - 4.0 * T0 / 3.0))
6455 - 2.0 * T0 * T0 * T0 / 15.0;
6457 T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
6459 Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
6460 * Vgsteff - 8.0 * T0 / 3.0)
6461 + 2.0 * T0 * T0 / 3.0);
6462 Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb
6463 + Csg * dVgsteff_dVb;
6464 Csd = (qsrc / T1 + T2 * T4) * AbulkCV
6465 + Csg * dVgsteff_dVd;
6466 Csg *= dVgsteff_dVg;
6471 Csg = -0.5 * (Cgg1 + Cbg1);
6472 Csb = -0.5 * (Cgb1 + Cbb1);
6473 Csd = -0.5 * (Cgd1 + Cbd1);
6497 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
6498 T2 = -CONSTDELTA_3 / T0;
6502 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
6503 T2 = CONSTDELTA_3 / T0;
6506 T1 = 0.5 * (1.0 + V3 / T0);
6507 Vfbeff = Vfb - 0.5 * (V3 + T0);
6509 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
6510 Qac0 =
CoxWL * (Vfbeff - Vfb);
6511 dQac0_dVg =
CoxWL * dVfbeff_dVg;
6512 dQac0_dVb =
CoxWL * dVfbeff_dVb;
6515 T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
6528 T1 = sqrt(T0 * T0 + T3);
6529 T2 =
CoxWL * T0 / T1;
6534 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
6535 dQsub0_dVd = -T2 * dVgsteff_dVd;
6536 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb);
6540 VdsatCV = Vgsteff / AbulkCV;
6543 T0 = sqrt(V4 * V4 + 4.0 * CONSTDELTA_4 * VdsatCV);
6544 VdseffCV = VdsatCV - 0.5 * (V4 + T0);
6545 T1 = 0.5 * (1.0 + V4 / T0);
6546 T2 = CONSTDELTA_4 / T0;
6547 T3 = (1.0 - T1 - T2) / AbulkCV;
6550 dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
6555 dVdseffCV_dVg = 0.0;
6556 dVdseffCV_dVb = 0.0;
6559 T0 = AbulkCV * VdseffCV;
6560 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20);
6564 T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
6565 T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5);
6566 T6 = 12.0 * T2 * T2 * Vgsteff;
6568 qinoi = -
CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3);
6569 qgate =
CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
6570 Cgg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6571 Cgd1 =
CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
6572 Cgb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6573 + Cgg1 * dVgsteff_dVb;
6574 Cgg1 *= dVgsteff_dVg;
6578 T4 = -T7 * (T4 - 1.0);
6580 T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
6581 Cbg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6582 Cbd1 =
CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
6583 Cbb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6584 + Cbg1 * dVgsteff_dVb;
6585 Cbg1 *= dVgsteff_dVg;
6590 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0 - T0 * T0 / T1);
6591 T7 = (4.0 * Vgsteff - T0) / (T1 * T1);
6592 T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
6593 T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
6594 T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
6595 Csg =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6596 Csd =
CoxWL * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
6597 Csb =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6598 +
Csg * dVgsteff_dVb;
6599 Csg *= dVgsteff_dVg;
6604 T2 = 0.5 *
CoxWL / (T1 * T1);
6605 T3 = Vgsteff *(2.0 * T0 *T0/3.0 +Vgsteff *(Vgsteff - 4.0 *T0/ 3.0))
6606 - 2.0 * T0 * T0 * T0 / 15.0;
6608 T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
6610 T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
6611 * Vgsteff - 8.0 * T0 / 3.0)
6612 + 2.0 * T0 * T0 / 3.0);
6613 T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
6614 T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
6615 Csg = (T4 + T5 * dVdseffCV_dVg);
6616 Csd = T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
6617 Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6618 +
Csg * dVgsteff_dVb;
6619 Csg *= dVgsteff_dVg;
6624 Csg = -0.5 * (Cgg1 + Cbg1);
6625 Csb = -0.5 * (Cgb1 + Cbb1);
6626 Csd = -0.5 * (Cgd1 + Cbd1);
6629 qgate += Qac0 + Qsub0;
6630 qbulk -= (Qac0 + Qsub0);
6633 Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
6634 Cgd = dQsub0_dVd + Cgd1;
6635 Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
6637 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
6638 Cbd = Cbd1 - dQsub0_dVd;
6639 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
6664 T2 = -CONSTDELTA_3 / T0;
6669 T2 = CONSTDELTA_3 / T0;
6672 T1 = 0.5 * (1.0 + V3 / T0);
6675 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
6680 dT0_dVg = dVgs_eff_dVg / Tox;
6681 dT0_dVb = -dVbseffCV_dVb / Tox;
6688 dTcen_dVb = dTcen_dVg * dT0_dVb;
6689 dTcen_dVg *= dT0_dVg;
6694 dTcen_dVg = dTcen_dVb = 0.0;
6699 dTcen_dVg = dTcen_dVb = 0.0;
6706 T1 = 0.5 * (1.0 + V3 / V4);
6711 T2 = Cox / (Cox + Ccen);
6714 dCoxeff_dVg = T2 * T2 * T3;
6715 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
6716 dCoxeff_dVg *= dTcen_dVg;
6717 CoxWLcen =
CoxWL * Coxeff / Cox;
6720 QovCox = Qac0 / Coxeff;
6721 dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg;
6722 dQac0_dVb = CoxWLcen * dVfbeff_dVb + QovCox * dCoxeff_dVb;
6725 T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
6738 T1 = sqrt(T0 * T0 + T3);
6739 T2 = CoxWLcen * T0 / T1;
6743 QovCox = Qsub0 / Coxeff;
6744 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
6745 + QovCox * dCoxeff_dVg;
6746 dQsub0_dVd = -T2 * dVgsteff_dVd;
6747 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
6748 + QovCox * dCoxeff_dVb;
6761 T1 = 2.0 * T0 + Vgsteff;
6763 DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
6764 dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff);
6772 { T0 = (Vgsteff + T3) / Tox;
6773 dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox;
6774 dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox;
6777 { T0 = (Vgsteff + 1.0e-20) / Tox;
6778 dT0_dVd = dVgsteff_dVd / Tox;
6779 dT0_dVb = dVgsteff_dVb / Tox;
6781 tmp = exp(0.7 * log(T0));
6783 T2 = 0.7 * tmp / (T0 * Tox);
6785 dTcen_dVg = -1.9e-9 * T2 / T1 /T1;
6786 dTcen_dVd = Tox * dTcen_dVg;
6787 dTcen_dVb = dTcen_dVd * dT0_dVb;
6788 dTcen_dVd *= dT0_dVd;
6789 dTcen_dVg *= dVgsteff_dVg;
6792 T0 = Cox / (Cox + Ccen);
6795 dCoxeff_dVg = T0 * T0 * T1;
6796 dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
6797 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
6798 dCoxeff_dVg *= dTcen_dVg;
6799 CoxWLcen =
CoxWL * Coxeff / Cox;
6803 VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV;
6805 T0 = sqrt(V4 * V4 + 4.0 * CONSTDELTA_4 * VdsatCV);
6806 VdseffCV = VdsatCV - 0.5 * (V4 + T0);
6807 T1 = 0.5 * (1.0 + V4 / T0);
6808 T2 = CONSTDELTA_4 / T0;
6809 T3 = (1.0 - T1 - T2) / AbulkCV;
6813 dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
6818 dVdseffCV_dVg = 0.0;
6819 dVdseffCV_dVb = 0.0;
6822 T0 = AbulkCV * VdseffCV;
6823 T1 = Vgsteff - DeltaPhi;
6824 T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
6826 T4 = 1.0 - 12.0 * T3 * T3;
6827 T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
6828 T6 = T5 * VdseffCV / AbulkCV;
6830 qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3));
6831 QovCox =
qgate / Coxeff;
6832 Cgg1 = CoxWLcen * (T4 * (1.0 -
dDeltaPhi_dVg) + T5 * dVdseffCV_dVg);
6833 Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
6834 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
6835 Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6836 + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6837 Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6842 T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
6844 T11 = -T7 * T5 / AbulkCV;
6845 T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
6847 qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
6848 QovCox =
qbulk / Coxeff;
6849 Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
6850 Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
6851 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
6852 Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
6853 + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6854 Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6858 qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - 0.5 * T0 * T0 / T2);
6859 QovCox =
qsrc / Coxeff;
6862 T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
6867 Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
6868 Csd = CoxWLcen * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd
6869 + QovCox * dCoxeff_dVd;
6870 Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6871 +
Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6872 Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6877 T3 = 0.5 * CoxWLcen / (T2 * T2);
6878 T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
6879 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
6881 QovCox = qsrc / Coxeff;
6882 T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
6883 T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
6884 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
6885 T6 = AbulkCV * (qsrc / T2 + T3 * T8);
6886 T7 = T6 * VdseffCV / AbulkCV;
6889 Csd =
Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
6890 + QovCox * dCoxeff_dVd;
6891 Csb =
Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
6892 + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
6893 Csg =
Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6904 qbulk -= (Qac0 + Qsub0);
6907 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
6908 Cbd = Cbd1 - dQsub0_dVd;
6909 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
6955 if (drainPerimeter < paramPtr->weff)
6967 if (sourcePerimeter < paramPtr->weff)
6988 capbs = czbs + czbssw + czbsswg;
6996 if (MJ == 0.5) sarg = 1.0 / sqrt(arg);
6997 else sarg = exp(-MJ * log(arg));
7000 qbs =
PhiBTemp * czbs * (1.0 - arg * sarg) / (1.0 - MJ);
7002 capbs = czbs * sarg;
7014 if (MJSW == 0.5) sarg = 1.0 / sqrt(arg);
7015 else sarg = exp(-MJSW * log(arg));
7018 qbs +=
PhiBSWTemp * czbssw * (1.0 - arg * sarg) / (1.0 - MJSW);
7020 capbs += czbssw * sarg;
7026 if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg);
7027 else sarg = exp(-MJSWG * log(arg));
7030 qbs +=
PhiBSWGTemp * czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWG);
7032 capbs += czbsswg * sarg;
7038 T0 = czbs + czbssw + czbsswg;
7039 T1 = vbs * (czbs * MJ /
PhiBTemp + czbssw * MJSW
7043 qbs = vbs * (T0 + 0.5 * T1);
7052 capbd = czbd + czbdsw + czbdswg;
7059 if (MJ == 0.5) sarg = 1.0 / sqrt(arg);
7060 else sarg = exp(-MJ * log(arg));
7063 qbd =
PhiBTemp * czbd * (1.0 - arg * sarg) / (1.0 - MJ);
7064 capbd = czbd * sarg;
7076 if (MJSW == 0.5) sarg = 1.0 / sqrt(arg);
7077 else sarg = exp(-MJSW * log(arg));
7080 qbd +=
PhiBSWTemp * czbdsw * (1.0 - arg * sarg) / (1.0 - MJSW);
7081 capbd += czbdsw * sarg;
7087 if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg);
7088 else sarg = exp(-MJSWG * log(arg));
7091 qbd +=
PhiBSWGTemp * czbdswg * (1.0 - arg * sarg) / (1.0 - MJSWG);
7092 capbd += czbdswg * sarg;
7097 T0 = czbd + czbdsw + czbdswg;
7102 qbd =
vbd * (T0 + 0.5 * T1);
7131 gtau = gtau_drift + gtau_diff;
7190 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
7191 T2 = 0.5 * (T0 - T1);
7195 cgdo =
paramPtr->
cgdo + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1);
7201 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
7202 T2 = 0.5 * (T0 - T1);
7205 cgso =
paramPtr->
cgso + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1);
7261 bool bsuccess =
true;
7350 double Qqcheq = 0.0;
7375 qVec[
li_Bulk] += (Qeqqb)*numberParallel;
7397 qVec[
li_Charge] += -(Qqcheq - Qqdef)*numberParallel;
7501 msg =
"Instance::auxChargeCalculations ()";
7502 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
7503 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8206 msg =
"Instance::loadDAEdQdx";
8207 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
8208 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8300 += (-
gbgs)*numberParallel;
8361 msg =
"Instance::loadDAEdFdx";
8362 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
8363 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8422 bool bsuccess =
true;
8461 cox = 3.453133e-11 / tox;
8462 if (!
given(
"TOXM")) toxm = tox;
8463 if (!
given(
"DSUB")) dsub = drout;
8464 if (!
given(
"LLC")) Llc = Ll;
8465 if (!
given(
"LWC")) Lwc = Lw;
8466 if (!
given(
"LWLC")) Lwlc = Lwl;
8467 if (!
given(
"WLC")) Wlc = Wl;
8468 if (!
given(
"WWL")) Wwlc = Wwl;
8469 if (!
given(
"WWLC")) Wwlc = Wwl;
8470 if (!
given(
"DWC")) dwc = Wint;
8471 if (!
given(
"DLC")) dlc = Lint;
8477 double C2 = 1.0 + (0.4e-6 / tox);
8478 double C3 = log(C2);
8484 if (
given(
"DLC") && (dlc > 0.0))
cgdo = dlc * cox - cgdl ;
8485 else cgdo = 0.6 * xj * cox;
8490 if (
given(
"DLC") && (dlc > 0.0))
cgso = dlc * cox - cgsl ;
8491 else cgso = 0.6 * xj * cox;
8494 if (!
given(
"CGBO")) cgbo = 2.0 * dwc * cox;
8496 if (!
given(
"CJSWG"))
8497 unitLengthGateSidewallJctCap = unitLengthSidewallJctCap ;
8499 if (!
given(
"PBSWG"))
8500 GatesidewallJctPotential = sidewallJctPotential;
8502 if (!
given(
"MJSWG"))
8503 bulkJctGateSideGradingCoeff = bulkJctSideGradingCoeff;
8507 if (bulkJctPotential < 0.1)
8509 bulkJctPotential = 0.1;
8510 msg =
"Given pb is less than 0.1. Pb is set to 0.1.\n";
8511 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8514 if (sidewallJctPotential < 0.1)
8516 sidewallJctPotential = 0.1;
8517 msg =
"Given pbsw is less than 0.1. Pbsw is set to 0.1.\n";
8518 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8521 if (GatesidewallJctPotential < 0.1)
8523 GatesidewallJctPotential = 0.1;
8524 msg =
"Given pbswg is less than 0.1. Pbswg is set to 0.1.\n";
8525 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8534 * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
8553 std::vector<Instance*>::iterator iter;
8554 std::vector<Instance*>::iterator first = instanceContainer.begin();
8555 std::vector<Instance*>::iterator last = instanceContainer.end();
8557 for (iter=first; iter!=last; ++iter)
8559 (*iter)->processParams();
8577 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
8936 sheetResistance (0),
8937 jctSatCurDensity (0),
8938 jctSidewallSatCurDensity (0),
8939 bulkJctPotential (0),
8940 bulkJctBotGradingCoeff (0),
8941 bulkJctSideGradingCoeff (0),
8942 bulkJctGateSideGradingCoeff (0),
8943 sidewallJctPotential (0),
8944 GatesidewallJctPotential (0),
8946 unitLengthSidewallJctCap (0),
8947 unitLengthGateSidewallJctCap (0),
8948 jctEmissionCoeff (0),
8949 jctTempExponent (0),
8985 oxideTrapDensityA (0),
8986 oxideTrapDensityB (0),
8987 oxideTrapDensityC (0),
9012 else if (
getType() ==
"PMOS") {
9028 #ifdef Xyce_BSIM3_USE_DEFL
9038 Report::DevelFatal0() <<
"TNOM is zero";
9047 uc = (
mobMod == 3) ? -0.0465 : -0.0465e-9;
9049 uc1 = (
mobMod == 3) ? -0.056 : -0.056e-9;
9087 std::list<SizeDependParam*>::iterator it_dpL =
9089 std::list<SizeDependParam*>::iterator end_dpL =
9091 for( ; it_dpL != end_dpL; ++it_dpL )
9096 std::vector<Instance*>::iterator iter;
9100 for (iter=first; iter!=last; ++iter)
9118 std::vector<Instance*>::const_iterator iter;
9124 os <<
" name modelName Parameters" << std::endl;
9126 for (i=0, iter=first; iter!=last; ++iter,++i)
9128 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
9154 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
9175 std::list<SizeDependParam*>::iterator it_dpL =
9177 std::list<SizeDependParam*>::iterator end_dpL =
9179 for( ; it_dpL != end_dpL; ++it_dpL )
9201 bool bsuccess =
true;
9207 bsuccess = bsuccess && btmp;
9276 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
9530 double Qqcheq = 0.0;
9615 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
9771 msg =
"Instance::loadDAEMatrices";
9772 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
9773 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
9892 msg =
"Master::loadDAEMatrices";
9893 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
9894 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
9912 int sizeInstances = instanceContainer_.size();
9913 for (
int i=0; i<sizeInstances; ++i)
9915 Instance & mi = *(instanceContainer_.at(i));
10068 msg =
"Master::loadDAEMatrices";
10069 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
10070 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
10189 msg =
"Master::loadDAEMatrices";
10190 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
10191 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
10208 .registerDevice(
"m", 9)
10209 .registerDevice(
"m", 49)
10210 .registerModelType(
"pmos", 9)
10211 .registerModelType(
"nmos", 9)
10212 .registerModelType(
"pmos", 49)
10213 .registerModelType(
"nmos", 49);