This package Mos contains functions and records with data of the mosfet models level 1, 2, 3 and 6.
Extends from Modelica.Icons.Package (Icon for standard packages).
| Name | Description | 
|---|---|
| Record for Mosfet model line parameters (for level 1, 2, 3 and 6) | |
| Record for Mosfet model line variables (for level 1) | |
| Further mosfet variables (for level 1, 2, 3 and 6) | |
| Meyer capacities and charge | |
| Currents and Capacities | |
| Mosfet initial precalculations (level 1) | |
| Precalculation relating to temperature | |
| Calculation of currents and capacities (level 1) | |
| Calculation of meyer capacities | |
| Mosfet initial precalculations (level 1) | |
| Precalculation relating to temperature | |
| Calculation of currents and capacities (level 2) | 
This record MosModelLineParams contains the model line parameters that are used for the mosfet transistors level 1, 2, 3 and 6 in SPICE3.
Extends from Mosfet.MosfetModelLineParams (Record for Mosfet model line parameters).
| Type | Name | Default | Description | 
|---|---|---|---|
| Initialization | |||
| Real | m_jctSatCurDensity.start | 0.0 | JS, Bulk jct. sat. current density, input - use tSatCurDens | 
| Resistance | m_sheetResistance.start | 0.0 | RSH, Sheet resistance [Ohm] | 
| Real | m_bulkJctPotential.start | 0.8 | PB, Bulk junction potential, input - use tBulkPot | 
| Real | m_bulkJctBotGradingCoeff.start | 0.5 | MJ, Bottom grading coefficient | 
| Real | m_bulkJctSideGradingCoeff.start | 0.5 | MJSW, Side grading coefficient | 
| Real | m_oxideThickness.start | 1.0e-7 | TOX, Oxide thickness unit: micron | 
| Real | m_gateSourceOverlapCapFactor.start | 0.0 | CGS0, Gate-source overlap cap | 
| Real | m_gateDrainOverlapCapFactor.start | 0.0 | CGD0, Gate-drain overlap cap | 
| Real | m_gateBulkOverlapCapFactor.start | 0.0 | CGB0, Gate-bulk overlap cap | 
| Real | m_fNcoef.start | 0.0 | KF, Flicker noise coefficient | 
| Real | m_fNexp.start | 1.0 | AF, Flicker noise exponent | 
record MosModelLineParams 
  "Record for Mosfet model line parameters (for level 1, 2, 3 and 6)"
  extends Mosfet.MosfetModelLineParams;
   Real m_oxideCapFactor(      start = 0.0);
   Modelica.SIunits.Voltage m_vt0(                 start = 0.0) 
    "VTO, Threshold voltage";
   Real m_vtOIsGiven "VTO IsGivenValue";
   Modelica.SIunits.Capacitance m_capBD(               start = 0.0) 
    "CBD, B-D junction capacitance";
   Real m_capBDIsGiven "CapBD IsGivenValue";
   Modelica.SIunits.Capacitance m_capBS(               start = 0.0) 
    "CBS, B-S junction capacitance";
   Real m_capBSIsGiven "CapBS IsGivenValue";
   Modelica.SIunits.CapacitancePerArea m_bulkCapFactor(       start = 0.0) 
    "CJ, Bottom junction cap per area";
   Real m_bulkCapFactorIsGiven "Bulk cap factor IsGivenValue";
   Modelica.SIunits.Permittivity m_sideWallCapFactor(   start = 0.0) 
    "CJSW, Side grading coefficient";
   Real m_fwdCapDepCoeff(      start = 0.5) "FC, Forward bias jct. fit parm.";
   Modelica.SIunits.Voltage m_phi(                 start = 0.6) 
    "PHI, Surface potential";
   Real m_phiIsGiven "Phi IsGivenValue";
   Modelica.SIunits.Voltage m_gamma(               start = 0.0) 
    "GAMMA, Bulk threshold parameter";
   Real m_gammaIsGiven "Gamma IsGivenValue";
   Modelica.SIunits.InversePotential m_lambda "Channel-length modulation";
   Real m_substrateDoping(     start = 0.0) "NSUB, Substrate doping";
   Real m_substrateDopingIsGiven "Substrate doping IsGivenValue";
   Real m_gateType(            start = 1.0) "TPG, Gate type";
   Modelica.SIunits.Conversions.NonSIunits.PerArea_cm
    m_surfaceStateDensity(                                                   start = 0.0) 
    "NSS, Gate type";
   Real m_surfaceStateDensityIsGiven "surfaceStateDensityIsGivenValue";
   Modelica.SIunits.Conversions.NonSIunits.Area_cmPerVoltageSecond
    m_surfaceMobility( start = 600.0) "UO, Surface mobility";
   Modelica.SIunits.Length m_latDiff(             start = 0.0) 
    "LD, Lateral diffusion";
   Modelica.SIunits.Current m_jctSatCur(           start = 1.0e-14) 
    "IS, Bulk junction sat. current";
   Modelica.SIunits.Resistance m_drainResistance(     start = 0) 
    "RD, Drain ohmic resistance";
   Real m_drainResistanceIsGiven "Drain resistance IsGivenValue";
   Modelica.SIunits.Resistance m_sourceResistance(    start = 0) 
    "RS, Source ohmic resistance";
   Real m_sourceResistanceIsGiven "Source resistance IsGivenValue";
   Modelica.SIunits.Transconductance m_transconductance 
    "input - use tTransconductance";
   Real m_transconductanceIsGiven "Transconductance IsGivenValue";
   Modelica.SIunits.Temp_K m_tnom(start=SpiceConstants.CKTnomTemp) 
    "TNOM, Parameter measurement temperature";
end MosModelLineParams;
 
This record MosModelLineVariables contains the model line variables that are used for the mosfet transistors level 1 SPICE3.
record MosModelLineVariables "Record for Mosfet model line variables (for level 1)" Real m_oxideCapFactor; Modelica.SIunits.Voltage m_vt0; Modelica.SIunits.Voltage m_phi; Real m_gamma; Modelica.SIunits.Transconductance m_transconductance;end MosModelLineVariables; 
This record MosCalc contains further mosfet variables (for level 1, 2, 3 and 6).
Extends from Mosfet.MosfetCalc (Mosfet Variables).
| Type | Name | Default | Description | 
|---|---|---|---|
| Initialization | |||
| Integer | m_mode.start | 1 | Mode | 
record MosCalc "Further mosfet variables (for level 1, 2, 3 and 6)" extends Mosfet.MosfetCalc; Modelica.SIunits.Transconductance m_tTransconductance( start = 0.); Real m_tSurfMob( start = 0.); Modelica.SIunits.Voltage m_tPhi( start = 0.7); Modelica.SIunits.Voltage m_tVto( start = 1.); Real m_tSatCurDens( start = 0.); Modelica.SIunits.Current m_tDrainSatCur( start = 0.); Modelica.SIunits.Current m_tSourceSatCur( start = 0.); Modelica.SIunits.Capacitance m_tCBDb( start = 0.); Modelica.SIunits.Capacitance m_tCBDs( start = 0.); Modelica.SIunits.Capacitance m_tCBSb( start = 0.); Modelica.SIunits.Capacitance m_tCBSs( start = 0.); Real m_tCj( start = 0.); Real m_tCjsw( start = 0.); Modelica.SIunits.Voltage m_tBulkPot( start = 0.7); Real m_tDepCap( start = 0.35); Modelica.SIunits.Voltage m_tVbi( start = 1.); Modelica.SIunits.Voltage m_VBScrit( start = 0.7); Modelica.SIunits.Voltage m_VBDcrit( start = 0.7); Real m_f1b( start = 0.); Real m_f2b( start = 0.); Real m_f3b( start = 0.); Real m_f1s( start = 0.); Real m_f2s( start = 0.); Real m_f3s( start = 0.); Real m_dVt( start = 0.); Modelica.SIunits.Capacitance m_capgd( start = 0.); Modelica.SIunits.Capacitance m_capgs( start = 0.); Modelica.SIunits.Capacitance m_capgb( start = 0.); Modelica.SIunits.Charge m_qgs( start = 0.); Modelica.SIunits.Charge m_qgd( start = 0.); Modelica.SIunits.Charge m_qgb( start = 0.);end MosCalc; 
This record DEVqmeyer contains values that are needed for the calculation of the meyer capacities and charge.
record DEVqmeyer "Meyer capacities and charge" Modelica.SIunits.Capacitance qm_capgb( start = 0); Modelica.SIunits.Capacitance qm_capgs( start = 0); Modelica.SIunits.Capacitance qm_capgd( start = 0); Modelica.SIunits.Charge qm_qgs( start = 0); Modelica.SIunits.Charge qm_qgb( start = 0); Modelica.SIunits.Charge qm_qgd( start = 0); Modelica.SIunits.Voltage qm_vgs( start = 0); Modelica.SIunits.Voltage qm_vgb( start = 0); Modelica.SIunits.Voltage qm_vgd( start = 0);end DEVqmeyer; 
This record CurrentsCapacities contains values for the currents and the capacities inside the mosfet models level 1, 2, 3 and 6.
record CurrrentsCapacitances "Currents and Capacities" Modelica.SIunits.Current idrain( start = 0); Modelica.SIunits.Current iBD( start = 0); Modelica.SIunits.Current iBS( start = 0); Modelica.SIunits.Capacitance cGS( start = 0); Modelica.SIunits.Capacitance cGB( start = 0); Modelica.SIunits.Capacitance cGD( start = 0); Modelica.SIunits.Capacitance cBS( start = 0); Modelica.SIunits.Capacitance cBD( start = 0); Modelica.SIunits.Capacitance m_capgd;end CurrrentsCapacitances; 
This function mosCalcInitEquations does the initial precalculation of the mosfet parameters (level 1).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mos1ModelLineParams | in_p | Input record model line parameters for MOS1 | |
| SpiceConstants | in_C | Input record SPICE constants | |
| MosModelLineVariables | in_vp | Input record model line variables | |
| Mosfet | in_m | Input record mosfet parameters | 
| Type | Name | Description | 
|---|---|---|
| Mos1Calc | out_c | Output record Mos1 calculated values | 
function mosCalcInitEquations 
  "Mosfet initial precalculations (level 1)"
  input Mos1.Mos1ModelLineParams in_p 
    "Input record model line parameters for MOS1";
  input SpiceConstants in_C "Input record SPICE constants";
  input Mos.MosModelLineVariables in_vp "Input record model line variables";
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  output Mos1.Mos1Calc out_c "Output record Mos1 calculated values";
algorithm 
   out_c.m_drainResistance := if 
                                (in_p.m_drainResistanceIsGiven > 0.5) then 
       in_p.m_drainResistance else 
       in_p.m_sheetResistance * in_m.m_drainSquares;
   out_c.m_sourceResistance := if  (in_p.m_sourceResistanceIsGiven > 0.5) then 
       in_p.m_sourceResistance else 
       in_p.m_sheetResistance * in_m.m_sourceSquares;
  out_c.m_lEff := in_m.m_len - 2 * in_p.m_latDiff;
  if ( abs( out_c.m_lEff) < 1e-18) then
    out_c.m_lEff := 1e-6;
  end if;
  out_c.m_capGSovl := in_p.m_gateSourceOverlapCapFactor * in_m.m_width;
  out_c.m_capGDovl := in_p.m_gateDrainOverlapCapFactor * in_m.m_width;
  out_c.m_capGBovl := in_p.m_gateBulkOverlapCapFactor * out_c.m_lEff;
  out_c.m_capOx    := in_vp.m_oxideCapFactor * out_c.m_lEff * in_m.m_width;
end mosCalcInitEquations;
 
This function mosCalcCalcTempDependencies does precalculation relating to the temperature (level 1).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mos1ModelLineParams | in_p | Input record model line parameters for MOS1 | |
| SpiceConstants | in_C | Input record SPICE constants | |
| MosModelLineVariables | in_vp | Input record model line variables | |
| Mosfet | in_m | Input record mosfet parameters | |
| Mos1Calc | in_c | Input record Mos1Calc | |
| Integer | in_m_type | Type of MOS transistor | 
| Type | Name | Description | 
|---|---|---|
| Mos1Calc | out_c | Output record with calculated values | 
function mosCalcCalcTempDependencies 
  "Precalculation relating to temperature"
  input Mos1.Mos1ModelLineParams in_p 
    "Input record model line parameters for MOS1";
  input SpiceConstants in_C "Input record SPICE constants";
  input Mos.MosModelLineVariables in_vp "Input record model line variables";
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  input Mos1.Mos1Calc in_c "Input record Mos1Calc";
  input Integer in_m_type "Type of MOS transistor";
  output Mos1.Mos1Calc out_c "Output record with calculated values";
protected 
   Real ratio;
   Real ratio4;
   Real res;
algorithm 
  out_c := in_c;
  ratio                     := in_m.m_dTemp / in_p.m_tnom;
  ratio4                    := ratio * sqrt(ratio);
  out_c.m_tTransconductance := in_vp.m_transconductance / ratio4;
  out_c.m_Beta              := out_c.m_tTransconductance * in_m.m_width / out_c.m_lEff;
  out_c.m_tSurfMob          := in_p.m_surfaceMobility / ratio4;
  out_c.m_tPhi := Modelica.Electrical.Spice3.Internal.Functions.junctionPotDepTemp(
                                              in_vp.m_phi, in_m.m_dTemp, in_p.m_tnom);
  out_c.m_tVbi := in_vp.m_vt0 - in_m_type * (in_vp.m_gamma * sqrt(in_vp.m_phi)) +0.5  *
                  (Modelica.Electrical.Spice3.Internal.Functions.energyGapDepTemp(
                                              in_p.m_tnom) - Modelica.Electrical.Spice3.Internal.Functions.energyGapDepTemp(
                                                                                        in_m.m_dTemp))
                  + in_m_type *0.5  * (out_c.m_tPhi - in_vp.m_phi);
  out_c.m_tVto := out_c.m_tVbi + in_m_type * in_vp.m_gamma * sqrt(out_c.m_tPhi);
  out_c.m_tBulkPot := Modelica.Electrical.Spice3.Internal.Functions.junctionPotDepTemp(
                                                  in_p.m_bulkJctPotential,in_m.m_dTemp, in_p.m_tnom);
  out_c.m_tDepCap  := in_p.m_fwdCapDepCoeff * out_c.m_tBulkPot;
 if (in_p.m_jctSatCurDensity == 0.0 or in_m.m_sourceArea == 0.0 or in_m.m_drainArea == 0.0) then
    out_c.m_tDrainSatCur  := Modelica.Electrical.Spice3.Internal.Functions.saturationCurDepTempSPICE3MOSFET(
                             in_p.m_jctSatCur, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tSourceSatCur := out_c.m_tDrainSatCur;
    out_c.m_VBScrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tSourceSatCur);
    out_c.m_VBDcrit       := out_c.m_VBScrit;
  else
    out_c.m_tSatCurDens   := Modelica.Electrical.Spice3.Internal.Functions.saturationCurDepTempSPICE3MOSFET(
                             in_p.m_jctSatCurDensity, in_m.m_dTemp,in_p.m_tnom);
    out_c.m_tDrainSatCur  := out_c.m_tSatCurDens * in_m.m_drainArea;
    out_c.m_tSourceSatCur := out_c.m_tSatCurDens * in_m.m_sourceArea;
    out_c.m_VBScrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tSourceSatCur);
    out_c.m_VBDcrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tDrainSatCur);
  end if;
  if ( not (in_p.m_capBDIsGiven > 0.5) or not (in_p.m_capBSIsGiven > 0.5)) then
    (res,out_c.m_tCj)   := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_bulkCapFactor,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    (res,out_c.m_tCjsw) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_sideWallCapFactor,
                              in_p.m_bulkJctSideGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    (out_c.m_f1s, out_c.m_f2s, out_c.m_f3s) := Modelica.Electrical.Spice3.Internal.Functions.junctionCapCoeffs(
                              in_p.m_bulkJctSideGradingCoeff, in_p.m_fwdCapDepCoeff, out_c.m_tBulkPot);
  end if;
  if (in_p.m_capBDIsGiven > 0.5) then
    (res,out_c.m_tCBDb) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_capBD,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tCBDs          := 0.0;
  else
    out_c.m_tCBDb := out_c.m_tCj * in_m.m_drainArea;
    out_c.m_tCBDs := out_c.m_tCjsw * in_m.m_drainPerimiter;
  end if;
  if (in_p.m_capBSIsGiven > 0.5) then
    (res,out_c.m_tCBSb) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_capBS,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tCBSs          := 0.0;
  else
    out_c.m_tCBSb := out_c.m_tCj * in_m.m_sourceArea;
    out_c.m_tCBSs := out_c.m_tCjsw * in_m.m_sourcePerimiter;
  end if;
   (out_c.m_f1b, out_c.m_f2b, out_c.m_f3b) := Modelica.Electrical.Spice3.Internal.Functions.junctionCapCoeffs(
                                              in_p.m_bulkJctBotGradingCoeff,
                                              in_p.m_fwdCapDepCoeff, out_c.m_tBulkPot);
  out_c.m_dVt   := in_m.m_dTemp * SpiceConstants.CONSTKoverQ;
end mosCalcCalcTempDependencies;
 
This function NoBypassCode calculates the currents (and the capacitances) that are necessary for the currents sum in the toplevelmodel (level 1).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mosfet | in_m | Input record mosfet parameters | |
| Integer | in_m_type | Type of MOS transistor | |
| Mos1Calc | in_c | Input record Mos1Calc | |
| Mos1ModelLineParams | in_p | Input record model line parameters for MOS1 | |
| SpiceConstants | in_C | Input record SPICE constants | |
| MosModelLineVariables | in_vp | Input record model line variables | |
| Boolean | in_m_bInit | ||
| Voltage | in_m_pVoltageValues[4] | [V] | 
| Type | Name | Description | 
|---|---|---|
| CurrrentsCapacitances | out_cc | 
function mosCalcNoBypassCode 
  "Calculation of currents and capacities (level 1)"
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  input Integer in_m_type "Type of MOS transistor";
  input Mos1.Mos1Calc in_c "Input record Mos1Calc";
  input Mos1.Mos1ModelLineParams in_p 
    "Input record model line parameters for MOS1";
  input SpiceConstants in_C "Input record SPICE constants";
  input Mos.MosModelLineVariables in_vp "Input record model line variables";
  input Boolean in_m_bInit;
  input Modelica.SIunits.Voltage[4] in_m_pVoltageValues; /* gate bulk drain source */
  output CurrrentsCapacitances out_cc;
protected 
  Modelica.SIunits.Voltage vbd;
  Modelica.SIunits.Voltage vgd;
  Modelica.SIunits.Voltage vgb;
  Modelica.SIunits.Current cur;
  Integer n;
  DEVqmeyer qm;
  Mos1.Mos1Calc int_c;
  Real hlp;
algorithm 
  int_c := in_c;
  int_c.m_vgs := in_m_type * (in_m_pVoltageValues[1] - in_m_pVoltageValues[4]); // ( G , SP)
  int_c.m_vbs := in_m_type * (in_m_pVoltageValues[2] - in_m_pVoltageValues[4]); // ( B , SP)
  int_c.m_vds := in_m_type * (in_m_pVoltageValues[3] - in_m_pVoltageValues[4]); // ( DP, SP)
  if ( SpiceRoot.useInitialConditions())    and (in_m.m_dICVBSIsGiven >0.5) then
    int_c.m_vbs := in_m_type * in_m.m_dICVBS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    int_c.m_vbs := if (in_m.m_off >0.5) then 0. else int_c.m_VBScrit;
  end if;
  if ( SpiceRoot.useInitialConditions()) and (in_m.m_dICVDSIsGiven > 0.5) then
    int_c.m_vds := in_m_type * in_m.m_dICVDS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    int_c.m_vds := if (in_m.m_off > 0.5) then 0. else (int_c.m_VBDcrit - int_c.m_VBScrit);
  end if;
  if ( SpiceRoot.useInitialConditions()) and (in_m.m_dICVGSIsGiven > 0.5) then
    int_c.m_vgs := in_m_type * in_m.m_dICVGS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    if ( in_m.m_off > 0.5) then
      int_c.m_vgs := 0.;
    end if;
  end if;
  vbd := int_c.m_vbs - int_c.m_vds;
  vgd := int_c.m_vgs - int_c.m_vds;
  if ( int_c.m_vds >= 0) then
    vbd         := int_c.m_vbs - int_c.m_vds;
  else
      int_c.m_vbs := vbd + int_c.m_vds;
  end if;
  vgb := int_c.m_vgs - int_c.m_vbs;
   (int_c.m_cbd, int_c.m_gbd) := Modelica.Electrical.Spice3.Internal.Functions.junction2SPICE3MOSFET(
                                                                 int_c.m_cbd, int_c.m_gbd, vbd,
                                 in_m.m_dTemp, 1.0, int_c.m_tDrainSatCur);
   out_cc.iBD                 := in_m_type * int_c.m_cbd;
   (int_c.m_cbs, int_c.m_gbs) := Modelica.Electrical.Spice3.Internal.Functions.junction2SPICE3MOSFET(
                                                                 int_c.m_cbs, int_c.m_gbs, int_c.m_vbs,
                                 in_m.m_dTemp, 1.0, int_c.m_tSourceSatCur);
   out_cc.iBS                 := in_m_type * int_c.m_cbs;
  int_c.m_mode := if (int_c.m_vds >= 0) then 1 else -1; // 1: normal mode, -1: inverse mode
  if (int_c.m_mode == 1) then
    int_c := Mos1.drainCur( int_c.m_vbs, int_c.m_vgs, int_c.m_vds, int_c, in_p, in_C, in_vp, in_m_type);
  else
    int_c := Mos1.drainCur( vbd,               vgd,  -int_c.m_vds, int_c, in_p, in_C, in_vp, in_m_type);
  end if;
  n      := if (int_c.m_mode == 1) then 6 else 5;
  out_cc.idrain := in_m_type * int_c.m_cdrain * int_c.m_mode;
  int_c.m_capbss    := 0.0;
  int_c.m_chargebss := 0.0;
  int_c.m_capbds    := 0.0;
  int_c.m_chargebds := 0.0;
  (int_c.m_capbsb, int_c.m_chargebsb) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBSb, int_c.m_vbs, int_c.m_tDepCap,
         in_p.m_bulkJctBotGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1b, int_c.m_f2b, int_c.m_f3b);
  (int_c.m_capbdb, int_c.m_chargebdb) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBDb, vbd, int_c.m_tDepCap,
         in_p.m_bulkJctBotGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1b, int_c.m_f2b, int_c.m_f3b);
  if ( not (in_p.m_capBSIsGiven > 0.5)) then
    (int_c.m_capbss, int_c.m_chargebss) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBSs,int_c. m_vbs, int_c.m_tDepCap,
         in_p.m_bulkJctSideGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1s, int_c.m_f2s, int_c.m_f3s);
  end if;
  if (not (in_p.m_capBDIsGiven > 0.5)) then
    (int_c.m_capbds, int_c.m_chargebds) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBDs, vbd, int_c.m_tDepCap,
         in_p.m_bulkJctSideGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1s, int_c.m_f2s, int_c.m_f3s);
  end if;
  out_cc.cBS := if (in_m_bInit) then 1e-15 else (int_c.m_capbsb + int_c.m_capbss);
  out_cc.cBD := if (in_m_bInit) then 1e-15 else (int_c.m_capbdb + int_c.m_capbds);
  if (int_c.m_mode > 0) then
    qm := mosCalcDEVqmeyer( int_c.m_vgs, vgd, vgb, int_c);
  else
    qm := mosCalcDEVqmeyer( vgd, int_c.m_vgs, vgb, int_c);
    hlp := qm.qm_capgd;
    qm.qm_capgd := qm.qm_capgs;
    qm.qm_capgs := hlp;
  end if;
    int_c.m_capgd := 2 * qm.qm_capgd + int_c.m_capGDovl;
    int_c.m_capgs := 2 * qm.qm_capgs + int_c.m_capGSovl;
    int_c.m_capgb := 2 * qm.qm_capgb + int_c.m_capGBovl;
  out_cc.cGB := if (in_m_bInit) then -1e40 else int_c.m_capgb;
  out_cc.cGD := if (in_m_bInit) then -1e40 else int_c.m_capgd;
  out_cc.cGS := if (in_m_bInit) then -1e40 else int_c.m_capgs;
end mosCalcNoBypassCode;
 
This function mosCalcDEVqmeyer calculates the meyer capacities and charge for the meyer model.
| Type | Name | Default | Description | 
|---|---|---|---|
| Voltage | vgs | [V] | |
| Voltage | vgd | [V] | |
| Voltage | vgb | [V] | |
| MosCalc | in_c | Input variable set | 
| Type | Name | Description | 
|---|---|---|
| DEVqmeyer | out_qm | Qmeyer values | 
function mosCalcDEVqmeyer "Calculation of meyer capacities"
  input Modelica.SIunits.Voltage vgs;
  input Modelica.SIunits.Voltage vgd;
  input Modelica.SIunits.Voltage vgb;
  input MosCalc in_c "Input variable set";
  output DEVqmeyer out_qm "Qmeyer values";
protected 
  Modelica.SIunits.Voltage vds;
  Real vddif;
  Real vddif1;
  Real vddif2;
  Modelica.SIunits.Voltage vgst;
algorithm 
  vgst := vgs - in_c.m_von;
  if (vgst <= -in_c.m_tPhi) then
    out_qm.qm_capgb := in_c.m_capOx / 2.;
    out_qm.qm_capgs := 0.;
    out_qm.qm_capgd := 0.;
  elseif (vgst <= -in_c.m_tPhi / 2.) then
    out_qm.qm_capgb := -vgst * in_c.m_capOx / (2. * in_c.m_tPhi);
    out_qm.qm_capgs := 0.;
    out_qm.qm_capgd := 0.;
  elseif (vgst <= 0.) then
    out_qm.qm_capgb := -vgst * in_c.m_capOx / (2. * in_c.m_tPhi);
    out_qm.qm_capgs := vgst * in_c.m_capOx / (1.5 * in_c.m_tPhi) + in_c.m_capOx / 3.;
    out_qm.qm_capgd := 0.;
  else
    vds := vgs - vgd;
    if (in_c.m_vdsat <= vds) then
      out_qm.qm_capgs := in_c.m_capOx / 3.;
      out_qm.qm_capgd := 0.;
      out_qm.qm_capgb := 0.;
    else
      vddif  := 2.0 * in_c.m_vdsat - vds;
      vddif1 := in_c.m_vdsat - vds;
      vddif2 := vddif * vddif;
      out_qm.qm_capgd := in_c.m_capOx * (1. - in_c.m_vdsat  * in_c.m_vdsat  / vddif2) / 3.;
      out_qm.qm_capgs := in_c.m_capOx * (1. - vddif1 * vddif1 / vddif2) / 3.;
      out_qm.qm_capgb := 0.;
    end if;
  end if;
end mosCalcDEVqmeyer;
 
This function mosCalcInitEquations does the initial precalculation of the mosfet parameters (level 2).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mos2ModelLineParams | in_p | Input record Mos2 values | |
| SpiceConstants | in_C | Spice constants | |
| MosModelLineVariables | in_vp | Input record model line variables | |
| Mosfet | in_m | Input record mosfet parameters | 
| Type | Name | Description | 
|---|---|---|
| Mos2Calc | out_c | Output record Mos2 calculated values | 
function mos2CalcInitEquations 
  "Mosfet initial precalculations (level 1)"
  input Mos2.Mos2ModelLineParams in_p "Input record Mos2 values";
  input SpiceConstants in_C "Spice constants";
  input Mos.MosModelLineVariables in_vp "Input record model line variables";
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  output Mos2.Mos2Calc out_c "Output record Mos2 calculated values";
algorithm 
 out_c.m_drainResistance := if  (in_p.m_drainResistanceIsGiven > 0.5) then 
       in_p.m_drainResistance else 
       in_p.m_sheetResistance * in_m.m_drainSquares;
out_c.m_sourceResistance := if  (in_p.m_sourceResistanceIsGiven > 0.5) then 
       in_p.m_sourceResistance else 
       in_p.m_sheetResistance * in_m.m_sourceSquares;
  out_c.m_lEff := in_m.m_len - 2 * in_p.m_latDiff;
  if ( abs( out_c.m_lEff) < 1e-18) then
    out_c.m_lEff := 1e-6;
  end if;
  out_c.m_capGSovl := in_p.m_gateSourceOverlapCapFactor * in_m.m_width;
  out_c.m_capGDovl := in_p.m_gateDrainOverlapCapFactor * in_m.m_width;
  out_c.m_capGBovl := in_p.m_gateBulkOverlapCapFactor * out_c.m_lEff;
  out_c.m_capOx    := in_vp.m_oxideCapFactor * out_c.m_lEff * in_m.m_width;
end mos2CalcInitEquations;
 
This function mosCalcCalcTempDependencies does precalculation relating to the temperature (level 2).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mos2ModelLineParams | in_p | Output record Mos1 calculated values | |
| SpiceConstants | in_C | Spice constants | |
| MosModelLineVariables | in_vp | Input record model line variables | |
| Mosfet | in_m | Input record mosfet parameters | |
| Mos2Calc | in_c | Input record Mos2Calc | |
| Integer | in_m_type | Type of MOS transistor | 
| Type | Name | Description | 
|---|---|---|
| Mos2Calc | out_c | Output record with calculated values | 
function mos2CalcCalcTempDependencies 
  "Precalculation relating to temperature"
  input Mos2.Mos2ModelLineParams in_p "Output record Mos1 calculated values";
  input SpiceConstants in_C "Spice constants";
  input Mos.MosModelLineVariables in_vp "Input record model line variables";
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  input Mos2.Mos2Calc in_c "Input record Mos2Calc";
  input Integer in_m_type "Type of MOS transistor";
  output Mos2.Mos2Calc out_c "Output record with calculated values";
protected 
   Real ratio;
   Real ratio4;
algorithm 
  out_c := in_c;
  ratio                     := in_m.m_dTemp / in_p.m_tnom;
  ratio4                    := ratio * sqrt(ratio);
  out_c.m_tTransconductance := in_vp.m_transconductance / ratio4;
  out_c.m_Beta              := out_c.m_tTransconductance * in_m.m_width / out_c.m_lEff;
  out_c.m_tSurfMob          := in_p.m_surfaceMobility / ratio4;
  out_c.m_tPhi := Modelica.Electrical.Spice3.Internal.Functions.junctionPotDepTemp(
                                              in_vp.m_phi, in_m.m_dTemp, in_p.m_tnom);
  out_c.m_tVbi := in_vp.m_vt0 - in_m_type * (in_vp.m_gamma * sqrt(in_vp.m_phi)) +0.5  *
                  (Modelica.Electrical.Spice3.Internal.Functions.energyGapDepTemp(
                                              in_p.m_tnom) - Modelica.Electrical.Spice3.Internal.Functions.energyGapDepTemp(
                                                                                        in_m.m_dTemp))
                  + in_m_type *0.5  * (out_c.m_tPhi - in_vp.m_phi);
  out_c.m_tVto := out_c.m_tVbi + in_m_type * in_vp.m_gamma * sqrt(out_c.m_tPhi);
  out_c.m_tBulkPot := Modelica.Electrical.Spice3.Internal.Functions.junctionPotDepTemp(
                                                  in_p.m_bulkJctPotential,in_m.m_dTemp, in_p.m_tnom);
  out_c.m_tDepCap  := in_p.m_fwdCapDepCoeff * out_c.m_tBulkPot;
  if (in_p.m_jctSatCurDensity == 0.0 or in_m.m_sourceArea == 0.0 or in_m.m_drainArea == 0.0) then
    out_c.m_tDrainSatCur  := Modelica.Electrical.Spice3.Internal.Functions.saturationCurDepTempSPICE3MOSFET(
                             in_p.m_jctSatCur, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tSourceSatCur := out_c.m_tDrainSatCur;
    out_c.m_VBScrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tSourceSatCur);
    out_c.m_VBDcrit       := out_c.m_VBScrit;
  else
    out_c.m_tSatCurDens   := Modelica.Electrical.Spice3.Internal.Functions.saturationCurDepTempSPICE3MOSFET(
                             in_p.m_jctSatCurDensity, in_m.m_dTemp,in_p.m_tnom);
    out_c.m_tDrainSatCur  := out_c.m_tSatCurDens * in_m.m_drainArea;
    out_c.m_tSourceSatCur := out_c.m_tSatCurDens * in_m.m_sourceArea;
    out_c.m_VBScrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tSourceSatCur);
    out_c.m_VBDcrit       := Modelica.Electrical.Spice3.Internal.Functions.junctionVCrit(
                                                     in_m.m_dTemp, 1.0, out_c.m_tDrainSatCur);
  end if;
  if ( not (in_p.m_capBDIsGiven > 0.5) or not (in_p.m_capBSIsGiven > 0.5)) then
    (out_c.m_tCj)   := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_bulkCapFactor,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    (out_c.m_tCjsw) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_sideWallCapFactor,
                              in_p.m_bulkJctSideGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    (out_c.m_f1s, out_c.m_f2s, out_c.m_f3s) := Modelica.Electrical.Spice3.Internal.Functions.junctionCapCoeffs(
                              in_p.m_bulkJctSideGradingCoeff, in_p.m_fwdCapDepCoeff, out_c.m_tBulkPot);
  end if;
  if (in_p.m_capBDIsGiven > 0.5) then
    (out_c.m_tCBDb) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_capBD,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tCBDs          := 0.0;
  else
    out_c.m_tCBDb := out_c.m_tCj * in_m.m_drainArea;
    out_c.m_tCBDs := out_c.m_tCjsw * in_m.m_drainPerimiter;
  end if;
  if (in_p.m_capBSIsGiven > 0.5) then
    (out_c.m_tCBSb) := Modelica.Electrical.Spice3.Internal.Functions.junctionParamDepTempSPICE3(
                              in_p.m_bulkJctPotential, in_p.m_capBS,
                              in_p.m_bulkJctBotGradingCoeff, in_m.m_dTemp, in_p.m_tnom);
    out_c.m_tCBSs          := 0.0;
  else
    out_c.m_tCBSb := out_c.m_tCj * in_m.m_sourceArea;
    out_c.m_tCBSs := out_c.m_tCjsw * in_m.m_sourcePerimiter;
  end if;
   (out_c.m_f1b, out_c.m_f2b, out_c.m_f3b) := Modelica.Electrical.Spice3.Internal.Functions.junctionCapCoeffs(
                                              in_p.m_bulkJctBotGradingCoeff,
                                              in_p.m_fwdCapDepCoeff, out_c.m_tBulkPot);
  out_c.m_dVt   := in_m.m_dTemp * SpiceConstants.CONSTKoverQ;
end mos2CalcCalcTempDependencies;
 
This function NoBypassCode calculates the currents (and the capacitances) that are necessary for the currents sum in the toplevelmodel (level 2).
| Type | Name | Default | Description | 
|---|---|---|---|
| Mosfet | in_m | Input record mosfet parameters | |
| Integer | in_m_type | Type of MOS transistor | |
| Mos2Calc | in_c | Input record Mos2Calc | |
| Mos2ModelLineParams | in_p | Input record model line parameters | |
| SpiceConstants | in_C | Spice constants | |
| Mos2ModelLineVariables | in_vp | Input record model line variables | |
| Boolean | in_m_bInit | ||
| Voltage | in_m_pVoltageValues[4] | [V] | 
| Type | Name | Description | 
|---|---|---|
| CurrrentsCapacitances | out_cc | Calculated currents and capacitances | 
| DEVqmeyer | qm | Calculated qmeyer values | 
function mos2CalcNoBypassCode 
  "Calculation of currents and capacities (level 2)"
  input Mosfet.Mosfet in_m "Input record mosfet parameters";
  input Integer in_m_type "Type of MOS transistor";
  input Mos2.Mos2Calc in_c "Input record Mos2Calc";
  input Mos2.Mos2ModelLineParams in_p "Input record model line parameters";
  input SpiceConstants in_C "Spice constants";
  input Mos2.Mos2ModelLineVariables in_vp "Input record model line variables";
  input Boolean in_m_bInit;
  input Modelica.SIunits.Voltage[4] in_m_pVoltageValues; /* gate bulk drain source */
  output CurrrentsCapacitances out_cc "Calculated currents and capacitances";
  output DEVqmeyer qm "Calculated qmeyer values";
protected 
  Modelica.SIunits.Voltage vbd "Voltage";
  Modelica.SIunits.Voltage vgd "Volatge";
  Modelica.SIunits.Voltage vgb "Voltage";
  Modelica.SIunits.Current cur "Voltage";
  Integer n;
  DEVqmeyer in_qm "Qmeyer capacitances";
  Mos2.Mos2Calc int_c "Record Mos2Calc";
  Mosfet.Mosfet int_m "Record Mosfet";
  Real hlp;
algorithm 
  int_c := in_c;
  int_c.m_vgs := in_m_type * (in_m_pVoltageValues[1] - in_m_pVoltageValues[4]); // ( G , SP)
  int_c.m_vbs := in_m_type * (in_m_pVoltageValues[2] - in_m_pVoltageValues[4]); // ( B , SP)
  int_c.m_vds := in_m_type * (in_m_pVoltageValues[3] - in_m_pVoltageValues[4]); // ( DP, SP)
  if ( SpiceRoot.useInitialConditions())    and (in_m.m_dICVBSIsGiven >0.5) then
    int_c.m_vbs := in_m_type * in_m.m_dICVBS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    int_c.m_vbs := if (in_m.m_off >0.5) then 0. else int_c.m_VBScrit;
  end if;
  if ( SpiceRoot.useInitialConditions()) and (in_m.m_dICVDSIsGiven > 0.5) then
    int_c.m_vds := in_m_type * in_m.m_dICVDS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    int_c.m_vds := if (in_m.m_off > 0.5) then 0. else (int_c.m_VBDcrit - int_c.m_VBScrit);
  end if;
  if ( SpiceRoot.useInitialConditions()) and (in_m.m_dICVGSIsGiven > 0.5) then
    int_c.m_vgs := in_m_type * in_m.m_dICVGS;
  elseif ( SpiceRoot.initJunctionVoltages()) then
    if ( in_m.m_off > 0.5) then
      int_c.m_vgs := 0.;
    end if;
  end if;
  if (int_c.m_vds<>0 and  int_c.m_vgs<>0 and int_c.m_vbs<>0 and not (SpiceRoot.useInitialConditions()) and  (in_m.m_off<>0)) then
    int_c.m_vbs := -1;
    int_c.m_vgs := in_m_type * int_c.m_tVto;
    int_c.m_vds := 0;
  end if;
  vbd := int_c.m_vbs - int_c.m_vds;
  vgd := int_c.m_vgs - int_c.m_vds;
  if ( int_c.m_vds >= 0) then
   int_c.m_vbs := SpiceRoot.limitJunctionVoltage(int_c.m_vbs);
    vbd         := int_c.m_vbs - int_c.m_vds;
  else
    vbd         := SpiceRoot.limitJunctionVoltage(vbd);
    int_c.m_vbs := vbd + int_c.m_vds;
  end if;
  vgb := int_c.m_vgs - int_c.m_vbs;
   (int_c.m_cbd, int_c.m_gbd) := Modelica.Electrical.Spice3.Internal.Functions.junction2SPICE3MOSFET(
                                                                 int_c.m_cbd, int_c.m_gbd, vbd,
                                 in_m.m_dTemp, 1.0, int_c.m_tDrainSatCur);
   out_cc.iBD                 := in_m_type * int_c.m_cbd;
   (int_c.m_cbs, int_c.m_gbs) := Modelica.Electrical.Spice3.Internal.Functions.junction2SPICE3MOSFET(
                                                                 int_c.m_cbs, int_c.m_gbs, int_c.m_vbs,
                                 in_m.m_dTemp, 1.0, int_c.m_tSourceSatCur);
   out_cc.iBS                 := in_m_type * int_c.m_cbs;
  int_c.m_mode := if (int_c.m_vds >= 0) then 1 else -1; // 1: normal mode, -1: inverse mode
  if (int_c.m_mode == 1) then
    int_c := Mos2.drainCur( int_c.m_vbs, int_c.m_vgs, int_c.m_vds,int_m, int_c, in_p, in_C, in_vp, in_m_type);
  else
    int_c := Mos2.drainCur( vbd,               vgd,  -int_c.m_vds,int_m, int_c, in_p, in_C, in_vp, in_m_type);
  end if;
  n      := if (int_c.m_mode == 1) then 6 else 5;
  out_cc.idrain := in_m_type * int_c.m_cdrain * int_c.m_mode;
  int_c.m_capbss    := 0.0;
  int_c.m_chargebss := 0.0;
  int_c.m_capbds    := 0.0;
  int_c.m_chargebds := 0.0;
  (int_c.m_capbsb, int_c.m_chargebsb) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBSb, int_c.m_vbs, int_c.m_tDepCap,
         in_p.m_bulkJctBotGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1b, int_c.m_f2b, int_c.m_f3b);
  (int_c.m_capbdb, int_c.m_chargebdb) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBDb, vbd, int_c.m_tDepCap,
         in_p.m_bulkJctBotGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1b, int_c.m_f2b, int_c.m_f3b);
  if ( not (in_p.m_capBSIsGiven > 0.5)) then
    (int_c.m_capbss, int_c.m_chargebss) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBSs,int_c. m_vbs, int_c.m_tDepCap,
         in_p.m_bulkJctSideGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1s, int_c.m_f2s, int_c.m_f3s);
  end if;
  if (not (in_p.m_capBDIsGiven > 0.5)) then
    (int_c.m_capbds, int_c.m_chargebds) := Modelica.Electrical.Spice3.Internal.Functions.junctionCap(
         int_c.m_tCBDs, vbd, int_c.m_tDepCap,
         in_p.m_bulkJctSideGradingCoeff, int_c.m_tBulkPot,
         int_c.m_f1s, int_c.m_f2s, int_c.m_f3s);
  end if;
  out_cc.cBS := if (in_m_bInit) then 1e-15 else (int_c.m_capbsb + int_c.m_capbss);
  out_cc.cBD := if (in_m_bInit) then 1e-15 else (int_c.m_capbdb + int_c.m_capbds);
  if (int_c.m_mode > 0) then
    qm := mosCalcDEVqmeyer( int_c.m_vgs, vgd, vgb, int_c);
  else
    qm := mosCalcDEVqmeyer( vgd, int_c.m_vgs, vgb, int_c);
    hlp := qm.qm_capgd;
    qm.qm_capgd := qm.qm_capgs;
    qm.qm_capgs := hlp;
  end if;
  if (in_m_bInit) then
    int_c.m_capgd := 2 * qm.qm_capgd + int_c.m_capGDovl;
    int_c.m_capgs := 2 * qm.qm_capgs + int_c.m_capGSovl;
    int_c.m_capgb := 2 * qm.qm_capgb + int_c.m_capGBovl;
    int_c.m_qgs   := int_c.m_capgs * int_c.m_vgs;
    int_c.m_qgb   := int_c.m_capgb * vgb;
    int_c.m_qgd   := int_c.m_capgd * vgd;
  else
    int_c.m_capgd := qm.qm_capgd + in_qm.qm_capgd + int_c.m_capGDovl;
    int_c.m_capgs := qm.qm_capgs + in_qm.qm_capgs + int_c.m_capGSovl;
    int_c.m_capgb := qm.qm_capgb + in_qm.qm_capgb + int_c.m_capGBovl;
    int_c.m_qgs   := (int_c.m_vgs - in_qm.qm_vgs) * int_c.m_capgs + in_qm.qm_qgs;
    int_c.m_qgb   := (vgb - in_qm.qm_vgb) * int_c.m_capgb + in_qm.qm_qgb;
    int_c.m_qgd   := (vgd - in_qm.qm_vgd) * int_c.m_capgd + in_qm.qm_qgd;
  end if;
    out_cc.m_capgd := int_c.m_capgd;
  qm.qm_qgs := int_c.m_qgs;
  qm.qm_qgb := int_c.m_qgb;
  qm.qm_qgd := int_c.m_qgd;
  qm.qm_vgs := int_c.m_vgs;
  qm.qm_vgb := vgb;
  qm.qm_vgd := vgd;
  out_cc.cGB := if (in_m_bInit) then -1e40 else int_c.m_capgb;
  out_cc.cGD := if (in_m_bInit) then -1e40 else out_cc.m_capgd;
  out_cc.cGS := if (in_m_bInit) then -1e40 else int_c.m_capgs;
end mos2CalcNoBypassCode;