From 0175490365b8ad89440c03b42694fcc0b2cb63cd Mon Sep 17 00:00:00 2001 From: Roka Miklos Date: Mon, 29 Jun 2026 20:18:44 +0200 Subject: [PATCH] Added BJT component with 2 models --- circuit/ael/mr/mr_bjt.ael | 202 ++++++++++++++++++++++++++ circuit/models/bjt/2n3904.mod | 32 ++++ circuit/models/bjt/2n3906.mod | 11 ++ de/ael/boot.ael | 3 +- mrModels/mr_bjt_npn/symbol/master.tag | 2 + mrModels/mr_bjt_npn/symbol/symbol.oa | Bin 0 -> 25548 bytes mrModels/mr_bjt_pnp/symbol/master.tag | 2 + mrModels/mr_bjt_pnp/symbol/symbol.oa | Bin 0 -> 25516 bytes 8 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 circuit/ael/mr/mr_bjt.ael create mode 100644 circuit/models/bjt/2n3904.mod create mode 100644 circuit/models/bjt/2n3906.mod create mode 100644 mrModels/mr_bjt_npn/symbol/master.tag create mode 100644 mrModels/mr_bjt_npn/symbol/symbol.oa create mode 100644 mrModels/mr_bjt_pnp/symbol/master.tag create mode 100644 mrModels/mr_bjt_pnp/symbol/symbol.oa diff --git a/circuit/ael/mr/mr_bjt.ael b/circuit/ael/mr/mr_bjt.ael new file mode 100644 index 0000000..c2e29ec --- /dev/null +++ b/circuit/ael/mr/mr_bjt.ael @@ -0,0 +1,202 @@ +// -------------------------------------------------------------------------------------- +// Creating item definition for bipolar NPN transistor +// -------------------------------------------------------------------------------------- +create_item +( + "mr_bjt_npn", // name + "Nonlinear Bipolar Transistor, NPN", // description + "Q", // prefix + 0, // attributes + NULL, // priority + NULL, // icon name + standard_dialog, // dialog name + "*", // dialog data + CmpModelNetlistFmt, // netlist format string + "BJT", // netlist data (??) + ComponentAnnotFmt, // display format string + NULL, // symbol name (not used since 2011) + NULL, // artwork type (not used since 2011) + NULL, // artwork data (not used since 2011) + ITEM_PRIMITIVE_EX, // extra attributes + + create_parm + ( + "Model", + "Model instance name", + 0, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Area", + "Scaling Factor, (default: 1.0)", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Region", + "DC operating region, 0=off, 1=on, 2=rev, 3=sat, (default: on)", + PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Temp", + "Device operating temperature, (default: 25)", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + TEMPERATURE_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Trise", + "Temperature rise over ambient", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + TEMPERATURE_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Mode", + "Simulation Mode for This Device, (default: NONLINEAR)", + PARM_NO_DISPLAY, + "simtype_mode", + UNITLESS_UNIT, + prm("simtype_nonlin","") + ), + + create_parm + ( + "Noise", + "Noise generation option; yes=1, no=0 ( default: yes ) ", + PARM_NO_DISPLAY, + "sim_enum_on_off_list_form", + UNITLESS_UNIT,prm("Yes","yes") + ), + + create_parm + ( + "_M", + "Number of devices in parallel, (default: 1)", + PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ) +); + +// -------------------------------------------------------------------------------------- +// Creating item definition for bipolar NPN transistor +// -------------------------------------------------------------------------------------- +create_item +( + "mr_bjt_pnp", // name + "Nonlinear Bipolar Transistor, PNP", // description + "Q", // prefix + 0, // attributes + NULL, // priority + NULL, // icon name + standard_dialog, // dialog name + "*", // dialog data + CmpModelNetlistFmt, // netlist format string + "*", // netlist data (??) + ComponentAnnotFmt, // display format string + NULL, // symbol name (not used since 2011) + NULL, // artwork type (not used since 2011) + NULL, // artwork data (not used since 2011) + ITEM_PRIMITIVE_EX, // extra attributes + + create_parm + ( + "Model", + "Model instance name", + 0, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Area", + "Scaling Factor, (default: 1.0)", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Region", + "DC operating region, 0=off, 1=on, 2=rev, 3=sat, (default: on)", + PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Temp", + "Device operating temperature, (default: 25)", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + TEMPERATURE_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Trise", + "Temperature rise over ambient", + PARM_OPTIMIZABLE | PARM_STATISTICAL | PARM_NO_DISPLAY, + "StdFileFormSet", + TEMPERATURE_UNIT, + prm("StdForm","") + ), + + create_parm + ( + "Mode", + "Simulation Mode for This Device, (default: NONLINEAR)", + PARM_NO_DISPLAY, + "simtype_mode", + UNITLESS_UNIT, + prm("simtype_nonlin","") + ), + + create_parm + ( + "Noise", + "Noise generation option; yes=1, no=0 ( default: yes ) ", + PARM_NO_DISPLAY, + "sim_enum_on_off_list_form", + UNITLESS_UNIT,prm("Yes","yes") + ), + + create_parm + ( + "_M", + "Number of devices in parallel, (default: 1)", + PARM_NO_DISPLAY, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ) +); + diff --git a/circuit/models/bjt/2n3904.mod b/circuit/models/bjt/2n3904.mod new file mode 100644 index 0000000..78be8f9 --- /dev/null +++ b/circuit/models/bjt/2n3904.mod @@ -0,0 +1,32 @@ +model Q2N3904C BJT \ + NPN = yes \ + PNP = no \ + IS = 3.5e-15 \ + BF = 160 \ + VAF = 400 \ + IKF = 0.15 \ + ISE = 4e-16 \ + NE = 1.26 \ + NF = 1 \ + RB = 30.1 \ + RC = 1 \ + RE = 0.1 \ + CJE = 15e-12 \ + MJE = 0.25 \ + VJE = 0.75 \ + CJC = 3.6e-12 \ + MJC = 0.30 \ + VJC = 0.75 \ + FC = 0.5 \ + TF = 380e-12 \ + XTF = 30 \ + VTF = 4 \ + ITF = 0.4 \ + TR = 240e-9 \ + BR = 0.7 \ + IKR = 0 \ + EG = 1.1 \ + XTB = 1.5 \ + XTI = 3 \ + NC = 2 \ + ISC = 0 diff --git a/circuit/models/bjt/2n3906.mod b/circuit/models/bjt/2n3906.mod new file mode 100644 index 0000000..347f28b --- /dev/null +++ b/circuit/models/bjt/2n3906.mod @@ -0,0 +1,11 @@ +model Q2N3906C BJT \ + NPN = no PNP = yes \ + IS = 10e-15 BF = 180 VAF = 40 \ + IKF = 0.6 ISE = 30e-15 NE = 1.5 NF = 1 \ + RB = 33 RC = 1 RE = 0.1 \ + CJE = 12e-12 MJE = 0.7 VJE = 1.0 \ + CJC = 12e-12 MJC = 0.7 VJC = 1.0 FC = 0.5 \ + TF = 550e-12 XTF = 20000 VTF = 10 ITF = 3.5 \ + TR = 10e-9 BR = 4 IKR = 11 \ + EG = 1.1 XTB = 1.5 XTI = 3 NC = 15.5 \ + ISC = 0.5e-15 VAR = 100 NK = 1.0 diff --git a/de/ael/boot.ael b/de/ael/boot.ael index 80c74c0..f93f542 100644 --- a/de/ael/boot.ael +++ b/de/ael/boot.ael @@ -41,6 +41,7 @@ else // ---------------------------------------------------------------------------- load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mrmodels_include")); -load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_resistor" )); +load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_resistor" )); +load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_bjt" )); diff --git a/mrModels/mr_bjt_npn/symbol/master.tag b/mrModels/mr_bjt_npn/symbol/master.tag new file mode 100644 index 0000000..e1024da --- /dev/null +++ b/mrModels/mr_bjt_npn/symbol/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +symbol.oa diff --git a/mrModels/mr_bjt_npn/symbol/symbol.oa b/mrModels/mr_bjt_npn/symbol/symbol.oa new file mode 100644 index 0000000000000000000000000000000000000000..103797a5544ab824ade94af867d2df9a89c0716e GIT binary patch literal 25548 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 rjs(16ek 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