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;
2938 tmpstr =
getName()+
"_drainprime";
2945 tmpstr =
getName()+
"_sourceprime";
2951 tmpstr =
getName()+
"_branch_DS";
2957 tmpstr =
getName()+
"_branch_GS";
2963 tmpstr =
getName()+
"_branch_BS";
2988 std::string modName(
getName());
2991 tmpstr = modName+
":DEV_ID";
2993 tmpstr = modName+
":DEV_IG";
2995 tmpstr = modName+
":DEV_IS";
2997 tmpstr = modName+
":DEV_IB";
3015 #ifdef Xyce_DEBUG_DEVICE
3018 Xyce::dout() << std::endl;
3019 Xyce::dout() << section_divider << std::endl;
3020 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
3021 Xyce::dout() <<
" name = " <<
getName() << std::endl;
3022 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
3049 #ifdef Xyce_DEBUG_DEVICE
3052 Xyce::dout() <<
" Local State indices:" << std::endl;
3053 Xyce::dout() << std::endl;
3054 Xyce::dout() <<
" li_state_qb = " <<
li_state_qb << std::endl;
3055 Xyce::dout() <<
" li_state_qg = " <<
li_state_qg << std::endl;
3056 Xyce::dout() <<
" li_state_qd = " <<
li_state_qd << std::endl;
3057 Xyce::dout() <<
" li_state_qbs = " <<
li_state_qbs << std::endl;
3058 Xyce::dout() <<
" li_state_qbd = " <<
li_state_qbd << std::endl;
3059 Xyce::dout() <<
" li_state_qcheq = " <<
li_state_qcheq << std::endl;
3060 Xyce::dout() <<
" li_state_qcdump = " <<
li_state_qcdump << std::endl;
3061 Xyce::dout() <<
" li_state_qdef = " <<
li_state_qdef << std::endl;
3062 Xyce::dout() << section_divider << std::endl;
3132 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3133 ": NQSMOD not supported for DIRECT MATRIX ACCESS\n" );
3136 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3137 "Instance::jacobianStamp should not get here!\n" );
3153 std::vector<int> map;
3154 std::vector< std::vector<int> > map2;
3200 #ifdef Xyce_DEBUG_DEVICE
3203 Xyce::dout() <<
"Instance::registerJacLIDs map selected" << std::endl;
3204 for (
int k = 0; k<map.size(); ++k )
3206 Xyce::dout() <<
"map[ " << k <<
"] = " << map[k] <<
" map2[] = { ";
3207 for (
int q = 0; q < map2[k].size(); ++q )
3209 Xyce::dout() << map2[k][q] <<
" ";
3211 Xyce::dout() <<
"}" << std::endl;
3214 for(
int k = 0; k<jacLIDVec.size(); ++k )
3216 Xyce::dout() <<
"jacLIDVec[ " << k <<
"] = { ";
3217 for (
int q = 0; q < jacLIDVec[k].size(); ++q )
3219 Xyce::dout() << jacLIDVec[k][q] <<
" ";
3221 Xyce::dout() <<
"}" << std::endl;
3351 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL,
3352 ": NQSMOD not supported.\n" );
3366 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
3615 double tmp, tmp1, tmp2, tmp3, Eg;
3616 double T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
3617 double delTemp, TRatio, Inv_L, Inv_W, Inv_LW;
3620 double Nvtm, SourceSatCurrent, DrainSatCurrent;
3627 bool bsuccess =
true;
3629 #ifdef Xyce_DEBUG_DEVICE
3632 Xyce::dout() << std::endl << subsection_divider << std::endl;
3633 Xyce::dout() <<
"Instance::updateTemperature\n";
3634 Xyce::dout() <<
"name = " <<
getName() << std::endl;
3639 if (temp_tmp != -999.0)
temp = temp_tmp;
3665 delTemp = temp - Tnom;
3676 lout() <<
"Temperature effect has caused cj to be negative. Cj clamped to zero.\n" << std::endl;
3689 lout() <<
"Temperature effect has caused cjsw to be negative. Cjsw clamped to zero.\n" << std::endl;
3702 lout() <<
"Temperature effect has caused cjswg to be negative. Cjswg clamped to zero.\n" << std::endl;
3710 lout() <<
"Temperature effect has caused pb to be < 0.01. Pb clamped to 0.01.\n" << std::endl;
3718 lout() <<
"Temperature effect has caused pbsw to be < 0.01. Pbsw clamped to 0.01.\n" << std::endl;
3726 lout() <<
"Temperature effect has caused pbswg to be < 0.01. Pbswg clamped to 0.01.\n" << std::endl;
3736 std::list<SizeDependParam*>::iterator it_dpL =
3738 std::list<SizeDependParam*>::iterator end_dpL =
3743 for( ; it_dpL != end_dpL; ++it_dpL )
3744 if( (*it_dpL)->Length ==
l && (*it_dpL)->Width ==
w )
3791 ": mosfet %s, model %s: Effective channel length <= 0",
3793 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
3800 ": mosfet %s, model %s: Effective channel width <= 0",
3802 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
3809 ": mosfet %s, model %s: Effective channel length for C-V <= 0",
3811 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
3818 ": mosfet %s, model %s: Effective channel width for C-V <= 0",
3820 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
4256 T0 = (TRatio - 1.0);
4271 #ifdef CHECK_MODEL_DONE
4272 if (checkModel((*M_iter), iterI, ckt))
4274 UserError0(*
this) <<
"Error(s) detected during V3.2 parameter checking for " << name.c_str() <<
" in model " <<
model_.name;
4317 UserWarning0(*
this) <<
"k1 should be specified with k2.";
4323 UserWarning0(*
this) <<
"k2 should be specified with k1.";
4329 UserWarning0(*
this) <<
"nsub is ignored because k1 or k2 is given.";
4334 UserWarning0(*
this) <<
"xt is ignored because k1 or k2 is given.";
4339 UserWarning0(*
this) <<
"vbx is ignored because k1 or k2 is given.";
4344 UserWarning0(*
this) <<
"gamma1 is ignored because k1 or k2 is given.";
4349 UserWarning0(*
this) <<
"gamma2 is ignored because k1 or k2 is given.";
4422 T2 = (T0 + 2.0 * T0 * T0);
4435 T2 = T1 * (1.0 + 2.0 * T1);
4440 T2 = T1 * (1.0 + 2.0 * T1);
4450 T3 = T1 * (1.0 + 2.0 * T1);
4455 T3 = T1 * (1.0 + 2.0 * T1);
4480 SourceSatCurrent = 1.0e-14;
4489 if ((SourceSatCurrent > 0.0) && (
model_.
ijth > 0.0))
4498 DrainSatCurrent = 1.0e-14;
4507 if ((DrainSatCurrent > 0.0) && (
model_.
ijth > 0.0))
4528 bool bsuccess =
true;
4531 double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
4534 double VgstNVt(0.0), ExpVgst(0.0);
4536 double czbd(0.0), czbdsw(0.0), czbdswg(0.0), czbs(0.0), czbssw(0.0), czbsswg(0.0);
4537 double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
4539 double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
4541 double MJ(0.0), MJSW(0.0), MJSWG(0.0);
4544 double Vds(0.0), Vgs(0.0), Vbs(0.0);
4545 double Vgs_eff(0.0), Vfb(0.0);
4546 double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
4547 double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
4552 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);
4553 double ExpArg(0.0), V0(0.0), CoxWLcen(0.0), QovCox(0.0), LINK(0.0);
4554 double DeltaPhi(0.0);
4556 double Cox(0.0), Tox(0.0), Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
4557 double Ccen(0.0), Coxeff(0.0), dCoxeff_dVg(0.0), dCoxeff_dVd(0.0), dCoxeff_dVb(0.0);
4558 double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
4560 double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
4565 double EsatL(0.0), dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
4567 double dVdsat_dVg(0.0), dVdsat_dVb(0.0), dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
4568 double dVasat_dVg(0.0), dVasat_dVb(0.0), dVasat_dVd(0.0), Va(0.0);
4570 double dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
4571 double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
4574 double One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
4576 double T0(0.0), dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
4577 double T1(0.0), dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
4578 double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
4579 double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
4588 double T11(0.0), T12(0.0);
4590 double tmp(0.0), Abulk(0.0), dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
4592 double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
4593 double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
4595 double Xdep(0.0), dXdep_dVb(0.0), lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
4596 double Delt_vth(0.0), dDelt_vth_dVb(0.0);
4598 double Theta0(0.0), dTheta0_dVb(0.0);
4600 double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
4602 double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
4604 double Lambda(0.0), dLambda_dVg(0.0);
4608 double Vgsteff(0.0), dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
4609 double Vdseff(0.0), dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
4610 double VdseffCV(0.0), dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
4611 double diffVds(0.0);
4613 double dAbulk_dVg(0.0);
4614 double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
4615 double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
4616 double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
4617 double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
4618 double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
4619 double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
4622 double Gds(0.0), Gmb(0.0);
4625 double Gbd(0.0), Gbg(0.0), Gbb(0.0);
4626 double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
4627 double CoxWovL(0.0);
4628 double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
4629 double Vgst2Vtm(0.0), VdsatCV(0.0);
4631 double dVdsatCV_dVg(0.0), dVdsatCV_dVb(0.0);
4632 double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
4633 double AbulkCV(0.0), dAbulkCV_dVb(0.0);
4635 double gtau_diff(0.0), gtau_drift(0.0);
4640 double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
4642 double Qac0(0.0), Qsub0(0.0);
4643 double dQac0_dVg(0.0), dQac0_dVb(0.0), dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
4644 double von_local(0.0);
4658 #ifdef Xyce_DEBUG_DEVICE
4661 Xyce::dout() << subsection_divider << std::endl;
4662 Xyce::dout() <<
" Instance::updateIntermediateVars\n";
4663 Xyce::dout() <<
" name = " <<
getName();
4665 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
4666 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4667 Xyce::dout() <<
" " << std::endl;
4706 #ifdef Xyce_DEBUG_DEVICE
4709 Xyce::dout() <<
" Vg = " <<
Vg << std::endl;
4710 Xyce::dout() <<
" Vb = " <<
Vb << std::endl;
4711 Xyce::dout() <<
" Vs = " <<
Vs << std::endl;
4712 Xyce::dout() <<
" Vd = " <<
Vd << std::endl;
4713 Xyce::dout() <<
" Vsp = " <<
Vsp << std::endl;
4714 Xyce::dout() <<
" Vdp = " <<
Vdp << std::endl;
4715 Xyce::dout() <<
" Qtotal = " <<
Qtotal << std::endl;
4772 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
4840 #ifdef Xyce_DEBUG_DEVICE
4843 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4844 Xyce::dout() <<
" von_local = " << von_local << std::endl;
4845 Xyce::dout() <<
" CONSTvt0 = " <<
CONSTvt0 << std::endl;
4846 Xyce::dout() <<
" vcrit = " <<
model_.
vcrit << std::endl;
4847 Xyce::dout().width(3);
4849 Xyce::dout().width(5);Xyce::dout() <<
getName();
4850 Xyce::dout() <<
" old :";
4851 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4853 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4855 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4857 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4858 Xyce::dout() <<
vbd_old << std::endl;
4859 Xyce::dout().width(3);
4861 Xyce::dout().width(5);Xyce::dout() <<
getName();
4862 Xyce::dout() <<
" Blim:";
4863 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4864 Xyce::dout() <<
vgs;
4865 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4866 Xyce::dout() <<
vds;
4867 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4868 Xyce::dout() <<
vbs;
4869 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4870 Xyce::dout() <<
vbd << std::endl;
4871 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
4911 #ifdef Xyce_NEW_ORIG_TEST
4913 double vds_diff = fabs(vds -
vds_orig);
4917 bool noOrigFlag_vgs = 0;
4918 bool noOrigFlag_vds = 0;
4919 bool noOrigFlag_vbs = 0;
4920 bool noOrigFlag_vgd = 0;
4922 if (vgs_diff != 0.0)
4926 if ( fabs(vgs_diff/
vgs_orig) > reltol) noOrigFlag_vgs = 1;
4930 if ( fabs(vgs_diff) > voltTol ) noOrigFlag_vgs = 1;
4934 if (vds_diff != 0.0)
4938 if ( fabs(vds_diff/
vds_orig) > reltol) noOrigFlag_vds = 1;
4942 if ( fabs(vds_diff) > voltTol ) noOrigFlag_vds = 1;
4946 if (vbs_diff != 0.0)
4950 if ( fabs(vbs_diff/
vbs_orig) > reltol) noOrigFlag_vbs = 1;
4954 if ( fabs(vbs_diff) > voltTol ) noOrigFlag_vbs = 1;
4958 if (vgd_diff != 0.0)
4962 if ( fabs(vgd_diff/
vgd_orig) > reltol) noOrigFlag_vgd = 1;
4966 if ( fabs(vgd_diff) > voltTol ) noOrigFlag_vgd = 1;
4970 origFlag = !( noOrigFlag_vgs || noOrigFlag_vds ||
4971 noOrigFlag_vbs || noOrigFlag_vgd);
4981 #ifdef Xyce_DEBUG_DEVICE
4984 Xyce::dout().width(3);
4986 Xyce::dout().width(5);Xyce::dout() <<
getName();
4987 Xyce::dout() <<
" Alim:";
4988 Xyce::dout()<<
" vgs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4989 Xyce::dout() <<
vgs;
4990 Xyce::dout()<<
" vds:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4991 Xyce::dout() <<
vds;
4992 Xyce::dout()<<
" vbs:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4993 Xyce::dout() <<
vbs;
4994 Xyce::dout()<<
" vbd:";Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
4995 Xyce::dout() <<
vbd;
4996 if (
origFlag) Xyce::dout() <<
" SAME";
4997 else Xyce::dout() <<
" DIFF";
4998 Xyce::dout() << std::endl;
4999 Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
5020 #ifdef Xyce_DEBUG_DEVICE
5023 Xyce::dout() <<
" mod type = " <<
model_.
modType << std::endl;
5024 Xyce::dout() <<
"dtype = " <<
model_.
dtype << std::endl;
5025 Xyce::dout() <<
" vbs = " << vbs << std::endl;
5026 Xyce::dout() <<
" vds = " << vds << std::endl;
5027 Xyce::dout() <<
" vgs = " <<
vgs << std::endl;
5029 Xyce::dout() <<
" vbd = " <<
vbd << std::endl;
5030 Xyce::dout() <<
" vgd = " <<
vgd << std::endl;
5031 Xyce::dout() <<
" vgb = " <<
vgs << std::endl;
5032 Xyce::dout() <<
" qdef = " <<
qdef << std::endl;
5041 SourceSatCurrent = 1.0e-14;
5051 if (SourceSatCurrent <= 0.0)
5060 evbs = exp(vbs / Nvtm);
5068 evbs = exp(vbs / Nvtm);
5085 DrainSatCurrent = 1.0e-14;
5095 if (DrainSatCurrent <= 0.0)
5104 evbd = exp(
vbd / Nvtm);
5112 evbd = exp(
vbd / Nvtm);
5147 #ifdef Xyce_DEBUG_DEVICE
5150 Xyce::dout() <<
"HOMOTOPY INFO: gainscale = "
5152 Xyce::dout() <<
"HOMOTOPY INFO: before vds = " << Vds << std::endl;
5153 Xyce::dout() <<
"HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
5177 #ifdef Xyce_DEBUG_DEVICE
5180 Xyce::dout() <<
"HOMOTOPY INFO: after vds = " << Vds << std::endl;
5181 Xyce::dout() <<
"HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
5189 dVbseff_dVb = 0.5 * (1.0 + T0 /
T1global);
5191 if (Vbseff < Vbs) Vbseff = Vbs;
5197 dPhis_dVb = -T0 * T0;
5199 dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis /
paramPtr->
phis3;
5205 sqrtPhis = sqrt(Phis);
5206 dsqrtPhis_dVb = -0.5 / sqrtPhis;
5226 T4 = 1.0 / (3.0 + 8.0 * T0);
5227 T1 = (1.0 + 3.0 * T0) * T4;
5232 dlt1_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
5242 T4 = 1.0 / (3.0 + 8.0 * T0);
5243 T1 = (1.0 + 3.0 * T0) * T4;
5248 dltw_dVb =
model_.
factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
5254 Theta0 = T1 * (1.0 + 2.0 * T1);
5255 dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
5256 dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
5261 Theta0 = T1 * (1.0 + 2.0 * T1);
5273 T2 = T1 * (1.0 + 2.0 * T1);
5274 dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
5275 dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
5280 T2 = T1 * (1.0 + 2.0 * T1);
5299 T9 = 1.0 / (3.0 - 2.0e4 * T3);
5300 T3 = (2.0e-4 - T3) * T9;
5309 DIBL_Sft = dDIBL_Sft_dVd * Vds;
5323 dVth_dVd = -dDIBL_Sft_dVd;
5334 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
5340 T0 = 1.0 / (3.0 + 8.0 * tmp4);
5341 n = (1.0 + 3.0 * tmp4) * T0;
5343 dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
5356 T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1);
5358 T2 = T1 * (T4 - 1.0);
5359 T3 = 0.5 * T2 * T2 / T1;
5360 T7 = 1.12 - T3 - 0.05;
5361 T6 = sqrt(T7 * T7 + 0.224);
5362 T5 = 1.12 - 0.5 * (T7 + T6);
5364 dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
5371 Vgst = Vgs_eff - Vth;
5374 T10 = 2.0 * n * Vtm;
5375 VgstNVt = Vgst / T10;
5383 dVgsteff_dVd = -dVth_dVd;
5384 dVgsteff_dVb = -dVth_dVb;
5391 dVgsteff_dVg = Vgsteff / (n * Vtm);
5392 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd);
5393 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb);
5398 ExpVgst = exp(VgstNVt);
5399 T1 = T10 * log(1.0 + ExpVgst);
5400 dT1_dVg = ExpVgst / (1.0 + ExpVgst);
5401 dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + T1 / n * dn_dVb;
5402 dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + T1 / n * dn_dVd;
5405 T2 = 1.0 - T10 * dT2_dVg;
5407 dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd)
5408 + (T2 - 1.0) / n * dn_dVd;
5410 dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb)
5411 + (T2 - 1.0) / n * dn_dVb;
5416 dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 *
dVgs_eff_dVg;
5417 dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3;
5418 dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3;
5429 T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
5430 Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
5445 T1 = 1.0 / (17.0 + 20.0 * T0);
5454 dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb;
5457 tmp1 = Leff + 2.0 * T9;
5463 dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
5467 Abulk0 = 1.0 + T1 * T2;
5468 dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
5471 dAbulk_dVg = -T1 * T8;
5472 Abulk = Abulk0 + dAbulk_dVg * Vgsteff;
5473 dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
5477 T9 = 1.0 / (3.0 - 20.0 * Abulk0);
5478 Abulk0 = (0.2 - Abulk0) * T9;
5479 dAbulk0_dVb *= T9 * T9;
5484 T9 = 1.0 / (3.0 - 20.0 * Abulk);
5485 Abulk = (0.2 - Abulk) * T9;
5494 T0 = 1.0 / (1.0 + T2);
5499 T1 = 1.0 / (0.8 + T2);
5500 T0 = (17.0 + 20.0 * T2) * T1;
5505 dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb;
5506 dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
5513 T0 = Vgsteff + Vth + Vth;
5518 dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
5519 dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb +
paramPtr->
uc * T3;
5534 T0 = Vgsteff + Vth + Vth;
5541 dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
5542 dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb +
paramPtr->
uc * T4;
5551 T9 = 1.0 / (7.0 + 10.0 * T5);
5552 Denomi = (0.6 + T5) * T9;
5560 T9 = -
ueff / Denomi;
5561 dueff_dVg = T9 * dDenomi_dVg;
5562 dueff_dVd = T9 * dDenomi_dVd;
5563 dueff_dVb = T9 * dDenomi_dVb;
5567 WVCoxRds = WVCox * Rds;
5570 EsatL = Esat * Leff;
5572 dEsatL_dVg = T0 * dueff_dVg;
5573 dEsatL_dVd = T0 * dueff_dVd;
5574 dEsatL_dVb = T0 * dueff_dVb;
5588 T2 = sqrt(T1 * T1 + 0.0004 * T0);
5589 Lambda =
paramPtr->
a2 + T0 - 0.5 * (T1 + T2);
5590 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
5596 Lambda = 0.5 * (T1 + T2);
5597 dLambda_dVg = 0.5 *
paramPtr->
a1 * (1.0 + T1 / T2);
5600 Vgst2Vtm = Vgsteff + 2.0 * Vtm;
5603 tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
5604 tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
5608 tmp2 = dWeff_dVg / Weff;
5609 tmp3 = dWeff_dVb / Weff;
5612 if ((Rds == 0.0) && (Lambda == 1.0))
5614 T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm);
5618 T3 = EsatL * Vgst2Vtm;
5621 dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
5622 dT0_dVd = -(Abulk * dEsatL_dVd) * T1;
5623 dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1;
5625 dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
5626 dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
5627 dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
5631 tmp1 = dLambda_dVg / (Lambda * Lambda);
5632 T9 = Abulk * WVCoxRds;
5635 T6 = Vgst2Vtm * WVCoxRds;
5636 T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda);
5637 dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1
5638 + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
5640 dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3)
5641 + (1.0 / Lambda - 1.0) * dAbulk_dVb);
5643 T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7;
5645 dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
5646 + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
5647 + T7 * tmp2 + T6 * dAbulk_dVg);
5649 dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb
5650 + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
5652 dT1_dVd = Abulk * dEsatL_dVd;
5654 T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
5655 dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
5656 + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
5658 dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
5659 dT2_dVd = Vgst2Vtm * dEsatL_dVd;
5661 T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
5662 Vdsat = (T1 - T3) / T0;
5664 dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) / T3;
5665 dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) / T3;
5666 dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) / T3;
5668 dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
5669 - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
5671 dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
5672 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
5674 dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
5680 dT1_dVg = dVdsat_dVg;
5681 dT1_dVd = dVdsat_dVd - 1.0;
5682 dT1_dVb = dVdsat_dVb;
5687 dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
5688 dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
5689 dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
5691 Vdseff = Vdsat - 0.5 * (T1 + T2);
5692 dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
5693 dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
5694 dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
5705 tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm;
5706 T9 = WVCoxRds * Vgsteff;
5708 T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
5710 T7 = 2.0 * WVCoxRds * tmp4;
5711 dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff)
5712 - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm
5713 + Vdsat * dAbulk_dVg);
5715 dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
5716 - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
5717 dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd;
5719 T9 = WVCoxRds * Abulk;
5720 T1 = 2.0 / Lambda - 1.0 + T9;
5721 dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
5722 dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
5725 dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
5726 dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
5727 dVasat_dVd = dT0_dVd / T1;
5729 if (Vdseff > Vds) Vdseff = Vds;
5731 diffVds = Vds - Vdseff;
5737 dT0_dVb = -T0 / Abulk * dAbulk_dVb;
5738 dT0_dVg = -T0 / Abulk * dAbulk_dVg;
5740 T2 = Vgsteff / EsatL;
5741 T1 = Leff * (Abulk + T2);
5742 dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg);
5743 dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL);
5744 dT1_dVd = -T2 * dEsatL_dVd / Esat;
5747 VACLM = T9 * diffVds;
5748 dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg
5749 + T1 * diffVds * dT0_dVg;
5751 dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds
5754 dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd);
5759 dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
5767 dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
5768 + Vgst2Vtm * Vdsat * dAbulk_dVg;
5770 dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
5771 dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
5774 dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
5775 dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
5776 dT1_dVd = Abulk * dVdsat_dVd;
5781 VADIBL = (Vgst2Vtm - T0 / T1) / T2;
5782 dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
5783 dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
5784 dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
5789 T3 = 1.0 / (1.0 + T7);
5797 T4 = 1.0 / (0.8 + T7);
5798 T3 = (17.0 + 20.0 * T7) * T4;
5800 dVADIBL_dVb = dVADIBL_dVb * T3 - VADIBL *
paramPtr->
pdiblb * T4 * T4;
5809 dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
5818 dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL);
5819 dT0_dVb = -T9 * dEsatL_dVb / EsatL;
5820 dT0_dVd = -T9 * dEsatL_dVd / EsatL;
5824 T1 = 1.0 / (17.0 + 20.0 * T9);
5825 T0 = (0.8 + T9) * T1;
5827 dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1;
5830 dT0_dVb = -T9 * dEsatL_dVb;
5831 dT0_dVd = -T9 * dEsatL_dVd;
5834 tmp1 = VACLM * VACLM;
5835 tmp2 = VADIBL * VADIBL;
5836 tmp3 = VACLM + VADIBL;
5838 T1 = VACLM * VADIBL / tmp3;
5840 dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3;
5841 dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3;
5842 dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3;
5844 Va = Vasat + T0 * T1;
5845 dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg;
5846 dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd;
5847 dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb;
5856 T1 = T0 * VASCBE / diffVds;
5857 dVASCBE_dVg = T1 * dVdseff_dVg;
5858 dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
5859 dVASCBE_dVb = T1 * dVdseff_dVb;
5864 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
5870 dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
5875 beta =
ueff * CoxWovL;
5876 dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff;
5877 dbeta_dVd = CoxWovL * dueff_dVd;
5878 dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff;
5880 T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm;
5881 dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
5882 - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
5883 dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
5884 dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm;
5886 fgche1 = Vgsteff * T0;
5887 dfgche1_dVg = Vgsteff * dT0_dVg + T0;
5888 dfgche1_dVd = Vgsteff * dT0_dVd;
5889 dfgche1_dVb = Vgsteff * dT0_dVb;
5891 T9 = Vdseff / EsatL;
5893 dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
5894 dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
5895 dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
5897 gche = beta * fgche1 / fgche2;
5898 dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
5899 - gche * dfgche2_dVg) / fgche2;
5901 dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
5902 - gche * dfgche2_dVd) / fgche2;
5904 dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
5905 - gche * dfgche2_dVb) / fgche2;
5907 T0 = 1.0 + gche * Rds;
5911 dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0
5912 - Idl * gche / T0 * dRds_dVg ;
5914 dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0;
5915 dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb
5916 - Idl * dRds_dVb * gche) / T0;
5921 dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va;
5922 dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd
5923 - T9 * dVa_dVd) / Va;
5925 dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va;
5927 T9 = diffVds / VASCBE;
5931 Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
5932 Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd
5933 - T9 * dVASCBE_dVd) / VASCBE;
5934 Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb
5935 + T9 * dVASCBE_dVb) / VASCBE;
5937 Gds +=
Gm * dVgsteff_dVd;
5938 Gmb +=
Gm * dVgsteff_dVb;
5946 Isub = Gbd = Gbb = Gbg = 0.0;
5954 T1 = T2 * diffVds * exp(T0);
5955 T3 = T1 / diffVds * (T0 - 1.0);
5956 dT1_dVg = T3 * dVdseff_dVg;
5957 dT1_dVd = T3 * (dVdseff_dVd - 1.0);
5958 dT1_dVb = T3 * dVdseff_dVb;
5964 dT1_dVg = -T3 * dVdseff_dVg;
5965 dT1_dVd = T3 * (1.0 - dVdseff_dVd);
5966 dT1_dVb = -T3 * dVdseff_dVb;
5969 Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg;
5970 Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd;
5971 Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb;
5973 Gbd += Gbg * dVgsteff_dVd;
5974 Gbb += Gbg * dVgsteff_dVb;
5975 Gbg *= dVgsteff_dVg;
6015 dVbseff_dVb = -dPhis_dVb;
6020 Vgst = Vgs_eff - Vth;
6026 Arg1 = Vgs_eff - Vbseff - Vfb;
6047 else if (Vgst <= 0.0)
6050 T2 = sqrt(T1 * T1 + Arg1);
6055 T0 =
CoxWL * T1 / T2;
6071 One_Third_CoxWL =
CoxWL / 3.0;
6072 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
6077 Vdsat = Vgst / AbulkCV;
6079 dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
6088 T2 = -Two_Third_CoxWL * Vgst;
6093 T2 = -One_Third_CoxWL * dVdsat_dVb;
6103 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6111 Alphaz = Vgst / Vdsat;
6112 T1 = 2.0 * Vdsat - Vds;
6113 T2 = Vds / (3.0 * T1);
6117 T7 = 2.0 * Vds - T1 - 3.0 * T3;
6118 T8 = T3 - T1 - 2.0 * Vds;
6128 T11 = -
CoxWL * T5 * dVdsat_dVb;
6133 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6134 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6138 T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
6141 T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
6142 cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
6145 T9 = 2.0 * T4 * (1.0 + T5);
6146 T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) *
dVgs_eff_dVg;
6147 T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
6148 T12 = T4 * (2.0 * T2 + T5 - 1.0);
6149 T0 = -(T10 + T11 + T12);
6154 cbsb = -(cgsb + cdsb + T0);
6165 T2 = -Two_Third_CoxWL * Vgst;
6171 T2 = -One_Third_CoxWL * dVdsat_dVb;
6175 T3 = 0.4 * Two_Third_CoxWL;
6183 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6190 Alphaz = Vgst / Vdsat;
6191 T1 = 2.0 * Vdsat - Vds;
6192 T2 = Vds / (3.0 * T1);
6200 tmp = -
CoxWL * T5 * dVdsat_dVb;
6205 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6206 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6208 T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + 1.2 * Vds * Vds;
6210 T7 = Vds - T1 - T8 * T6;
6214 tmp1 = T4*(2.0 - 4.0 * tmp * T6 + T8 *(16.0 * Vdsat - 6.0 *Vds));
6218 T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
6219 cddb = T4 * (2.0 - (1.0 / (3.0 * T1
6220 * T1) + 2.0 * tmp) * T6 + T8
6221 * (6.0 * Vdsat - 2.4 * Vds));
6225 T7 = 2.0 * (T1 + T3);
6228 T0 = 4.0 * T4 * (1.0 - T5);
6229 T12 = (-T7 * dAlphaz_dVg -
cdgb
6231 T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
6232 T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5)
6235 tmp = -(T10 + T11 + T12);
6249 T2 = -Two_Third_CoxWL * Vgst;
6254 T2 = -One_Third_CoxWL * dVdsat_dVb;
6260 T4 = One_Third_CoxWL * dVth_dVb;
6264 T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
6271 Alphaz = Vgst / Vdsat;
6272 T1 = 2.0 * Vdsat - Vds;
6273 T2 = Vds / (3.0 * T1);
6283 tmp = -
CoxWL * T5 * dVdsat_dVb;
6288 dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
6289 dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
6295 T0 = T4 * (2.0 * T5 - 2.0);
6298 T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
6299 cddb = T4 * (1.0 - 2.0 * T2 - T5);
6315 dVbseffCV_dVb = 1.0;
6320 dVbseffCV_dVb = -dPhis_dVb;
6331 VgstNVt = (Vgst - voffcv) / T0;
6335 Vgsteff = Vgst - voffcv;
6337 dVgsteff_dVd = -dVth_dVd;
6338 dVgsteff_dVb = -dVth_dVb;
6344 dVgsteff_dVd = Vgsteff / noff;
6345 dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
6346 dVgsteff_dVd *= dnoff_dVd;
6350 ExpVgst = exp(VgstNVt);
6351 Vgsteff = T0 * log(1.0 + ExpVgst);
6352 dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
6353 dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
6354 / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
6355 dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
6356 / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
6363 Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff;
6370 Cgb = -
CoxWL * (dVbseffCV_dVb + dVgsteff_dVb);
6375 T1 = sqrt(T0 * T0 + Arg1);
6376 T2 =
CoxWL * T0 / T1;
6381 Cgd = -T2 * dVgsteff_dVd;
6382 Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb);
6389 One_Third_CoxWL =
CoxWL / 3.0;
6390 Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
6393 VdsatCV = Vgsteff / AbulkCV;
6397 dVdsatCV_dVg = 1.0 / AbulkCV;
6398 dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
6399 T0 = Vgsteff - VdsatCV / 3.0;
6400 dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0;
6401 dT0_dVb = -dVdsatCV_dVb / 3.0;
6403 Cgg1 =
CoxWL * dT0_dVg;
6404 Cgb1 =
CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb;
6405 Cgd1 = Cgg1 * dVgsteff_dVd;
6406 Cgg1 *= dVgsteff_dVg;
6411 T0 = VdsatCV - Vgsteff;
6412 dT0_dVg = dVdsatCV_dVg - 1.0;
6413 dT0_dVb = dVdsatCV_dVb;
6414 qbulk += One_Third_CoxWL * T0;
6415 Cbg1 = One_Third_CoxWL * dT0_dVg;
6416 Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb;
6417 Cbd1 = Cbg1 * dVgsteff_dVd;
6418 Cbg1 *= dVgsteff_dVg;
6425 else T0 = -One_Third_CoxWL;
6427 qsrc = T0 * Vgsteff;
6428 Csg = T0 * dVgsteff_dVg;
6429 Csb = T0 * dVgsteff_dVb;
6430 Csd = T0 * dVgsteff_dVd;
6438 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20);
6441 dT3_dVg = -12.0 * T2 * T2 * AbulkCV;
6442 dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5;
6443 dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff;
6446 Cgg1 =
CoxWL * (1.0 + dT3_dVg);
6447 Cgb1 =
CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb;
6448 Cgd1 =
CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd;
6449 Cgg1 *= dVgsteff_dVg;
6454 qbulk +=
CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3);
6455 Cbg1 = -
CoxWL * ((1.0 - AbulkCV) * dT3_dVg);
6456 Cbb1 = -
CoxWL * ((1.0 - AbulkCV) * dT3_dVb
6457 + (0.5 * Vds - T3) * dAbulkCV_dVb)
6458 + Cbg1 * dVgsteff_dVb;
6459 Cbd1 = -
CoxWL * (1.0 - AbulkCV) * dT3_dVd
6460 + Cbg1 * dVgsteff_dVd;
6461 Cbg1 *= dVgsteff_dVg;
6469 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0 - T0 * T0 / T1);
6470 Csg = -
CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 * AbulkCV);
6471 Csb = -
CoxWL * (0.25 * Vds * dAbulkCV_dVb
6472 - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0)
6473 * dAbulkCV_dVb) + Csg * dVgsteff_dVb;
6474 Csd = -
CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0
6475 / T1 / T1 * (4.0 * Vgsteff - T0))
6476 + Csg * dVgsteff_dVd;
6477 Csg *= dVgsteff_dVg;
6482 T2 = 0.5 *
CoxWL / (T1 * T1);
6483 T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
6484 * (Vgsteff - 4.0 * T0 / 3.0))
6485 - 2.0 * T0 * T0 * T0 / 15.0;
6487 T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
6489 Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
6490 * Vgsteff - 8.0 * T0 / 3.0)
6491 + 2.0 * T0 * T0 / 3.0);
6492 Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb
6493 + Csg * dVgsteff_dVb;
6494 Csd = (qsrc / T1 + T2 * T4) * AbulkCV
6495 + Csg * dVgsteff_dVd;
6496 Csg *= dVgsteff_dVg;
6501 Csg = -0.5 * (Cgg1 + Cbg1);
6502 Csb = -0.5 * (Cgb1 + Cbb1);
6503 Csd = -0.5 * (Cgd1 + Cbd1);
6527 T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
6528 T2 = -CONSTDELTA_3 / T0;
6532 T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
6533 T2 = CONSTDELTA_3 / T0;
6536 T1 = 0.5 * (1.0 + V3 / T0);
6537 Vfbeff = Vfb - 0.5 * (V3 + T0);
6539 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
6540 Qac0 =
CoxWL * (Vfbeff - Vfb);
6541 dQac0_dVg =
CoxWL * dVfbeff_dVg;
6542 dQac0_dVb =
CoxWL * dVfbeff_dVb;
6545 T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
6558 T1 = sqrt(T0 * T0 + T3);
6559 T2 =
CoxWL * T0 / T1;
6564 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
6565 dQsub0_dVd = -T2 * dVgsteff_dVd;
6566 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb);
6570 VdsatCV = Vgsteff / AbulkCV;
6573 T0 = sqrt(V4 * V4 + 4.0 * CONSTDELTA_4 * VdsatCV);
6574 VdseffCV = VdsatCV - 0.5 * (V4 + T0);
6575 T1 = 0.5 * (1.0 + V4 / T0);
6576 T2 = CONSTDELTA_4 / T0;
6577 T3 = (1.0 - T1 - T2) / AbulkCV;
6580 dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
6585 dVdseffCV_dVg = 0.0;
6586 dVdseffCV_dVb = 0.0;
6589 T0 = AbulkCV * VdseffCV;
6590 T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20);
6594 T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
6595 T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5);
6596 T6 = 12.0 * T2 * T2 * Vgsteff;
6598 qinoi = -
CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3);
6599 qgate =
CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
6600 Cgg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6601 Cgd1 =
CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
6602 Cgb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6603 + Cgg1 * dVgsteff_dVb;
6604 Cgg1 *= dVgsteff_dVg;
6608 T4 = -T7 * (T4 - 1.0);
6610 T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
6611 Cbg1 =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6612 Cbd1 =
CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
6613 Cbb1 =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6614 + Cbg1 * dVgsteff_dVb;
6615 Cbg1 *= dVgsteff_dVg;
6620 qsrc = -
CoxWL * (0.5 * Vgsteff + 0.25 * T0 - T0 * T0 / T1);
6621 T7 = (4.0 * Vgsteff - T0) / (T1 * T1);
6622 T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
6623 T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
6624 T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
6625 Csg =
CoxWL * (T4 + T5 * dVdseffCV_dVg);
6626 Csd =
CoxWL * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
6627 Csb =
CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6628 +
Csg * dVgsteff_dVb;
6629 Csg *= dVgsteff_dVg;
6634 T2 = 0.5 *
CoxWL / (T1 * T1);
6635 T3 = Vgsteff *(2.0 * T0 *T0/3.0 +Vgsteff *(Vgsteff - 4.0 *T0/ 3.0))
6636 - 2.0 * T0 * T0 * T0 / 15.0;
6638 T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
6640 T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
6641 * Vgsteff - 8.0 * T0 / 3.0)
6642 + 2.0 * T0 * T0 / 3.0);
6643 T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
6644 T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
6645 Csg = (T4 + T5 * dVdseffCV_dVg);
6646 Csd = T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd;
6647 Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6648 +
Csg * dVgsteff_dVb;
6649 Csg *= dVgsteff_dVg;
6654 Csg = -0.5 * (Cgg1 + Cbg1);
6655 Csb = -0.5 * (Cgb1 + Cbb1);
6656 Csd = -0.5 * (Cgd1 + Cbd1);
6659 qgate += Qac0 + Qsub0;
6660 qbulk -= (Qac0 + Qsub0);
6663 Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
6664 Cgd = dQsub0_dVd + Cgd1;
6665 Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
6667 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
6668 Cbd = Cbd1 - dQsub0_dVd;
6669 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
6694 T2 = -CONSTDELTA_3 / T0;
6699 T2 = CONSTDELTA_3 / T0;
6702 T1 = 0.5 * (1.0 + V3 / T0);
6705 dVfbeff_dVb = -T1 * dVbseffCV_dVb;
6710 dT0_dVg = dVgs_eff_dVg / Tox;
6711 dT0_dVb = -dVbseffCV_dVb / Tox;
6718 dTcen_dVb = dTcen_dVg * dT0_dVb;
6719 dTcen_dVg *= dT0_dVg;
6724 dTcen_dVg = dTcen_dVb = 0.0;
6729 dTcen_dVg = dTcen_dVb = 0.0;
6736 T1 = 0.5 * (1.0 + V3 / V4);
6741 T2 = Cox / (Cox + Ccen);
6744 dCoxeff_dVg = T2 * T2 * T3;
6745 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
6746 dCoxeff_dVg *= dTcen_dVg;
6747 CoxWLcen =
CoxWL * Coxeff / Cox;
6750 QovCox = Qac0 / Coxeff;
6751 dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg;
6752 dQac0_dVb = CoxWLcen * dVfbeff_dVb + QovCox * dCoxeff_dVb;
6755 T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
6768 T1 = sqrt(T0 * T0 + T3);
6769 T2 = CoxWLcen * T0 / T1;
6773 QovCox = Qsub0 / Coxeff;
6774 dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
6775 + QovCox * dCoxeff_dVg;
6776 dQsub0_dVd = -T2 * dVgsteff_dVd;
6777 dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
6778 + QovCox * dCoxeff_dVb;
6791 T1 = 2.0 * T0 + Vgsteff;
6793 DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
6794 dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff);
6802 { T0 = (Vgsteff + T3) / Tox;
6803 dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox;
6804 dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox;
6807 { T0 = (Vgsteff + 1.0e-20) / Tox;
6808 dT0_dVd = dVgsteff_dVd / Tox;
6809 dT0_dVb = dVgsteff_dVb / Tox;
6811 tmp = exp(0.7 * log(T0));
6813 T2 = 0.7 * tmp / (T0 * Tox);
6815 dTcen_dVg = -1.9e-9 * T2 / T1 /T1;
6816 dTcen_dVd = Tox * dTcen_dVg;
6817 dTcen_dVb = dTcen_dVd * dT0_dVb;
6818 dTcen_dVd *= dT0_dVd;
6819 dTcen_dVg *= dVgsteff_dVg;
6822 T0 = Cox / (Cox + Ccen);
6825 dCoxeff_dVg = T0 * T0 * T1;
6826 dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
6827 dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
6828 dCoxeff_dVg *= dTcen_dVg;
6829 CoxWLcen =
CoxWL * Coxeff / Cox;
6833 VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV;
6835 T0 = sqrt(V4 * V4 + 4.0 * CONSTDELTA_4 * VdsatCV);
6836 VdseffCV = VdsatCV - 0.5 * (V4 + T0);
6837 T1 = 0.5 * (1.0 + V4 / T0);
6838 T2 = CONSTDELTA_4 / T0;
6839 T3 = (1.0 - T1 - T2) / AbulkCV;
6843 dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
6848 dVdseffCV_dVg = 0.0;
6849 dVdseffCV_dVb = 0.0;
6852 T0 = AbulkCV * VdseffCV;
6853 T1 = Vgsteff - DeltaPhi;
6854 T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
6856 T4 = 1.0 - 12.0 * T3 * T3;
6857 T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
6858 T6 = T5 * VdseffCV / AbulkCV;
6860 qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3));
6861 QovCox =
qgate / Coxeff;
6862 Cgg1 = CoxWLcen * (T4 * (1.0 -
dDeltaPhi_dVg) + T5 * dVdseffCV_dVg);
6863 Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
6864 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
6865 Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6866 + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6867 Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6872 T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
6874 T11 = -T7 * T5 / AbulkCV;
6875 T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
6877 qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
6878 QovCox =
qbulk / Coxeff;
6879 Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
6880 Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
6881 * dVgsteff_dVd + QovCox * dCoxeff_dVd;
6882 Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
6883 + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6884 Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6888 qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - 0.5 * T0 * T0 / T2);
6889 QovCox =
qsrc / Coxeff;
6892 T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
6897 Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
6898 Csd = CoxWLcen * T5 * dVdseffCV_dVd +
Csg * dVgsteff_dVd
6899 + QovCox * dCoxeff_dVd;
6900 Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
6901 +
Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
6902 Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6907 T3 = 0.5 * CoxWLcen / (T2 * T2);
6908 T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
6909 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
6911 QovCox = qsrc / Coxeff;
6912 T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
6913 T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
6914 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
6915 T6 = AbulkCV * (qsrc / T2 + T3 * T8);
6916 T7 = T6 * VdseffCV / AbulkCV;
6919 Csd =
Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
6920 + QovCox * dCoxeff_dVd;
6921 Csb =
Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
6922 + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
6923 Csg =
Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
6934 qbulk -= (Qac0 + Qsub0);
6937 Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
6938 Cbd = Cbd1 - dQsub0_dVd;
6939 Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
6985 if (drainPerimeter < paramPtr->weff)
6997 if (sourcePerimeter < paramPtr->weff)
7018 capbs = czbs + czbssw + czbsswg;
7026 if (MJ == 0.5) sarg = 1.0 / sqrt(arg);
7027 else sarg = exp(-MJ * log(arg));
7030 qbs =
PhiBTemp * czbs * (1.0 - arg * sarg) / (1.0 - MJ);
7032 capbs = czbs * sarg;
7044 if (MJSW == 0.5) sarg = 1.0 / sqrt(arg);
7045 else sarg = exp(-MJSW * log(arg));
7048 qbs +=
PhiBSWTemp * czbssw * (1.0 - arg * sarg) / (1.0 - MJSW);
7050 capbs += czbssw * sarg;
7056 if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg);
7057 else sarg = exp(-MJSWG * log(arg));
7060 qbs +=
PhiBSWGTemp * czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWG);
7062 capbs += czbsswg * sarg;
7068 T0 = czbs + czbssw + czbsswg;
7069 T1 = vbs * (czbs * MJ /
PhiBTemp + czbssw * MJSW
7073 qbs = vbs * (T0 + 0.5 * T1);
7082 capbd = czbd + czbdsw + czbdswg;
7089 if (MJ == 0.5) sarg = 1.0 / sqrt(arg);
7090 else sarg = exp(-MJ * log(arg));
7093 qbd =
PhiBTemp * czbd * (1.0 - arg * sarg) / (1.0 - MJ);
7094 capbd = czbd * sarg;
7106 if (MJSW == 0.5) sarg = 1.0 / sqrt(arg);
7107 else sarg = exp(-MJSW * log(arg));
7110 qbd +=
PhiBSWTemp * czbdsw * (1.0 - arg * sarg) / (1.0 - MJSW);
7111 capbd += czbdsw * sarg;
7117 if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg);
7118 else sarg = exp(-MJSWG * log(arg));
7121 qbd +=
PhiBSWGTemp * czbdswg * (1.0 - arg * sarg) / (1.0 - MJSWG);
7122 capbd += czbdswg * sarg;
7127 T0 = czbd + czbdsw + czbdswg;
7132 qbd =
vbd * (T0 + 0.5 * T1);
7161 gtau = gtau_drift + gtau_diff;
7220 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
7221 T2 = 0.5 * (T0 - T1);
7225 cgdo =
paramPtr->
cgdo + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1);
7231 T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
7232 T2 = 0.5 * (T0 - T1);
7235 cgso =
paramPtr->
cgso + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1);
7291 bool bsuccess =
true;
7380 double Qqcheq = 0.0;
7405 qVec[
li_Bulk] += (Qeqqb)*numberParallel;
7427 qVec[
li_Charge] += -(Qqcheq - Qqdef)*numberParallel;
7531 msg =
"Instance::auxChargeCalculations ()";
7532 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
7533 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8236 msg =
"Instance::loadDAEdQdx";
8237 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
8238 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8330 += (-
gbgs)*numberParallel;
8391 msg =
"Instance::loadDAEdFdx";
8392 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
8393 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
8452 bool bsuccess =
true;
8491 cox = 3.453133e-11 / tox;
8492 if (!
given(
"TOXM")) toxm = tox;
8493 if (!
given(
"DSUB")) dsub = drout;
8494 if (!
given(
"LLC")) Llc = Ll;
8495 if (!
given(
"LWC")) Lwc = Lw;
8496 if (!
given(
"LWLC")) Lwlc = Lwl;
8497 if (!
given(
"WLC")) Wlc = Wl;
8498 if (!
given(
"WWL")) Wwlc = Wwl;
8499 if (!
given(
"WWLC")) Wwlc = Wwl;
8500 if (!
given(
"DWC")) dwc = Wint;
8501 if (!
given(
"DLC")) dlc = Lint;
8507 double C2 = 1.0 + (0.4e-6 / tox);
8508 double C3 = log(C2);
8514 if (
given(
"DLC") && (dlc > 0.0))
cgdo = dlc * cox - cgdl ;
8515 else cgdo = 0.6 * xj * cox;
8520 if (
given(
"DLC") && (dlc > 0.0))
cgso = dlc * cox - cgsl ;
8521 else cgso = 0.6 * xj * cox;
8524 if (!
given(
"CGBO")) cgbo = 2.0 * dwc * cox;
8526 if (!
given(
"CJSWG"))
8527 unitLengthGateSidewallJctCap = unitLengthSidewallJctCap ;
8529 if (!
given(
"PBSWG"))
8530 GatesidewallJctPotential = sidewallJctPotential;
8532 if (!
given(
"MJSWG"))
8533 bulkJctGateSideGradingCoeff = bulkJctSideGradingCoeff;
8537 if (bulkJctPotential < 0.1)
8539 bulkJctPotential = 0.1;
8540 msg =
"Given pb is less than 0.1. Pb is set to 0.1.\n";
8541 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8544 if (sidewallJctPotential < 0.1)
8546 sidewallJctPotential = 0.1;
8547 msg =
"Given pbsw is less than 0.1. Pbsw is set to 0.1.\n";
8548 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8551 if (GatesidewallJctPotential < 0.1)
8553 GatesidewallJctPotential = 0.1;
8554 msg =
"Given pbswg is less than 0.1. Pbswg is set to 0.1.\n";
8555 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::USR_WARNING_0,msg);
8564 * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
8583 std::vector<Instance*>::iterator iter;
8584 std::vector<Instance*>::iterator first = instanceContainer.begin();
8585 std::vector<Instance*>::iterator last = instanceContainer.end();
8587 for (iter=first; iter!=last; ++iter)
8589 (*iter)->processParams();
8607 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
8966 sheetResistance (0),
8967 jctSatCurDensity (0),
8968 jctSidewallSatCurDensity (0),
8969 bulkJctPotential (0),
8970 bulkJctBotGradingCoeff (0),
8971 bulkJctSideGradingCoeff (0),
8972 bulkJctGateSideGradingCoeff (0),
8973 sidewallJctPotential (0),
8974 GatesidewallJctPotential (0),
8976 unitLengthSidewallJctCap (0),
8977 unitLengthGateSidewallJctCap (0),
8978 jctEmissionCoeff (0),
8979 jctTempExponent (0),
9015 oxideTrapDensityA (0),
9016 oxideTrapDensityB (0),
9017 oxideTrapDensityC (0),
9042 else if (
getType() ==
"PMOS") {
9058 #ifdef Xyce_BSIM3_USE_DEFL
9068 Report::DevelFatal0() <<
"TNOM is zero";
9077 uc = (
mobMod == 3) ? -0.0465 : -0.0465e-9;
9079 uc1 = (
mobMod == 3) ? -0.056 : -0.056e-9;
9117 std::list<SizeDependParam*>::iterator it_dpL =
9119 std::list<SizeDependParam*>::iterator end_dpL =
9121 for( ; it_dpL != end_dpL; ++it_dpL )
9126 std::vector<Instance*>::iterator iter;
9130 for (iter=first; iter!=last; ++iter)
9148 std::vector<Instance*>::const_iterator iter;
9154 os <<
" name modelName Parameters" << std::endl;
9156 for (i=0, iter=first; iter!=last; ++iter,++i)
9158 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
9184 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
9205 std::list<SizeDependParam*>::iterator it_dpL =
9207 std::list<SizeDependParam*>::iterator end_dpL =
9209 for( ; it_dpL != end_dpL; ++it_dpL )
9231 bool bsuccess =
true;
9237 bsuccess = bsuccess && btmp;
9560 double Qqcheq = 0.0;
9645 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
9801 msg =
"Instance::loadDAEMatrices";
9802 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
9803 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
9922 msg =
"Master::loadDAEMatrices";
9923 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
9924 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
9942 int sizeInstances = instanceContainer_.size();
9943 for (
int i=0; i<sizeInstances; ++i)
9945 Instance & mi = *(instanceContainer_.at(i));
10098 msg =
"Master::loadDAEMatrices";
10099 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
10100 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
10219 msg =
"Master::loadDAEMatrices";
10220 msg +=
" nqsMod=1 is not ready yet. Re-run with nqsMod=0\n";
10221 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
10238 .registerDevice(
"m", 9)
10239 .registerDevice(
"m", 49)
10240 .registerModelType(
"pmos", 9)
10241 .registerModelType(
"nmos", 9)
10242 .registerModelType(
"pmos", 49)
10243 .registerModelType(
"nmos", 49);