diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index c77af6f49f..a29cbc6741 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -139,6 +139,8 @@ SIM_MODEL::INFO SIM_MODEL::TypeInfo( TYPE aType ) case TYPE::NMES_HFET2: return { DEVICE_TYPE_::NMES, "HFET2", "HFET2" }; case TYPE::PMES_HFET2: return { DEVICE_TYPE_::PMES, "HFET2", "HFET2" }; + case TYPE::NMOS_VDMOS: return { DEVICE_TYPE_::NMOS, "VDMOS", "VDMOS" }; + case TYPE::PMOS_VDMOS: return { DEVICE_TYPE_::PMOS, "VDMOS", "VDMOS" }; case TYPE::NMOS_MOS1: return { DEVICE_TYPE_::NMOS, "MOS1", "Classical quadratic (MOS1)" }; case TYPE::PMOS_MOS1: return { DEVICE_TYPE_::PMOS, "MOS1", "Classical quadratic (MOS1)" }; case TYPE::NMOS_MOS2: return { DEVICE_TYPE_::NMOS, "MOS2", "Grove-Frohman (MOS2)" }; @@ -232,117 +234,119 @@ SIM_MODEL::SPICE_INFO SIM_MODEL::SpiceInfo( TYPE aType ) { switch( aType ) { - case TYPE::R: return { "R", "" }; - case TYPE::R_POT: return { "A", "" }; - case TYPE::R_BEHAVIORAL: return { "R", "", "", "0", false, true }; + case TYPE::R: return { "R", "" }; + case TYPE::R_POT: return { "A", "" }; + case TYPE::R_BEHAVIORAL: return { "R", "", "", "0", false, true }; - case TYPE::C: return { "C", "" }; - case TYPE::C_BEHAVIORAL: return { "C", "", "", "0", false, true }; + case TYPE::C: return { "C", "" }; + case TYPE::C_BEHAVIORAL: return { "C", "", "", "0", false, true }; - case TYPE::L: return { "L", "" }; - case TYPE::L_MUTUAL: return { "K", "" }; - case TYPE::L_BEHAVIORAL: return { "L", "", "", "0", false, true }; + case TYPE::L: return { "L", "" }; + case TYPE::L_MUTUAL: return { "K", "" }; + case TYPE::L_BEHAVIORAL: return { "L", "", "", "0", false, true }; //case TYPE::TLINE_Z0: return { "T" }; - case TYPE::TLINE_Z0: return { "O", "LTRA" }; - case TYPE::TLINE_RLGC: return { "O", "LTRA" }; + case TYPE::TLINE_Z0: return { "O", "LTRA" }; + case TYPE::TLINE_RLGC: return { "O", "LTRA" }; - case TYPE::SW_V: return { "S", "SW" }; - case TYPE::SW_I: return { "W", "CSW" }; + case TYPE::SW_V: return { "S", "SW" }; + case TYPE::SW_I: return { "W", "CSW" }; - case TYPE::D: return { "D", "D" }; + case TYPE::D: return { "D", "D" }; - case TYPE::NPN_GUMMELPOON: return { "Q", "NPN", "", "1", true }; - case TYPE::PNP_GUMMELPOON: return { "Q", "PNP", "", "1", true }; + case TYPE::NPN_GUMMELPOON: return { "Q", "NPN", "", "1", true }; + case TYPE::PNP_GUMMELPOON: return { "Q", "PNP", "", "1", true }; - case TYPE::NPN_VBIC: return { "Q", "NPN", "", "4" }; - case TYPE::PNP_VBIC: return { "Q", "PNP", "", "4" }; + case TYPE::NPN_VBIC: return { "Q", "NPN", "", "4" }; + case TYPE::PNP_VBIC: return { "Q", "PNP", "", "4" }; - case TYPE::NPN_HICUM2: return { "Q", "NPN", "", "8" }; - case TYPE::PNP_HICUM2: return { "Q", "PNP", "", "8" }; + case TYPE::NPN_HICUM2: return { "Q", "NPN", "", "8" }; + case TYPE::PNP_HICUM2: return { "Q", "PNP", "", "8" }; - case TYPE::NJFET_SHICHMANHODGES: return { "M", "NJF", "", "1" }; - case TYPE::PJFET_SHICHMANHODGES: return { "M", "PJF", "", "1" }; - case TYPE::NJFET_PARKERSKELLERN: return { "M", "NJF", "", "2" }; - case TYPE::PJFET_PARKERSKELLERN: return { "M", "PJF", "", "2" }; + case TYPE::NJFET_SHICHMANHODGES: return { "M", "NJF", "", "1" }; + case TYPE::PJFET_SHICHMANHODGES: return { "M", "PJF", "", "1" }; + case TYPE::NJFET_PARKERSKELLERN: return { "M", "NJF", "", "2" }; + case TYPE::PJFET_PARKERSKELLERN: return { "M", "PJF", "", "2" }; - case TYPE::NMES_STATZ: return { "Z", "NMF", "", "1" }; - case TYPE::PMES_STATZ: return { "Z", "PMF", "", "1" }; - case TYPE::NMES_YTTERDAL: return { "Z", "NMF", "", "2" }; - case TYPE::PMES_YTTERDAL: return { "Z", "PMF", "", "2" }; - case TYPE::NMES_HFET1: return { "Z", "NMF", "", "5" }; - case TYPE::PMES_HFET1: return { "Z", "PMF", "", "5" }; - case TYPE::NMES_HFET2: return { "Z", "NMF", "", "6" }; - case TYPE::PMES_HFET2: return { "Z", "PMF", "", "6" }; + case TYPE::NMES_STATZ: return { "Z", "NMF", "", "1" }; + case TYPE::PMES_STATZ: return { "Z", "PMF", "", "1" }; + case TYPE::NMES_YTTERDAL: return { "Z", "NMF", "", "2" }; + case TYPE::PMES_YTTERDAL: return { "Z", "PMF", "", "2" }; + case TYPE::NMES_HFET1: return { "Z", "NMF", "", "5" }; + case TYPE::PMES_HFET1: return { "Z", "PMF", "", "5" }; + case TYPE::NMES_HFET2: return { "Z", "NMF", "", "6" }; + case TYPE::PMES_HFET2: return { "Z", "PMF", "", "6" }; - case TYPE::NMOS_MOS1: return { "M", "NMOS", "", "1" }; - case TYPE::PMOS_MOS1: return { "M", "PMOS", "", "1" }; - case TYPE::NMOS_MOS2: return { "M", "NMOS", "", "2" }; - case TYPE::PMOS_MOS2: return { "M", "PMOS", "", "2" }; - case TYPE::NMOS_MOS3: return { "M", "NMOS", "", "3" }; - case TYPE::PMOS_MOS3: return { "M", "PMOS", "", "3" }; - case TYPE::NMOS_BSIM1: return { "M", "NMOS", "", "4" }; - case TYPE::PMOS_BSIM1: return { "M", "PMOS", "", "4" }; - case TYPE::NMOS_BSIM2: return { "M", "NMOS", "", "5" }; - case TYPE::PMOS_BSIM2: return { "M", "PMOS", "", "5" }; - case TYPE::NMOS_MOS6: return { "M", "NMOS", "", "6" }; - case TYPE::PMOS_MOS6: return { "M", "PMOS", "", "6" }; - case TYPE::NMOS_BSIM3: return { "M", "NMOS", "", "8" }; - case TYPE::PMOS_BSIM3: return { "M", "PMOS", "", "8" }; - case TYPE::NMOS_MOS9: return { "M", "NMOS", "", "9" }; - case TYPE::PMOS_MOS9: return { "M", "PMOS", "", "9" }; - case TYPE::NMOS_B4SOI: return { "M", "NMOS", "", "10" }; - case TYPE::PMOS_B4SOI: return { "M", "PMOS", "", "10" }; - case TYPE::NMOS_BSIM4: return { "M", "NMOS", "", "14" }; - case TYPE::PMOS_BSIM4: return { "M", "PMOS", "", "14" }; + case TYPE::NMOS_VDMOS: return { "M", "VDMOS NCHAN", }; + case TYPE::PMOS_VDMOS: return { "M", "VDMOS PCHAN", }; + case TYPE::NMOS_MOS1: return { "M", "NMOS", "", "1" }; + case TYPE::PMOS_MOS1: return { "M", "PMOS", "", "1" }; + case TYPE::NMOS_MOS2: return { "M", "NMOS", "", "2" }; + case TYPE::PMOS_MOS2: return { "M", "PMOS", "", "2" }; + case TYPE::NMOS_MOS3: return { "M", "NMOS", "", "3" }; + case TYPE::PMOS_MOS3: return { "M", "PMOS", "", "3" }; + case TYPE::NMOS_BSIM1: return { "M", "NMOS", "", "4" }; + case TYPE::PMOS_BSIM1: return { "M", "PMOS", "", "4" }; + case TYPE::NMOS_BSIM2: return { "M", "NMOS", "", "5" }; + case TYPE::PMOS_BSIM2: return { "M", "PMOS", "", "5" }; + case TYPE::NMOS_MOS6: return { "M", "NMOS", "", "6" }; + case TYPE::PMOS_MOS6: return { "M", "PMOS", "", "6" }; + case TYPE::NMOS_BSIM3: return { "M", "NMOS", "", "8" }; + case TYPE::PMOS_BSIM3: return { "M", "PMOS", "", "8" }; + case TYPE::NMOS_MOS9: return { "M", "NMOS", "", "9" }; + case TYPE::PMOS_MOS9: return { "M", "PMOS", "", "9" }; + case TYPE::NMOS_B4SOI: return { "M", "NMOS", "", "10" }; + case TYPE::PMOS_B4SOI: return { "M", "PMOS", "", "10" }; + case TYPE::NMOS_BSIM4: return { "M", "NMOS", "", "14" }; + case TYPE::PMOS_BSIM4: return { "M", "PMOS", "", "14" }; //case TYPE::NMOS_EKV2_6: return {}; //case TYPE::PMOS_EKV2_6: return {}; //case TYPE::NMOS_PSP: return {}; //case TYPE::PMOS_PSP: return {}; - case TYPE::NMOS_B3SOIFD: return { "M", "NMOS", "", "55" }; - case TYPE::PMOS_B3SOIFD: return { "M", "PMOS", "", "55" }; - case TYPE::NMOS_B3SOIDD: return { "M", "NMOS", "", "56" }; - case TYPE::PMOS_B3SOIDD: return { "M", "PMOS", "", "56" }; - case TYPE::NMOS_B3SOIPD: return { "M", "NMOS", "", "57" }; - case TYPE::PMOS_B3SOIPD: return { "M", "PMOS", "", "57" }; + case TYPE::NMOS_B3SOIFD: return { "M", "NMOS", "", "55" }; + case TYPE::PMOS_B3SOIFD: return { "M", "PMOS", "", "55" }; + case TYPE::NMOS_B3SOIDD: return { "M", "NMOS", "", "56" }; + case TYPE::PMOS_B3SOIDD: return { "M", "PMOS", "", "56" }; + case TYPE::NMOS_B3SOIPD: return { "M", "NMOS", "", "57" }; + case TYPE::PMOS_B3SOIPD: return { "M", "PMOS", "", "57" }; //case TYPE::NMOS_STAG: return {}; //case TYPE::PMOS_STAG: return {}; - case TYPE::NMOS_HISIM2: return { "M", "NMOS", "", "68" }; - case TYPE::PMOS_HISIM2: return { "M", "PMOS", "", "68" }; - case TYPE::NMOS_HISIMHV1: return { "M", "NMOS", "", "73", true, false, "1.2.4" }; - case TYPE::PMOS_HISIMHV1: return { "M", "PMOS", "", "73", true, false, "1.2.4" }; - case TYPE::NMOS_HISIMHV2: return { "M", "NMOS", "", "73", true, false, "2.2.0" }; - case TYPE::PMOS_HISIMHV2: return { "M", "PMOS", "", "73", true, false, "2.2.0" }; + case TYPE::NMOS_HISIM2: return { "M", "NMOS", "", "68" }; + case TYPE::PMOS_HISIM2: return { "M", "PMOS", "", "68" }; + case TYPE::NMOS_HISIMHV1: return { "M", "NMOS", "", "73", true, false, "1.2.4" }; + case TYPE::PMOS_HISIMHV1: return { "M", "PMOS", "", "73", true, false, "1.2.4" }; + case TYPE::NMOS_HISIMHV2: return { "M", "NMOS", "", "73", true, false, "2.2.0" }; + case TYPE::PMOS_HISIMHV2: return { "M", "PMOS", "", "73", true, false, "2.2.0" }; - case TYPE::V: return { "V", "" }; - case TYPE::V_SIN: return { "V", "", "SIN" }; - case TYPE::V_PULSE: return { "V", "", "PULSE" }; - case TYPE::V_EXP: return { "V", "", "EXP" }; + case TYPE::V: return { "V", "" }; + case TYPE::V_SIN: return { "V", "", "SIN" }; + case TYPE::V_PULSE: return { "V", "", "PULSE" }; + case TYPE::V_EXP: return { "V", "", "EXP" }; /*case TYPE::V_SFAM: return { "V", "", "AM" }; case TYPE::V_SFFM: return { "V", "", "SFFM" };*/ - case TYPE::V_PWL: return { "V", "", "PWL" }; - case TYPE::V_WHITENOISE: return { "V", "", "TRNOISE" }; - case TYPE::V_PINKNOISE: return { "V", "", "TRNOISE" }; - case TYPE::V_BURSTNOISE: return { "V", "", "TRNOISE" }; - case TYPE::V_RANDUNIFORM: return { "V", "", "TRRANDOM" }; - case TYPE::V_RANDNORMAL: return { "V", "", "TRRANDOM" }; - case TYPE::V_RANDEXP: return { "V", "", "TRRANDOM" }; + case TYPE::V_PWL: return { "V", "", "PWL" }; + case TYPE::V_WHITENOISE: return { "V", "", "TRNOISE" }; + case TYPE::V_PINKNOISE: return { "V", "", "TRNOISE" }; + case TYPE::V_BURSTNOISE: return { "V", "", "TRNOISE" }; + case TYPE::V_RANDUNIFORM: return { "V", "", "TRRANDOM" }; + case TYPE::V_RANDNORMAL: return { "V", "", "TRRANDOM" }; + case TYPE::V_RANDEXP: return { "V", "", "TRRANDOM" }; //case TYPE::V_RANDPOISSON: return { "V", "", "TRRANDOM" }; case TYPE::V_BEHAVIORAL: return { "B" }; - case TYPE::I: return { "I", "" }; - case TYPE::I_PULSE: return { "I", "", "PULSE" }; - case TYPE::I_SIN: return { "I", "", "SIN" }; - case TYPE::I_EXP: return { "I", "", "EXP" }; + case TYPE::I: return { "I", "" }; + case TYPE::I_PULSE: return { "I", "", "PULSE" }; + case TYPE::I_SIN: return { "I", "", "SIN" }; + case TYPE::I_EXP: return { "I", "", "EXP" }; /*case TYPE::I_SFAM: return { "V", "", "AM" }; case TYPE::I_SFFM: return { "V", "", "SFFM" };*/ - case TYPE::I_PWL: return { "I", "", "PWL" }; - case TYPE::I_WHITENOISE: return { "I", "", "TRNOISE" }; - case TYPE::I_PINKNOISE: return { "I", "", "TRNOISE" }; - case TYPE::I_BURSTNOISE: return { "I", "", "TRNOISE" }; - case TYPE::I_RANDUNIFORM: return { "I", "", "TRRANDOM" }; - case TYPE::I_RANDNORMAL: return { "I", "", "TRRANDOM" }; - case TYPE::I_RANDEXP: return { "I", "", "TRRANDOM" }; + case TYPE::I_PWL: return { "I", "", "PWL" }; + case TYPE::I_WHITENOISE: return { "I", "", "TRNOISE" }; + case TYPE::I_PINKNOISE: return { "I", "", "TRNOISE" }; + case TYPE::I_BURSTNOISE: return { "I", "", "TRNOISE" }; + case TYPE::I_RANDUNIFORM: return { "I", "", "TRRANDOM" }; + case TYPE::I_RANDNORMAL: return { "I", "", "TRRANDOM" }; + case TYPE::I_RANDEXP: return { "I", "", "TRRANDOM" }; //case TYPE::I_RANDPOISSON: return { "I", "", "TRRANDOM" }; case TYPE::I_BEHAVIORAL: return { "B" }; diff --git a/eeschema/sim/sim_model.h b/eeschema/sim/sim_model.h index a3a50bdf1b..2a1c32e900 100644 --- a/eeschema/sim/sim_model.h +++ b/eeschema/sim/sim_model.h @@ -156,6 +156,9 @@ public: PMES_HFET2, + NMOS_VDMOS, + PMOS_VDMOS, + NMOS_MOS1, PMOS_MOS1, diff --git a/eeschema/sim/sim_model_ngspice.h b/eeschema/sim/sim_model_ngspice.h index 5bef7bbf95..11f3fa66f5 100644 --- a/eeschema/sim/sim_model_ngspice.h +++ b/eeschema/sim/sim_model_ngspice.h @@ -72,6 +72,7 @@ protected: MESA, HFET1, HFET2, + VDMOS, MOS1, MOS2, MOS3, diff --git a/eeschema/sim/sim_model_ngspice_data.cpp b/eeschema/sim/sim_model_ngspice_data.cpp index 7ba4c16890..bbc012b45a 100644 --- a/eeschema/sim/sim_model_ngspice_data.cpp +++ b/eeschema/sim/sim_model_ngspice_data.cpp @@ -26,8 +26,8 @@ // This script was originally autogenerated using the a bash script called -// generate_ngspice_models.bash, later heavily modified manually. The script can be found in the -// Git history if needed for reference purposes. +// generate_sim_Model_ngspice_data.bash, later heavily modified manually. The script can be found +// in the Git history if needed for reference purposes. // We don't use the param flags anymore, so replace them with dummies to save compilation time. #define U() SIM_MODEL::PARAM::FLAGS() @@ -1283,6 +1283,116 @@ struct MODEL_INFO_MAP modelInfos[MODEL_TYPE::HFET2].instanceParams.emplace_back( "p", 8, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Power dissipated by the mesfet", true ); + modelInfos[MODEL_TYPE::VDMOS] = { "VDMOS", "NCHAN", "PCHAN", { "D", "G", "S" }, "DMOS model based on Level 1 MOSFET model", {}, {} }; + // Model parameters + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "type", 116, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_STRING, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "vdmosn", "vdmosp", "N-channel or P-channel MOS" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vto", 101, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Threshold voltage" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vth0", 101, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, R(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "0", "0", "n.a." ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "kp", 102, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A/V^2", SIM_MODEL::PARAM::CATEGORY::DC, "1", "1", "Transconductance parameter" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "phi", 103, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::DC, "0.6", "0.6", "Surface potential" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "lambda", 104, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "1/V", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Channel length modulation" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "theta", 105, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "1/V", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Vgs dependence on mobility" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rd", 106, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Drain ohmic resistance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rs", 107, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Source ohmic resistance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rg", 108, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Gate ohmic resistance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "tnom", 113, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "27", "27", "Parameter measurement temperature" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "kf", 114, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::NOISE, "1", "1", "Flicker noise coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "af", 115, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::NOISE, "0", "0", "Flicker noise exponent" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vdmosn", 111, SIM_MODEL::PARAM::DIR_IN, SIM_VALUE::TYPE_BOOL, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::FLAGS, "", "", "N type DMOSfet model" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vdmosp", 112, SIM_MODEL::PARAM::DIR_IN, SIM_VALUE::TYPE_BOOL, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::FLAGS, "", "", "P type DMOSfet model" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vdmos", 117, SIM_MODEL::PARAM::DIR_IN, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "", "", "DMOS transistor" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rq", 109, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Quasi saturation resistance fitting parameter" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vq", 110, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Quasi saturation voltage fitting parameter" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "mtriode", 122, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "1", "1", "Conductance multiplier in triode region" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "tcvth", 141, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Linear Vth0 temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vtotc", 141, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, R(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "0", "0", "n.a." ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "mu", 145, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "-1.5", "-1.5", "Exponent of gain temperature dependency" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "bex", 145, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, R(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "-1.5", "-1.5", "n.a." ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "texp0", 146, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "1.5", "1.5", "Drain resistance rd0 temperature exponent" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "texp1", 147, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0.3", "0.3", "Drain resistance rd1 temperature exponent" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trd1", 148, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Drain resistance linear temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trd2", 149, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Drain resistance quadratic temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trg1", 150, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Gate resistance linear temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trg2", 151, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Gate resistance quadratic temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trs1", 152, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Source resistance linear temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trs2", 153, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Source resistance quadratic temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trb1", 139, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Body resistance linear temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "trb2", 140, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Body resistance quadratic temperature coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "subshift", 123, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Shift of weak inversion plot on the vgs axis" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "ksubthres", 124, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::DC, "0.1", "0.1", "Slope of weak inversion log current versus vgs" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "tksubthres1", 154, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Linear temperature coefficient of ksubthres" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "tksubthres2", 155, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "0", "0", "Quadratic temperature coefficient of ksubthres" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "bv", 132, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::DC, "1e+99", "1e+99", "Vds breakdown voltage" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "ibv", 133, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::DC, "1e-10", "1e-10", "Current at Vds=bv" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "nbv", 134, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "1", "1", "Vds breakdown emission coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rds", 125, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "1e+15", "1e+15", "Drain-source shunt resistance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rb", 131, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Body diode ohmic resistance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "n", 135, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "1", "1", "Body diode emission coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "tt", 136, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "s", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Body diode transit time" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "eg", 137, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "1.11", "1.11", "Body diode activation energy for temperature effect on Is" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "xti", 138, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "3", "3", "Body diode saturation current temperature exponent" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "is", 126, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::DC, "1e-14", "1e-14", "Body diode saturation current" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vj", 127, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::DC, "0.8", "0.8", "Body diode junction potential" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "cjo", 128, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, A(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Zero-bias body diode junction capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "m", 129, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "0.5", "0.5", "Body diode grading coefficient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "fc", 130, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "0.5", "0.5", "Body diode coefficient for forward-bias depletion capacitance formula" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "cgdmin", 118, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, A(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Minimum non-linear G-D capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "cgdmax", 119, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, A(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Maximum non-linear G-D capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "a", 120, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, A(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "1", "1", "Non-linear Cgd capacitance parameter" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "cgs", 121, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, A(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "Gate-source capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rthjc", 142, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "1", "1", "Self-heating thermal resistance, junction-to-case" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rthca", 143, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "1000", "1000", "Self-heating thermal resistance, case-to-ambient" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "cthj", 144, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "F", SIM_MODEL::PARAM::CATEGORY::DC, "1e-05", "1e-05", "Self-heating thermal capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vgs_max", 156, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum voltage G-S branch" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vgd_max", 157, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum voltage G-D branch" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vds_max", 158, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum voltage D-S branch" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vgsr_max", 159, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum voltage G-S branch" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "vgdr_max", 160, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum voltage G-D branch" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "pd_max", 161, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum device power dissipation" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "id_max", 162, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "0", "0", "maximum drain/source current" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "idr_max", 163, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum drain/source reverse current" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "te_max", 164, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "deg C", SIM_MODEL::PARAM::CATEGORY::LIMITING_VALUES, "1e+99", "1e+99", "maximum temperature" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "rth_ext", 165, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::TEMPERATURE, "1000", "1000", "thermal resistance case to ambient, incl. heat sink" ); + modelInfos[MODEL_TYPE::VDMOS].modelParams.emplace_back( "derating", 166, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::DC, "0", "0", "thermal derating for power" ); + // Instance parameters + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "m", 9, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::GEOMETRY, "0.5", "0.5", "Multiplier" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "off", 1, SIM_MODEL::PARAM::DIR_IN, SIM_VALUE::TYPE_BOOL, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::FLAGS, "", "", "Device initially off" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "icvds", 3, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, U(), "V", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Initial D-S voltage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "icvgs", 4, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, U(), "V", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Initial G-S voltage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "temp", 8, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, U(), "deg C", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Instance temperature" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "dtemp", 10, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_FLOAT, U(), "deg C", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Instance temperature difference" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "ic", 2, SIM_MODEL::PARAM::DIR_IN, SIM_VALUE::TYPE_FLOAT_VECTOR, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Vector of D-S, G-S voltages" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "thermal", 11, SIM_MODEL::PARAM::DIR_INOUT, SIM_VALUE::TYPE_BOOL, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::FLAGS, "", "", "Thermal model switch on/off" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "id", 214, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Drain current" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "is", 6, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "1e-14", "1e-14", "Source current" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "ig", 5, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Gate current" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "vgs", 217, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Gate-Source voltage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "vds", 218, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Drain-Source voltage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "cgs", 201, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "F", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "0", "0", "Gate-Source capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "cgd", 202, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "F", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Gate-Drain capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "cds", 203, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "F", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Drain-Source capacitance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "idio", 223, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "A", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Body diode current" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "dnode", 204, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of the drain node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "gnode", 205, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of the gate node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "snode", 206, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of the source node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "tempnode", 207, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of temperature node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "tcasenode", 208, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of 2nd temperature node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "dnodeprime", 209, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of int. drain node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "snodeprime", 210, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_INT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Number of int. source node" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "von", 213, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "V", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Device on state voltage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "rs", 224, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "ohm", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "0", "0", "Source resistance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "sourceconductance", 211, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Conductance of source" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "rd", 225, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "0", "0", "Drain conductance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "drainconductance", 212, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Conductance of drain" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "gm", 215, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Transconductance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "gds", 216, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Drain-Source conductance" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "cqgs", 220, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "F", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Capacitance due to gate-source charge storage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "cqgd", 222, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "F", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Capacitance due to gate-drain charge storage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "qgs", 219, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Gate-Source charge storage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "qgd", 221, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Gate-Drain charge storage" ); + modelInfos[MODEL_TYPE::VDMOS].instanceParams.emplace_back( "p", 7, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_FLOAT, U(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "", "", "Instantaneous power" ); + + modelInfos[MODEL_TYPE::MOS1] = { "Mos1", "NMOS", "PMOS", { "D", "G", "S", "B" }, "Level 1 MOSfet model with Meyer capacitance model", {}, {} }; // Model parameters modelInfos[MODEL_TYPE::MOS1].modelParams.emplace_back( "type", 133, SIM_MODEL::PARAM::DIR_OUT, SIM_VALUE::TYPE_STRING, SIM_MODEL::PARAM::FLAGS(), "", SIM_MODEL::PARAM::CATEGORY::SUPERFLUOUS, "nmos", "pmos", "N-channel or P-channel MOS" ); diff --git a/qa/unittests/eeschema/sim/test_sim_model_ngspice.cpp b/qa/unittests/eeschema/sim/test_sim_model_ngspice.cpp index 570e92491c..f28aca7c2b 100644 --- a/qa/unittests/eeschema/sim/test_sim_model_ngspice.cpp +++ b/qa/unittests/eeschema/sim/test_sim_model_ngspice.cpp @@ -144,6 +144,11 @@ BOOST_AUTO_TEST_CASE( Models ) BOOST_CHECK_EQUAL( modelParamCount, 40 ); BOOST_CHECK_EQUAL( instanceParamCount, 28 ); break; + + case MODEL_TYPE::VDMOS: + BOOST_CHECK_EQUAL( modelParamCount, 69 ); + BOOST_CHECK_EQUAL( instanceParamCount, 36 ); + break; case MODEL_TYPE::MOS1: BOOST_CHECK_EQUAL( modelParamCount, 35 ); diff --git a/tools/generate_sim_model_ngspice_data.bash b/tools/generate_sim_model_ngspice_data.bash index b180ed9341..442e4651cc 100755 --- a/tools/generate_sim_model_ngspice_data.bash +++ b/tools/generate_sim_model_ngspice_data.bash @@ -17,7 +17,7 @@ #) MODELS=$(cat << END - Write your model here. + vdmos NCHAN PCHAN M 3 0 0 END ) @@ -280,71 +280,7 @@ END } -echo_head() { - echo "// Generated by the $(basename $0) script." - echo "" - echo "#include " - echo "" -} - - -{ - echo_head - - echo "enum class NGSPICE::MODEL_TYPE" - echo "{" - echo " NONE," - - echo "$MODELS" | while read -r model_name model_primitive model_level model_version; do - if [ -n "$model_name" ]; then - echo " ${model_name^^}," - fi - done - - echo "};" - -} > $(dirname "$0")/ngspice_models.h - -{ - echo_head - - echo "// We cannot use designated initializers until we upgrade to C++20 (we're C++17 now)," - echo "// so we do this instead." - echo "static auto U() { NGSPICE::PARAM_FLAGS p; p.uninteresting=true; return p; }" - echo "static auto UR() { NGSPICE::PARAM_FLAGS p; p.uninteresting=true; p.redundant=true; return p; }" - echo "static auto P() { NGSPICE::PARAM_FLAGS p; p.principal=true; return p; }" - echo "static auto PR() { NGSPICE::PARAM_FLAGS p; p.principal=true; p.redundant=true; return p; }" - echo "static auto A() { NGSPICE::PARAM_FLAGS p; p.ac=true; return p; }" - echo "static auto AR() { NGSPICE::PARAM_FLAGS p; p.ac=true; p.redundant=true; return p; }" - echo "static auto AU() { NGSPICE::PARAM_FLAGS p; p.ac=true; p.uninteresting=true; return p; }" - echo "static auto AP() { NGSPICE::PARAM_FLAGS p; p.ac=true; p.principal=true; return p; }" - echo "static auto APR() { NGSPICE::PARAM_FLAGS p; p.ac=true; p.principal=true; p.redundant=true; return p; }" - echo "static auto AA() { NGSPICE::PARAM_FLAGS p; p.acOnly=true; return p; }" - echo "static auto AAU() { NGSPICE::PARAM_FLAGS p; p.acOnly=true; p.uninteresting=true; return p; }" - echo "static auto PAA() { NGSPICE::PARAM_FLAGS p; p.acOnly=true; p.principal=true; return p; }" - echo "static auto N() { NGSPICE::PARAM_FLAGS p; p.noise=true; return p; }" - echo "static auto R() { NGSPICE::PARAM_FLAGS p; p.redundant=true; return p; }" - echo "static auto X() { NGSPICE::PARAM_FLAGS p; p.nonsense=true; return p; }" - echo "static auto XR() { NGSPICE::PARAM_FLAGS p; p.nonsense=true; p.redundant=true; return p; }" - echo "static auto XU() { NGSPICE::PARAM_FLAGS p; p.nonsense=true; p.uninteresting=true; return p; }" - echo "static auto Q() { NGSPICE::PARAM_FLAGS p; p.setQuery=true; return p; }" - echo "static auto QR() { NGSPICE::PARAM_FLAGS p; p.setQuery=true; p.redundant=true; return p; }" - echo "static auto QU() { NGSPICE::PARAM_FLAGS p; p.setQuery=true; p.uninteresting=true; return p; }" - echo "static auto Z() { NGSPICE::PARAM_FLAGS p; p.chkQuery=true; return p; }" - echo "static auto ZR() { NGSPICE::PARAM_FLAGS p; p.chkQuery=true; p.redundant=true; return p; }" - echo "static auto ZU() { NGSPICE::PARAM_FLAGS p; p.chkQuery=true; p.uninteresting=true; return p; }" - echo "static auto QO() { NGSPICE::PARAM_FLAGS p; p.orQuery=true; return p; }" - echo "static auto QOR() { NGSPICE::PARAM_FLAGS p; p.orQuery=true; p.redundant=true; return p; }" - echo "" - - echo "NGSPICE::MODEL_INFO NGSPICE::GetModelInfo( NGSPICE::MODEL_TYPE aType )" - echo "{" - echo " switch( aType )" - echo " {" - echo " case NGSPICE::MODEL_TYPE::NONE:" - echo " return {};" - echo "$MODELS" | while read -r model_name \ model_type1 \ model_type2 \ @@ -360,8 +296,8 @@ echo_head() description do if [ "$sep" = "-" ]; then - echo -n " case NGSPICE::MODEL_TYPE::${model_name^^}:" - echo -n " return { \"$name\"," + echo -n "modelInfos[MODEL_TYPE::${model_name^^}] = " + echo -n "{ \"$name\"," for model_type in "$model_type1" "$model_type2"; do if [ "$model_type" != "-" ]; then @@ -371,10 +307,12 @@ echo_head() fi done - echo " \"$description\"," + echo -n " \"$description\"," fi done + echo " {}, {} };" + is_instance_param=0 # Print model parameter ID, name, direction, type, unit, and description. @@ -387,18 +325,21 @@ echo_head() do #&& [ -n "$param_description" ] if [ "$param_id" = "Model" ] && [ "$param_name" = "Parameters" ]; then - echo " // Model parameters" - echo " {" + echo "// Model parameters" elif [ "$param_id" = "Instance" ] && [ "$param_name" = "Parameters" ]; then - echo " }," - echo " // Instance parameters" - echo " {" + echo "// Instance parameters" is_instance_param=1 elif [ "$param_id" -eq "$param_id" ] 2>/dev/null \ && [ -n "$param_name" ] \ && [ -n "$param_dir" ] then - echo -n " { \"${param_name,,}\"," + if [ "$is_instance_param" = 1 ]; then + params="instanceParams" + else + params="modelParams" + fi + + echo -n "modelInfos[MODEL_TYPE::${model_name^^}].${params}.emplace_back( \"${param_name,,}\"," echo -n " $param_id," echo -n " NGSPICE::PARAM_DIR::${param_dir^^}," echo -n " NGSPICE::PARAM_TYPE::${param_type^^}," @@ -513,19 +454,9 @@ END #fi done - echo " \"$param_description\" }," + echo " \"$param_description\" );" fi done - - - echo " } };" fi done - - echo " }" - echo "" - - echo " wxFAIL;" - echo " return {};" - echo "}" } > $(dirname "$0")/new_ngspice_models.cpp