package BREAKOUT model Ground extends INTERFACE.OnePin; equation {p.vDC,p.vTran,p.vAC_Re,p.vAC_Im} = zeros(4); annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[0, -100; 100, 0], string="0", style(color=0)), Line(points=[-10, -20; 10, -20], style(thickness=1, color=3)), Line(points=[-40, 20; 40, 20], style(color=3, thickness=1)), Line(points=[-70, 60; 70, 60], style(color=3, thickness=1)), Line(points=[-100, 100; 100, 100], style(color=3, thickness=1)))); end Ground; model Rbreak extends INTERFACE.TwoPin; extends INIT.Part; parameter Boolean HIDDEN_COMPONENT=false "Enable or disable log"; parameter SI.Resistance R=1000 "Resistance"; constant SI.Resistance R_EPS=2e-4 "IC resistor"; SI.Voltage vDC "DC voltage across the component"; SI.Voltage vTran "Transient voltage across the component"; SI.Voltage vAC_Re "Real part of AC small-signal voltage across the component"; SI.Voltage vAC_Im "Imaginary part of AC small-signal voltage across the component"; SI.Current iDC "DC current"; SI.Current iTran "Transient/Small-signal current"; SI.Current iAC_Re "Small-signal current. Real part"; SI.Current iAC_Im "Small-signal current. Imaginary part"; SI.Voltage vAC_mag(start=0) "Magnitude of AC small-signal voltage across the component"; SI.Voltage vAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal voltage across the component"; nonSI.Angle_deg vAC_phase(start=0) "Phase (deg) of AC small-signal voltage across the component"; SI.Current iAC_mag(start=0) "Magnitude of AC small-signal current"; SI.Current iAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal current"; nonSI.Angle_deg iAC_phase(start=0) "Phase (deg) of AC small-signal current"; SI.Voltage pinP_vAC_mag(start=0); SI.Voltage pinP_vAC_phase(start=0); SI.Voltage pinP_vAC_mag_dB(start=0); SI.Voltage pinN_vAC_mag(start=0); SI.Voltage pinN_vAC_phase(start=0); SI.Voltage pinN_vAC_mag_dB(start=0); protected SI.Current iDCclampP; SI.Current iDCclampN; SI.Voltage vDCclampP(start=0); SI.Voltage vDCclampN(start=0); equation // ------------------------------------------------ // i, v sign criterion: Positive current flows from // the (+) node through the part to the (-) node // ------------------------------------------------ {iDC,iTran,iAC_Re,iAC_Im} = {p.iDC + iDCclampP,p.iTran,p.iAC_Re,p.iAC_Im}; {iDC,iTran,iAC_Re,iAC_Im} = -{n.iDC + iDCclampN,n.iTran,n.iAC_Re,n.iAC_Im}; {vDC,vTran,vAC_Re,vAC_Im} = {p.vDC,p.vTran,p.vAC_Re,p.vAC_Im} - {n.vDC,n. vTran,n.vAC_Re,n.vAC_Im}; // ------------ // Static model // ------------ vDC = R*iDC; when ctrl_RBREAK_Tran2DC then vDCclampP = p.vTran; vDCclampN = n.vTran; end when; {iDCclampP,iDCclampN} = if ctrl_RBREAK_Tran2DC then {vDCclampP - p.vDC, vDCclampN - n.vDC}/R_EPS else zeros(2); // --------------- // Transient model // --------------- vTran = R*iTran; // --------------------- // AC small-signal model // --------------------- {vAC_Re,vAC_Im} = R*{iAC_Re,iAC_Im}; (pinP_vAC_mag,pinP_vAC_phase) = Rect2Polar({p.vAC_Re,p.vAC_Im}); pinP_vAC_mag_dB = Decibels(pinP_vAC_mag); (pinN_vAC_mag,pinN_vAC_phase) = Rect2Polar({n.vAC_Re,n.vAC_Im}); pinN_vAC_mag_dB = Decibels(pinN_vAC_mag); (vAC_mag,vAC_phase) = Rect2Polar({vAC_Re,vAC_Im}); vAC_mag_dB = Decibels(vAC_mag); (iAC_mag,iAC_phase) = Rect2Polar({iAC_Re,iAC_Im}); iAC_mag_dB = Decibels(iAC_mag); // --------------------------- // Log static analysis results // --------------------------- when ctrl_log_DC and ((HIDDEN_COMPONENT == false) or (LOG_RESULTS == 2 and HIDDEN_COMPONENT == true)) then LogVariable(p.vDC); LogVariable(n.vDC); end when; when ctrl_log_DC and ((HIDDEN_COMPONENT == false and LOG_RESULTS > 0) or ( HIDDEN_COMPONENT == true and LOG_RESULTS == 2)) then LogVariable(vDC); LogVariable(iDC); end when; // --------------------------- // Log AC small-signal results // --------------------------- when ctrl_log_AC and (HIDDEN_COMPONENT == false or LOG_RESULTS == 2 and HIDDEN_COMPONENT == true) then LogVariable(pinP_vAC_mag); LogVariable(pinP_vAC_phase); LogVariable(pinP_vAC_mag_dB); LogVariable(pinN_vAC_mag); LogVariable(pinN_vAC_phase); LogVariable(pinN_vAC_mag_dB); end when; when ctrl_log_AC and (HIDDEN_COMPONENT == false and LOG_RESULTS > 0 or HIDDEN_COMPONENT == true and LOG_RESULTS == 2) then LogVariable(vAC_mag); LogVariable(vAC_mag_dB); LogVariable(vAC_phase); LogVariable(iAC_mag); LogVariable(iAC_mag_dB); LogVariable(iAC_phase); end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, 55; 100, 110], string="%=R", style(color=0)), Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-65, 0; -50, 30; -30, -30; -10, 30; 10, -30; 30, 30; 50, -30; 65, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -65, 0], style(color=3, thickness=1)), Line(points=[65, 0; 100, 0], style(color=3, thickness=1)))); end Rbreak; partial model Capacitor /* --- Cvar and CvarAC have to be defined --- */ extends INTERFACE.TwoPin; extends INIT.Part; constant SI.Resistance R_EPS=2e-4 "IC resistor"; parameter SI.Voltage IC=0 "Initial voltage"; parameter Boolean IC_ENABLED=false "IC enabled"; constant Real pi=3.14159265358979; SI.Capacitance Cvar(start=1e-12) "Transient analysis capacitance"; SI.Capacitance CvarAC(start=1E-12) "AC small-signal capacitance"; SI.Voltage vDC "DC voltage across the capacitor"; SI.Voltage vTran "Transient voltage across the capacitor"; SI.Voltage vAC_Re "Real part of AC small-signal voltage across the capacitor"; SI.Voltage vAC_Im "Imaginary part of AC small-signal voltage across the capacitor"; SI.Current iDC "DC current"; SI.Current iTran "Transient/Small-signal current"; SI.Current iAC_Re "Small-signal current. Real part"; SI.Current iAC_Im "Small-signal current. Imaginary part"; protected SI.Current iClampTran; SI.Voltage vClampTran; SI.Voltage vClampDC; SI.Time timeClampTran; SI.Time timeClampDC; equation // ------------------------------------------------ // i, v sign criterion: Positive current flows from // the (+) node through the part to the (-) node // ------------------------------------------------ {iDC,iTran,iAC_Re,iAC_Im} = {p.iDC,p.iTran + iClampTran,p.iAC_Re,p.iAC_Im}; {iDC,iTran,iAC_Re,iAC_Im} = -{n.iDC,n.iTran - iClampTran,n.iAC_Re,n.iAC_Im}; {vDC,vTran,vAC_Re,vAC_Im} = {p.vDC,p.vTran,p.vAC_Re,p.vAC_Im} - {n.vDC,n. vTran,n.vAC_Re,n.vAC_Im}; // --------------- // Transient model // --------------- //Cvar*der(vTran) = iTran; iClampTran = if ctrl_IC_clampTran and IC_ENABLED then (vClampTran - vTran)/ R_EPS else 0; when ctrl_IC_clampTran and IC_ENABLED then timeClampTran = time; end when; vClampTran = if ctrl_IC_clampTran and IC_ENABLED and ctrl_IC_mode == 0 then IC else if ctrl_IC_clampTran and IC_ENABLED and ctrl_IC_mode == 1 then IC*(time - timeClampTran)/TIME_SCALE else 0; // Voltage initialization conditions when ctrl_CBREAK_Tran2IC and IC_ENABLED then reinit(vTran, IC); end when; when ctrl_CBREAK_Tran2DC then reinit(vTran, vDC); end when; when ctrl_CBREAK_resetTran then reinit(vTran, 0); end when; // ------------ // Static model // ------------ iDC = if ctrl_IC_clampDC and IC_ENABLED then (vDC - vClampDC)/R_EPS else 0; when ctrl_IC_clampDC and IC_ENABLED then timeClampDC = time; end when; vClampDC = if ctrl_IC_clampDC and IC_ENABLED and ctrl_IC_mode == 0 then IC else if ctrl_IC_clampDC and IC_ENABLED and ctrl_IC_mode == 1 then IC*( time - timeClampDC)/TIME_SCALE else 0; // --------------------- // AC small-signal model // --------------------- {vAC_Re,vAC_Im}*(2*pi*freq*CvarAC) = {iAC_Im,-iAC_Re}; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-100, 0; -55, 0], style(color=3, thickness=1)), Line(points=[-55, 0; -20, 0], style(thickness=1, color=3)), Line(points=[-20, -40; -20, 40], style(thickness=1, color=3)), Line(points=[20, -40; 20, 40], style(thickness=1, color=3)), Line(points=[20, 0; 55, 0], style(thickness=1, color=3)), Line(points=[55, 0; 100, 0], style(color=3, thickness=1)))); end Capacitor; model Capacitor1 extends Capacitor; parameter SI.Capacitance C=1E-9 "Capacitance"; equation // --------------- // Transient model // --------------- Cvar*der(vTran) = iTran; Cvar = C; CvarAC = C; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Text( extent=[-100, 55; 100, 110], string="%=C", style(color=0)))); end Capacitor1; model Cbreak extends INTERFACE.TwoPin; parameter SI.Capacitance C=1E-9 "Capacitance"; parameter Boolean IC_ENABLED=false "IC enabled"; parameter SI.Voltage IC=0 "Initial voltage"; constant SI.Resistance R_eps2=2e-4 "Resistance to avoid high index problems"; SI.Voltage vDC "DC voltage across the capacitor"; SI.Voltage vTran "Transient voltage across the capacitor"; SI.Voltage vAC_Re "Real part of AC small-signal voltage across the capacitor"; SI.Voltage vAC_Im "Imaginary part of AC small-signal voltage across the capacitor"; SI.Current iDC "DC current"; SI.Current iTran "Transient/Small-signal current"; SI.Current iAC_Re "Small-signal current. Real part"; SI.Current iAC_Im "Small-signal current. Imaginary part"; SI.Voltage vAC_mag(start=0) "Magnitude of AC small-signal voltage across the component"; SI.Voltage vAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal voltage across the component"; nonSI.Angle_deg vAC_phase(start=0) "Phase (deg) of AC small-signal voltage across the component"; SI.Current iAC_mag(start=0) "Magnitude of AC small-signal current"; SI.Current iAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal current"; nonSI.Angle_deg iAC_phase(start=0) "Phase (deg) of AC small-signal current"; SI.Voltage pinP_vAC_mag(start=0); SI.Voltage pinP_vAC_phase(start=0); SI.Voltage pinP_vAC_mag_dB(start=0); SI.Voltage pinN_vAC_mag(start=0); SI.Voltage pinN_vAC_phase(start=0); SI.Voltage pinN_vAC_mag_dB(start=0); Capacitor1 Capacitor( C=C, IC=IC, IC_ENABLED=IC_ENABLED) annotation (extent=[-50, -8; -30, 12]); Rbreak R_EPS2(HIDDEN_COMPONENT=true, R=R_eps2) "Resistor to avoid high index problems" annotation (extent=[4, -8; 24, 12]); annotation (Diagram); annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, 55; 100, 110], string="%=C", style(color=0)), Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-100, 0; -55, 0], style(color=3, thickness=1)), Line(points=[-55, 0; -20, 0], style(thickness=1, color=3)), Line(points=[-20, -40; -20, 40], style(thickness=1, color=3)), Line(points=[20, -40; 20, 40], style(thickness=1, color=3)), Line(points=[20, 0; 55, 0], style(thickness=1, color=3)), Line(points=[55, 0; 100, 0], style(color=3, thickness=1)))); equation {iDC,iTran,iAC_Re,iAC_Im} = {p.iDC,p.iTran,p.iAC_Re,p.iAC_Im}; {vDC,vTran,vAC_Re,vAC_Im} = {p.vDC,p.vTran,p.vAC_Re,p.vAC_Im} - {n.vDC,n. vTran,n.vAC_Re,n.vAC_Im}; (pinP_vAC_mag,pinP_vAC_phase) = Rect2Polar({p.vAC_Re,p.vAC_Im}); pinP_vAC_mag_dB = Decibels(pinP_vAC_mag); (pinN_vAC_mag,pinN_vAC_phase) = Rect2Polar({n.vAC_Re,n.vAC_Im}); pinN_vAC_mag_dB = Decibels(pinN_vAC_mag); (vAC_mag,vAC_phase) = Rect2Polar({vAC_Re,vAC_Im}); vAC_mag_dB = Decibels(vAC_mag); (iAC_mag,iAC_phase) = Rect2Polar({iAC_Re,iAC_Im}); iAC_mag_dB = Decibels(iAC_mag); connect(R_EPS2.n, n) annotation (points=[25, 2; 67.5, 2; 67.5, 0; 110, 0], style(color=1)); connect(p, Capacitor.p) annotation (points=[-110, 0; -81, 0; -81, 2; -51, 2], style(color=1)); connect(Capacitor.n, R_EPS2.p) annotation (points=[-29, 2; 3, 2], style(color=1)); end Cbreak; partial model Inductor extends INTERFACE.TwoPin; extends INIT.Part; constant SI.Resistance R_BIG=1e9 "IC resistor"; constant SI.Resistance R_BIG2=1e9 "Resistance to avoid high index problems"; parameter SI.Voltage IC=0 "Initial current"; parameter Boolean IC_ENABLED=false "IC enabled"; constant Real pi=3.14159265358979; SI.Inductance Lvar "Transient analysis inductance"; SI.Inductance LvarAC(start=1E-9) "AC small-signal inductance"; SI.Voltage vDC "DC voltage across the inductor"; SI.Voltage vTran "Transient voltage across the inductor"; SI.Voltage vAC_Re "Real part of AC small-signal voltage across the inductor"; SI.Voltage vAC_Im "Imaginary part of AC small-signal voltage across the inductor"; SI.Current iDC "DC current"; SI.Current iTran "Transient/Small-signal current"; SI.Current iAC_Re "Small-signal current. Real part"; SI.Current iAC_Im "Small-signal current. Imaginary part"; SI.Voltage vAC_mag(start=0) "Magnitude of AC small-signal voltage across the component"; SI.Voltage vAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal voltage across the component"; nonSI.Angle_deg vAC_phase(start=0) "Phase (deg) of AC small-signal voltage across the component"; SI.Current iAC_mag(start=0) "Magnitude of AC small-signal current"; SI.Current iAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal current"; nonSI.Angle_deg iAC_phase(start=0) "Phase (deg) of AC small-signal current"; SI.Voltage pinP_vAC_mag(start=0); SI.Voltage pinP_vAC_phase(start=0); SI.Voltage pinP_vAC_mag_dB(start=0); SI.Voltage pinN_vAC_mag(start=0); SI.Voltage pinN_vAC_phase(start=0); SI.Voltage pinN_vAC_mag_dB(start=0); protected SI.Current iClampTran; SI.Voltage iClampDC; SI.Voltage vClampDC; SI.Voltage vClampTran; SI.Time timeClampTran; SI.Time timeClampDC; equation // ------------------------------------------------ // i, v sign criterion: Positive current flows from // the (+) node through the part to the (-) node // ------------------------------------------------ {iDC,iTran,iAC_Re,iAC_Im} = {p.iDC,p.iTran - vTran/R_BIG2,p.iAC_Re - vAC_Re /R_BIG2,p.iAC_Im - vAC_Im/R_BIG2}; {iDC,iTran,iAC_Re,iAC_Im} = -{n.iDC,n.iTran + vTran/R_BIG2,n.iAC_Re + vAC_Re/R_BIG2,n.iAC_Im + vAC_Im/R_BIG2}; {vDC,vTran,vAC_Re,vAC_Im} = {p.vDC - vClampDC,p.vTran - vClampTran,p.vAC_Re, p.vAC_Im} - {n.vDC,n.vTran,n.vAC_Re,n.vAC_Im}; // --------------- // Transient model // --------------- vClampTran = if ctrl_IC_clampTran and IC_ENABLED then (-iClampTran + iTran + vTran/R_BIG2)*R_BIG else 0; when ctrl_IC_clampTran and IC_ENABLED then timeClampTran = time; end when; iClampTran = if ctrl_IC_clampTran and IC_ENABLED and ctrl_IC_mode == 0 then IC else if ctrl_IC_clampTran and IC_ENABLED and ctrl_IC_mode == 1 then IC*(time - timeClampTran)/TIME_SCALE else 0; // Voltage initialization conditions when ctrl_CBREAK_Tran2IC and IC_ENABLED then reinit(iTran, IC); end when; when ctrl_CBREAK_Tran2DC then reinit(iTran, iDC); end when; when ctrl_CBREAK_resetTran then reinit(iTran, 0); end when; // ------------ // Static model // ------------ vDC = 0; vClampDC = if ctrl_IC_clampDC and IC_ENABLED then (iDC - iClampDC)*R_BIG else 0; when ctrl_IC_clampDC and IC_ENABLED then timeClampDC = time; end when; iClampDC = if ctrl_IC_clampDC and IC_ENABLED and ctrl_IC_mode == 0 then IC else if ctrl_IC_clampDC and IC_ENABLED and ctrl_IC_mode == 1 then IC*( time - timeClampDC)/TIME_SCALE else 0; // --------------------- // AC small-signal model // --------------------- {vAC_Re,vAC_Im} = {iAC_Im,-iAC_Re}*(2*pi*freq*LvarAC); (pinP_vAC_mag,pinP_vAC_phase) = Rect2Polar({p.vAC_Re,p.vAC_Im}); pinP_vAC_mag_dB = Decibels(pinP_vAC_mag); (pinN_vAC_mag,pinN_vAC_phase) = Rect2Polar({n.vAC_Re,n.vAC_Im}); pinN_vAC_mag_dB = Decibels(pinN_vAC_mag); (vAC_mag,vAC_phase) = Rect2Polar({vAC_Re,vAC_Im}); vAC_mag_dB = Decibels(vAC_mag); (iAC_mag,iAC_phase) = Rect2Polar({iAC_Re,iAC_Im}); iAC_mag_dB = Decibels(iAC_mag); annotation ( Coordsys( extent=[-100, -100; 100, 100], grid=[2, 2], component=[20, 20]), Window( x=0.02, y=0.21, width=0.6, height=0.6), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-99, 0; -70.384, 0; -69.116, 9.503; -65.233, 18.288; -57.964, 25.671; -53.161, 27.909; -47.915, 28.702; -42.669, 27.909; -37.866, 25.671; -30.598, 18.288; -27, 9.5]), Line(points=[-27, 9.5; -25.447, -1; -25.758, -5.757; -26.695, -10.432; -28.329, -15.064; -29.589, -17.457; -30.774, -18.371; -32.235, -18.696; -33.695, -18.371; -34.88, -17.457; -36.14, -15.064; -37.774, -10.432; -38.7, -4.5]), Line(points=[-38.711, -4.757; -39.022, 0.0; -37.755, 9.503; -33.871, 18.288; -26.603, 25.671; -21.8, 27.909; -16.554, 28.702; -11.308, 27.909; -6.505, 25.671; 0.764, 18.288; 4.647, 9.503; 5.915, 0.0; 5.604, -4.757]), Line(points=[5.604, -4.757; 4.667, -9.432; 3.033, -14.064; 1.773, -16.457; 0.588, -17.371; 0., 873, -17.696; -2.333, -17.371; -3.518, -16.457; -4.778, -14.064; -6.412, -9.432; -7.349, -4.757; -7.66, 0.0], style(color=0)), Line(points=[-7.411, -5.107; -7.722, -0.35; -6.455, 9.153; -2.571, 17.938; 4.697, 25.321; 9.5, 27.559; 14.746, 28.352; 19.992, 27.559; 24.795, 25.321; 32.064, 17.938; 35.947, 9.153; 37.215, -0.35; 37.05, -1.95]), Line(points=[5.55, -4.2; 5.55, -5.25; 5.542, -5.957; 4.605, -10.632; 2.971, -15.264; 1.711, -17.657; 0.526, -18.571; -0.935, -18.896; -2.395, -18.571; -3.58, -17.657; -4.84, -15.264; -6.474, -10.632; -7.4, -4.7]), Line(points=[23.939, -4.957; 23.628, -0.2; 24.895, 9.303; 28.779, 18.088; 36.047, 25.471; 40.85, 27.709; 46.096, 28.502; 51.342, 27.709; 56.145, 25.471; 63.414, 18.088; 67.297, 9.303; 68.55, 1.5; 68.5, 0]), Line(points=[37.15, -1.85; 37.153, -1.55; 36.842, -6.307; 35.905, -10.982; 34.271, -15.614; 33.011, -18.007; 31.826, -18.921; 30.365, -19.246; 28.905, -18.921; 27.72, -18.007; 26.46, -15.614; 24.826, -10.982; 23.9, -5.05]), Line(points=[68.55, 0; 100.05, 0])), Diagram); end Inductor; model Lbreak extends Inductor; parameter SI.Inductance L=1E-5 "Inductance"; Real der_iTran "Voltage derivative [V/s]"; equation // --------------- // Transient model // --------------- der_iTran = der(iTran); Lvar*der_iTran = vTran; Lvar = L; LvarAC = L; annotation ( Coordsys( extent=[-100, -100; 100, 100], grid=[2, 2], component=[20, 20]), Window( x=0.02, y=0.21, width=0.6, height=0.6), Icon(Text( extent=[-100, 55; 100, 110], string="%=L", style(color=0)))); end Lbreak; package DIODE_PSPICE model I_DIODE extends INTERFACE.OnePort; extends INIT.Part; parameter SI.Current IS "Reverse saturation current at 300K"; // parameter SI.Conductance GMIN "Conductance in parallel with the pn-junction"; parameter SI.Voltage BV "Reverse breakdown voltage (positive number)"; parameter Real N "Emission coefficient"; parameter SI.Current IKF "High injection knee current"; parameter SI.Current ISR "Recombination current"; parameter Real NR "Emission coefficient for ISR"; parameter SI.Current IBV "Reverse breakdown current (positive number)"; // SI.Current IBV "Reverse breakdown current (positive number)"; parameter Real M "Grading coefficient"; parameter SI.Voltage VJ "Junction potencial"; SI.Voltage vDiodeTran "Voltage drop across the current source"; protected SI.Conductance gAC(start=1) "AC small-signal conductance"; SI.Voltage thermalVolt "Thermal voltage"; Real KhliDC; Real KgenDC; Real KhliDCs(start=1); Real KgenDCs(start=1); SI.Current IFDC; SI.Current IRDC; SI.Current IFDCs(start=1); SI.Current IRDCs(start=1); SI.Current IREVDC; Real KhliTran; Real KgenTran; SI.Current IFTran; SI.Current IRTran; SI.Current IREVTran; Real derKhli; Real derKgen; SI.Conductance derIF; SI.Conductance derIR; SI.Conductance derIREV; equation // Thermal voltage: kT/q thermalVolt = temp/11600; // ------------ // Static Model // ------------ KhliDC = if (IKF > IS and ctrl_DC) then sqrt(IKF/(IKF + IFDC)) else 1; KgenDC = if (ctrl_DC) then sqrt(((1 - vDC/VJ)^2 + 0.005)^M) else 1; IFDC = if (ctrl_DC) then IS*(exp(vDC/thermalVolt/N) - 1) else 0; IRDC = if (ctrl_DC) then ISR*(exp(vDC/thermalVolt/NR) - 1) else 0; IREVDC = if (ctrl_DC) then IBV*exp(-(BV + vDC)/thermalVolt) else 0; 0 = if (ctrl_DC) then -iDC + KhliDC*IFDC + KgenDC*IRDC - IREVDC + vDC* GMIN*scaleGMIN else vDC; // ------------------ // Large-signal Model // ------------------ KhliTran = if (IKF > IS) then sqrt(IKF/(IKF + IFTran)) else 1; KgenTran = sqrt(((1 - vDiodeTran/VJ)^2 + 0.005)^M); IFTran = IS*(exp(vDiodeTran/thermalVolt/N) - 1); IRTran = ISR*(exp(vDiodeTran/thermalVolt/NR) - 1); IREVTran = IBV*exp(-(BV + vDiodeTran)/thermalVolt); iTran = KhliTran*IFTran + KgenTran*IRTran - IREVTran + vTran*GMIN; // --------------------- // AC Small Signal Model // --------------------- when ctrl_AC then derIF = IS/thermalVolt/N*exp(vDC/thermalVolt/N); derIR = ISR/thermalVolt/NR*exp(vDC/thermalVolt/NR); derIREV = -IBV/thermalVolt*exp(-(BV + vDC)/thermalVolt); IFDCs = IS*(exp(vDC/thermalVolt/N) - 1); IRDCs = ISR*(exp(vDC/thermalVolt/NR) - 1); derKhli = if (IKF > IS) then -0.5/sqrt(IKF/(IKF + IFDCs))*derIF*IKF/( IKF + IFDCs)^2 else 0; derKgen = -M/VJ*(1 - vDC/VJ)*((1 - vDC/VJ)^2 + 0.005)^(M/2 - 1); KhliDCs = if (IKF > IS) then sqrt(IKF/(IKF + IFDCs)) else 1; KgenDCs = sqrt(((1 - vDC/VJ)^2 + 0.005)^M); gAC = derKhli*IFDCs + derIF*KhliDCs + derKgen*IRDCs + KgenDCs*derIR + derIREV + GMIN; end when; {iAC_Re,iAC_Im} = gAC*{vAC_Re,vAC_Im}; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)), Ellipse(extent=[-60, -60; 60, 60], style(thickness=1, color=3)), Line(points=[-50, 0; 50, 0], style(thickness=1, color=3)), Line(points=[20, 20; 50, 0], style(thickness=1, color=3)), Line(points=[20, -20; 50, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -60, 0], style(thickness=1, color=3)), Line(points=[60, 0; 100, 0], style(thickness=1, color=3)))); end I_DIODE; model C_DIODE extends src.BREAKOUT.Capacitor; extends INIT.Part; parameter Real CJ0 "Zero-bias junction capacitance [F]"; parameter Real TT "Transit time [s]"; parameter Real M "Grading coefficient"; parameter Real FC "Coefficient for forward-bias depletion capacitance formula"; parameter SI.Voltage VJ "Junction potencial"; parameter SI.Current IS "Reverse saturation current at 300K"; parameter SI.Voltage BV "Reverse breakdown voltage (positive number)"; parameter Real N "Emission coefficient"; parameter SI.Current IKF "High injection knee current"; parameter SI.Current ISR "Recombination current"; parameter Real NR "Emission coefficient for ISR"; parameter SI.Current IBV "Reverse breakdown current (positive number)"; protected parameter Real F2=(1 - FC)^(1 + M); parameter Real F3=1 - FC*(1 + M); SI.Conductance gAC(start=1); SI.Conductance gTran(start=1); SI.Voltage thermalVolt "Thermal voltage"; Real KhliDC; Real KgenDC; SI.Current IFDC; SI.Current IRDC; Real KhliTran; Real KgenTran; SI.Current IFTran; SI.Current IRTran; Real derKhliDC; Real derKgenDC; Real derKhliTran; Real derKgenTran; SI.Conductance derIFDC; SI.Conductance derIRDC; SI.Conductance derIREVDC; SI.Conductance derIFTran; SI.Conductance derIRTran; SI.Conductance derIREVTran; equation // Thermal voltage: kT/q thermalVolt = temp/11600; // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; derIFTran = IS/thermalVolt/N*exp(vTran/thermalVolt/N); derIRTran = ISR/thermalVolt/NR*exp(vTran/thermalVolt/NR); derIREVTran = -IBV/thermalVolt*exp(-(BV + vTran)/thermalVolt); IFTran = IS*(exp(vTran/thermalVolt/N) - 1); IRTran = ISR*(exp(vTran/thermalVolt/NR) - 1); derKhliTran = if (IKF > IS) then -0.5/sqrt(IKF/(IKF + IFTran))*derIFTran* IKF/(IKF + IFTran)^2 else 0; derKgenTran = -M/VJ*(1 - vTran/VJ)*((1 - vTran/VJ)^2 + 0.005)^(M/2 - 1); KhliTran = if (IKF > IS) then sqrt(IKF/(IKF + IFTran)) else 1; KgenTran = sqrt(((1 - vTran/VJ)^2 + 0.005)^M); gTran = derKhliTran*IFTran + derIFTran*KhliTran + derKgenTran*IRTran + KgenTran*derIRTran - derIREVTran + GMIN; Cvar = if noEvent(vTran < FC*VJ) then TT*gTran + CJ0*(1 - vTran/VJ)^(-M) else TT*gTran + CJ0/F2*(F3 + M*vTran/VJ); // --------------------------- // AC small-signal capacitance // --------------------------- when ctrl_AC then derIFDC = IS/thermalVolt/N*exp(vDC/thermalVolt/N); derIRDC = ISR/thermalVolt/NR*exp(vDC/thermalVolt/NR); derIREVDC = -IBV/thermalVolt*exp(-(BV + vDC)/thermalVolt); IFDC = IS*(exp(vDC/thermalVolt/N) - 1); IRDC = ISR*(exp(vDC/thermalVolt/NR) - 1); derKhliDC = if (IKF > IS) then -0.5/sqrt(IKF/(IKF + IFDC))*derIFDC*IKF/ (IKF + IFDC)^2 else 0; derKgenDC = -M/VJ*(1 - vDC/VJ)*((1 - vDC/VJ)^2 + 0.005)^(M/2 - 1); KhliDC = if (IKF > IS) then sqrt(IKF/(IKF + IFDC)) else 1; KgenDC = sqrt(((1 - vDC/VJ)^2 + 0.005)^M); gAC = derKhliDC*IFDC + derIFDC*KhliDC + derKgenDC*IRDC + KgenDC*derIRDC + derIREVDC + GMIN; CvarAC = if (vDC < FC*VJ) then TT*gAC + CJ0*(1 - vDC/VJ)^(-M) else TT* gAC + CJ0/F2*(F3 + M*vDC/VJ); end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end C_DIODE; annotation (Icon(Rectangle(extent=[-80, 60; 80, -60], style(color=0, thickness=2)), Text( extent=[-80, 34; 80, -34], style(thickness=2), string="DIODE_PSPICE"))); end DIODE_PSPICE; model PSPICE_diode extends INTERFACE.TwoPin; extends INIT.Part; parameter Boolean HIDDEN_COMPONENT=false "Enable or disable log"; parameter SI.Current IS=1e-14 "Saturation current"; parameter SI.Resistance RS=10 "Ohmic Resistance"; parameter Real N=1 "Emission coefficient"; parameter SI.Time TT=0 "Transit time"; parameter SI.Capacitance CJ0=1e-6 "zero-bias junction capacitance"; parameter SI.Voltage VJ=1 "Junction potential"; parameter Real M=0.5 "grading coefficient"; parameter Real FC=0.5 "Coefficient for forward-bias depletion capacitance formula"; parameter SI.Voltage BV=1e40 "reverse breakdown voltage (positive number)"; parameter SI.Current IKF=-1 "High injection knee current"; parameter SI.Current ISR=1e-14 "Recombination current"; parameter Real NR=1 "Emission coefficient for ISR"; parameter SI.Current IBV=1e-3 "Reverse breakdown current (positive number)"; SI.Voltage vDC "DC voltage between pines"; SI.Voltage vTran "Transient voltage between pines"; SI.Voltage vAC_Re "Real part of AC small-signal voltage between pines"; SI.Voltage vAC_Im "Imaginary part of AC small-signal voltage between pines"; SI.Current iDC "DC current"; SI.Current iTran "Transient/Small-signal current"; SI.Current iAC_Re "Small-signal current. Real part"; SI.Current iAC_Im "Small-signal current. Imaginary part"; SI.Voltage vAC_mag(start=0) "Magnitude of AC small-signal voltage across the component"; SI.Voltage vAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal voltage across the component"; nonSI.Angle_deg vAC_phase(start=0) "Phase (deg) of AC small-signal voltage across the component"; SI.Current iAC_mag(start=0) "Magnitude of AC small-signal current"; SI.Current iAC_mag_dB(start=0) "Magnitude (dB) of AC small-signal current"; nonSI.Angle_deg iAC_phase(start=0) "Phase (deg) of AC small-signal current"; SI.Voltage pinP_vAC_mag(start=0); SI.Voltage pinP_vAC_phase(start=0); SI.Voltage pinP_vAC_mag_dB(start=0); SI.Voltage pinN_vAC_mag(start=0); SI.Voltage pinN_vAC_phase(start=0); SI.Voltage pinN_vAC_mag_dB(start=0); DIODE_PSPICE.I_DIODE I_diode( IS=IS, BV=BV, N=N, IKF=IKF, ISR=ISR, NR=NR, IBV=IBV, M=M, VJ=VJ) annotation (extent=[-6, -50; 14, -30], rotation=0); DIODE_PSPICE.C_DIODE Cdiode( IS=IS, BV=BV, N=N, TT=TT, CJ0=CJ0, M=M, VJ=VJ, FC=FC, IKF=IKF, ISR=ISR, NR=NR, IBV=IBV) annotation (extent=[0, 34; 20, 54], rotation=0); Rbreak Rs(R=RS, HIDDEN_COMPONENT=true) annotation (extent=[-90, -8; -70, 12]); annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-100, 0; -75, 0], style(color=1, thickness=3)), Line(points=[-75, 0; -40, 0], style(thickness=1, color=3)), Line(points=[-40, -40; -40, 40; 40, 0; -40, -40], style(thickness=1, color=3)), Line(points=[40, -40; 40, 40], style(thickness=1, color=3)), Line(points=[40, 0; 75, 0], style(thickness=1, color=3)), Line(points=[75, 0; 100, 0], style(color=1, thickness=3))), Diagram); equation // For numerical efficiency Cdiode.vTran = I_diode.vDiodeTran; {iDC,iTran,iAC_Re,iAC_Im} = {p.iDC,p.iTran,p.iAC_Re,p.iAC_Im}; {vDC,vTran,vAC_Re,vAC_Im} = {p.vDC,p.vTran,p.vAC_Re,p.vAC_Im} - {n.vDC,n. vTran,n.vAC_Re,n.vAC_Im}; (pinP_vAC_mag,pinP_vAC_phase) = Rect2Polar({p.vAC_Re,p.vAC_Im}); pinP_vAC_mag_dB = Decibels(pinP_vAC_mag); (pinN_vAC_mag,pinN_vAC_phase) = Rect2Polar({n.vAC_Re,n.vAC_Im}); pinN_vAC_mag_dB = Decibels(pinN_vAC_mag); (vAC_mag,vAC_phase) = Rect2Polar({vAC_Re,vAC_Im}); vAC_mag_dB = Decibels(vAC_mag); (iAC_mag,iAC_phase) = Rect2Polar({iAC_Re,iAC_Im}); iAC_mag_dB = Decibels(iAC_mag); // --------------------------- // Log static analysis results // --------------------------- when ctrl_log_DC and ((HIDDEN_COMPONENT == false) or (LOG_RESULTS == 2 and HIDDEN_COMPONENT == true)) then LogVariable(p.vDC); LogVariable(n.vDC); end when; when ctrl_log_DC and ((HIDDEN_COMPONENT == false and LOG_RESULTS > 0) or ( HIDDEN_COMPONENT == true and LOG_RESULTS == 2)) then LogVariable(vDC); LogVariable(iDC); end when; // --------------------------- // Log AC small-signal results // --------------------------- when ctrl_log_AC and (HIDDEN_COMPONENT == false or LOG_RESULTS == 2 and HIDDEN_COMPONENT == true) then LogVariable(pinP_vAC_mag); LogVariable(pinP_vAC_phase); LogVariable(pinP_vAC_mag_dB); LogVariable(pinN_vAC_mag); LogVariable(pinN_vAC_phase); LogVariable(pinN_vAC_mag_dB); end when; when ctrl_log_AC and (HIDDEN_COMPONENT == false and LOG_RESULTS > 0 or HIDDEN_COMPONENT == true and LOG_RESULTS == 2) then LogVariable(vAC_mag); LogVariable(vAC_mag_dB); LogVariable(vAC_phase); LogVariable(iAC_mag); LogVariable(iAC_mag_dB); LogVariable(iAC_phase); end when; connect(Cdiode.n, I_diode.n) annotation (points=[21, 44; 34, 44; 34, -40; 15, -40], style(color=1)); connect(Rs.n, I_diode.p) annotation (points=[-69, 2; -42, 2; -42, -40; -7, -40], style(color=1)); connect(Rs.p, p) annotation (points=[-91, 2; -100.5, 2; -100.5, 0; -110, 0], style(color=1)); connect(I_diode.n, n) annotation (points=[15, -40; 34, -40; 34, 0; 110, 0], style(color=1)); connect(Rs.n, Cdiode.p) annotation (points=[-69, 2; -42, 2; -42, 44; -1, 44], style(color=1)); end PSPICE_diode; package SPICE2_MOS1 // ----------------------------------------------------------- // SPICE2 Level1 MOS // Reference: // Semiconductor Device Modeling with SPICE. 2nd Edition, 1993 // G. Massobrio and P. Antognetti. // McGraw-Hill, Inc // ----------------------------------------------------------- model Idiode extends INTERFACE.OnePort; extends INIT.Part; parameter SI.Current IS "Reverse saturation current at 300K"; // Boolean forwardDC "Operation region"; // Boolean forwardTran; SI.Voltage vDiodeTran "Voltage drop across the diode"; protected SI.Conductance gAC(start=1) "AC small-signal conductance"; SI.Voltage thermalVolt "Thermal voltage"; equation // Thermal voltage: kT/q thermalVolt = temp/11600; iDC = IS*(exp(vDC/thermalVolt) - 1) + vDC*scaleGMIN*GMIN; // ------------- // Dynamic model // ------------- iTran = if noEvent(vDiodeTran > 0) then IS*(exp(vDiodeTran/thermalVolt) - 1) + vDiodeTran*GMIN else (IS/thermalVolt + GMIN)*vDiodeTran; // ------------------ // Small-signal model // ------------------ when ctrl_AC then gAC = if (vDC > 0) then IS/thermalVolt*exp(vDC/thermalVolt) + GMIN else IS/thermalVolt + GMIN; end when; {iAC_Re,iAC_Im} = gAC*{vAC_Re,vAC_Im}; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)), Ellipse(extent=[-60, -60; 60, 60], style(thickness=1, color=3)), Line(points=[-50, 0; 50, 0], style(thickness=1, color=3)), Line(points=[20, 20; 50, 0], style(thickness=1, color=3)), Line(points=[20, -20; 50, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -60, 0], style(thickness=1, color=3)), Line(points=[60, 0; 100, 0], style(thickness=1, color=3)))); end Idiode; model Ids extends INTERFACE.OnePort; extends INIT.Part; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vgsDC "Gate to source voltage"; outer SI.Voltage vbsDC "Bulk to source voltage"; outer SI.Voltage vdsDC "Drain to source voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vgsTran "Gate to source voltage"; outer SI.Voltage vbsTran "Bulk to source voltage"; outer SI.Voltage vdsTran "Drain to source voltage"; outer SI.Voltage vdsTranSgn "Drain-pin to source-pin voltage"; outer SI.Voltage gate_vAC_Re; outer SI.Voltage gate_vAC_Im; outer SI.Voltage bulk_vAC_Re; outer SI.Voltage bulk_vAC_Im; parameter SI.Voltage VTO "Zero-bias threshold voltage"; parameter Real GAMMA "Body-effect parameter [V0.5]"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter Real KP "Transconductance parameter [A/V2]"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length LD "Lateral diffusion"; parameter Real LAMBDA "Channel-length modulation [V-1]"; protected parameter Real beta=KP*W/(L - 2*LD); Boolean pinNisSourceAC(start=true); SI.Current idsDC "Drain to source current"; SI.Current idsTran "Drain to source current"; Real ARG(start=0); SI.Conductance gdsAC "dIds/dVds"; SI.Conductance gmbsAC "dIds/dVbs"; SI.Conductance gmAC "dIds/dVgs"; SI.Voltage vdsAC_Re; SI.Voltage vdsAC_Im; SI.Voltage vgsAC_Re; SI.Voltage vgsAC_Im; SI.Voltage vbsAC_Re; SI.Voltage vbsAC_Im; SI.Current idsAC_Re; SI.Current idsAC_Im; equation // ------------ // Static model // ------------ iDC = noEvent(if vDC > 0 then idsDC else -idsDC); idsDC = if vgsDC <= vthDC then 0 else noEvent(if vdsDC < vgsDC - vthDC then beta*(vgsDC - vthDC - 0.5*vdsDC)*vdsDC*(1 + LAMBDA*vdsDC) else 0.5*beta*(vgsDC - vthDC)^2*(1 + LAMBDA*vdsDC)); // ------------------ // Large-signal model // ------------------ iTran = if noEvent(vdsTranSgn >= 0) then idsTran else -idsTran; idsTran = if vgsTran <= vthTran then 0 else if noEvent(vdsTran < vgsTran - vthTran) then beta*(vgsTran - vthTran - 0.5*vdsTran)*vdsTran*(1 + LAMBDA*vdsTran) else 0.5*beta*(vgsTran - vthTran)^2*(1 + LAMBDA*vdsTran); // --------------------- // AC small-signal model // --------------------- {vdsAC_Re,vdsAC_Im} = if pinNisSourceAC then {vAC_Re,vAC_Im} else -{ vAC_Re,vAC_Im}; {vgsAC_Re,vgsAC_Im} = if pinNisSourceAC then {gate_vAC_Re - n.vAC_Re, gate_vAC_Im - n.vAC_Im} else {gate_vAC_Re - p.vAC_Re,gate_vAC_Im - p. vAC_Im}; {vbsAC_Re,vbsAC_Im} = if pinNisSourceAC then {bulk_vAC_Re - n.vAC_Re, bulk_vAC_Im - n.vAC_Im} else {bulk_vAC_Re - p.vAC_Re,bulk_vAC_Im - p. vAC_Im}; {idsAC_Re,idsAC_Im} = gdsAC*{vdsAC_Re,vdsAC_Im} + gmbsAC*{vbsAC_Re, vbsAC_Im} + gmAC*{vgsAC_Re,vgsAC_Im}; {iAC_Re,iAC_Im} = if pinNisSourceAC then {idsAC_Re,idsAC_Im} else -{ idsAC_Re,idsAC_Im}; when ctrl_AC then pinNisSourceAC = (vDC >= 0); gdsAC = if (vgsDC <= vthDC) then 0 else if (vdsDC < vgsDC - vthDC) then beta*(vgsDC - vthDC - vdsDC)*(1 + LAMBDA*vdsDC) + beta*(vgsDC - vthDC - 0.5*vdsDC)*LAMBDA*vdsDC else 0.5*beta*(vgsDC - vthDC)^2* LAMBDA; gmbsAC = gmAC*ARG; ARG = if vbsDC > 0 then 0.5*GAMMA/(sqrt(PHI) - 0.5*vbsDC/sqrt(PHI)) else 0.5*GAMMA/sqrt(PHI - vbsDC); gmAC = if (vgsDC <= vthDC) then 0 else if (vdsDC < vgsDC - vthDC) then beta*vdsDC*(1 + LAMBDA*vdsDC) else beta*(vgsDC - vthDC)*(1 + LAMBDA* vdsDC); end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)), Ellipse(extent=[-60, -60; 60, 60], style(thickness=1, color=3)), Line(points=[-50, 0; 50, 0], style(thickness=1, color=3)), Line(points=[20, 20; 50, 0], style(thickness=1, color=3)), Line(points=[20, -20; 50, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -60, 0], style(thickness=1, color=3)), Line(points=[60, 0; 100, 0], style(thickness=1, color=3)))); end Ids; model Cdiode extends BREAKOUT.Capacitor; parameter Real CJ "Capacitance at zero-bias voltage per squere meter of area [F/m2]"; parameter Real CJSW "Capacitance at zero-bias voltage per meter of perimeter [F/m]"; parameter Real MJ "Bulk junction capacitnce grading coefficient"; parameter Real MJSW "Perimeter capacitance grading coefficient"; parameter Real FC "Substrate-junction forward-bias coefficient"; parameter SI.Voltage PB "Junction potencial"; parameter SI.Length P "Junction perimeter"; parameter SI.Area A "Junction area"; protected parameter Real F2=(1 - FC)^(1 + MJ); parameter Real F3=1 - FC*(1 + MJ); parameter Real FCtimesPB=FC*PB; parameter Real CJtimesA=CJ*A; parameter Real CJSWtimesP=CJSW*P; parameter Real coef1=F3*(CJtimesA/F2 + CJSW*P/F2); parameter Real coef2=(CJtimesA*MJ/F2 + CJSW*P*MJSW/F2)/PB; parameter Real invPB=1/PB; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar = if noEvent(vTran < FCtimesPB) then CJtimesA/(1 - invPB*vTran)^MJ + CJSWtimesP/(1 - invPB*vTran)^MJSW else coef1 + coef2*vTran; // --------------------------- // AC small-signal capacitance // --------------------------- when ctrl_AC then CvarAC = if (vDC < FCtimesPB) then CJtimesA/(1 - invPB*vDC)^MJ + CJSWtimesP/(1 - invPB*vDC)^MJSW else coef1 + coef2*vDC; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cdiode; model Cgb extends BREAKOUT.Capacitor; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vdsDC "Drain to source voltage"; outer SI.Voltage vgsDC "Gate to source voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vdsTran "Drain to source voltage"; outer SI.Voltage vgsTran "Gate to source voltage"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter SI.Length LD "Lateral diffusion"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length TOX "Gate oxide thickness"; parameter Real EPSR "Dielectric constant of the oxide"; parameter Real CGBO "Gate-bulk overlap capacitance per meter [F/m]"; protected parameter SI.Length LEFF=L + 2*LD "Effective length"; parameter SI.Capacitance COX=EPS0*EPSR*W*LEFF/TOX "Gate oxide capacitance"; parameter Real CGBOtimesLEFF=CGBO*LEFF; parameter Real COXtimesinvPHI=COX/PHI; constant Real EPS0=8.85e-12 "Permittivity of free space [F/m]"; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar - CGBOtimesLEFF = if noEvent(vgsTran < vthTran - PHI) then COX else if noEvent(vgsTran < vthTran) then COXtimesinvPHI*(vthTran - vgsTran) else 0; // ------------------------------------------------ // AC small-signal capacitance and operation region // ------------------------------------------------ when ctrl_AC then CvarAC = if (vgsDC < vthDC - PHI) then COX + CGBOtimesLEFF else if ( vgsDC < vthDC) then COXtimesinvPHI*(vthDC - vgsDC) + CGBOtimesLEFF else CGBOtimesLEFF; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cgb; model Cgd extends BREAKOUT.Capacitor; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vdsDC "Drain to source voltage"; outer SI.Voltage vdsDCSgn "Drain-pin to source-pin voltage"; outer SI.Voltage vgsDC "Gate to source voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vdsTran "Drain to source voltage"; outer SI.Voltage vdsTranSgn "Drain-pin to source-pin voltage"; outer SI.Voltage vgsTran "Gate to source voltage"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter SI.Length LD "Lateral diffusion"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length TOX "Gate oxide thickness"; parameter Real EPSR "Dielectric constant of the oxide"; parameter Real CGDO "Gate-drain overlap capacitance per meter [F/m]"; parameter Real CGSO "Gate-source overlap capacitance per meter [F/m]"; parameter Boolean gateSourcePinsC; protected parameter SI.Length LEFF=L + 2*LD "Effective length"; parameter SI.Capacitance COX=EPS0*EPSR*W*LEFF/TOX "Gate oxide capacitance"; constant Real EPS0=8.85e-12 "Permittivity of free space [F/m]"; parameter Real CGSOtimesW=CGSO*W; parameter Real CGDOtimesW=CGDO*W; parameter Real twoThirdsCOX=2/3*COX; parameter Real threeFourthsCOX=3*COX/4; parameter Real halfCOX=0.5*COX; parameter SI.Voltage vdsTranEPS=1e-4; parameter SI.Voltage vdsDCEPS=1e-4; Real Cgs; Real Cgd; Real CgsAC; Real CgdAC; Real CpinsGS; Real CpinsGD; Real CpinsGSAC; Real CpinsGDAC; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar = if gateSourcePinsC then CpinsGS else CpinsGD; //Gate-pin to Source-pin capacity CpinsGS = if noEvent(vdsTranSgn < -vdsTranEPS) then Cgd else if noEvent( vdsTranSgn < vdsTranEPS) then 0.5*(Cgs - Cgd)*vdsTranSgn/vdsTranEPS + 0.5*(Cgs + Cgd) else Cgs; // Gate-pin to Drain-pin capacity CpinsGD = if noEvent(vdsTranSgn < -vdsTranEPS) then Cgs else if noEvent( vdsTranSgn < vdsTranEPS) then 0.5*(Cgd - Cgs)*vdsTranSgn/vdsTranEPS + 0.5*(Cgs + Cgd) else Cgd; Cgs - CGSOtimesW = if noEvent(vgsTran <= vthTran - PHI) then 0 else if noEvent(vgsTran <= vthTran) then twoThirdsCOX*((-vthTran + vgsTran)/PHI + 1) else if noEvent(vgsTran <= vthTran + vdsTran) then twoThirdsCOX else if noEvent(vdsTran <= 2*vdsTranEPS) then halfCOX else twoThirdsCOX*(1 - ((vgsTran - vdsTran - vthTran)/(2*(vgsTran - vthTran) - vdsTran))^2); Cgd - CGDOtimesW = if noEvent(vgsTran <= vthTran + vdsTran) then 0 else if noEvent(vdsTran <= 2*vdsTranEPS) then threeFourthsCOX else COX*(1 - ((vgsTran - vthTran)/(2*(vgsTran - vthTran) - vdsTran))^2); // ------------------------------------------------ // AC small-signal capacitance and operation region // ------------------------------------------------ when ctrl_AC then CvarAC = if gateSourcePinsC then CpinsGSAC else CpinsGDAC; // Gate-pin to Source-pin capacity CpinsGSAC = if noEvent(vdsDCSgn < -vdsDCEPS) then CgdAC else if noEvent( vdsDCSgn < vdsDCEPS) then 0.5*(CgsAC - CgdAC)*vdsDCSgn/vdsDCEPS + 0.5 *(CgsAC + CgdAC) else CgsAC; // Gate-pin to Drain-pin capacity CpinsGDAC = if noEvent(vdsDCSgn < -vdsDCEPS) then CgsAC else if noEvent( vdsDCSgn < vdsDCEPS) then 0.5*(CgdAC - CgsAC)*vdsDCSgn/vdsDCEPS + 0.5 *(CgsAC + CgdAC) else CgdAC; // ******** CgsAC = if (vgsDC <= vthDC - PHI) then CGSOtimesW else if (vgsDC <= vthDC) then twoThirdsCOX*((-vthDC + vgsDC)/PHI + 1) + CGSOtimesW else if (vgsDC <= vthDC + vdsDC) then twoThirdsCOX + CGSOtimesW else if (vdsDC <= 2*vdsDCEPS) then halfCOX + CGSOtimesW else twoThirdsCOX*(1 - ((vgsDC - vdsDC - vthDC)/(2*(vgsDC - vthDC) - vdsDC)) ^2) + CGSOtimesW; CgdAC = if (vgsDC <= vthDC + vdsDC) then CGDOtimesW else if (vdsDC <= 2 *vdsDCEPS) then threeFourthsCOX + CGDOtimesW else COX*(1 - ((vgsDC - vthDC)/(2*(vgsDC - vthDC) - vdsDC))^2) + CGDOtimesW; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cgd; end SPICE2_MOS1; model Spice2MOS1 extends INTERFACE.MOSFET; extends INIT.Part; inner SI.Voltage vdsDC "Drain to source voltage"; inner SI.Voltage vgsDC "Gate to source voltage"; inner SI.Voltage vbsDC "Bulk to source voltage"; inner SI.Voltage vdsTran "Drain to source voltage"; inner SI.Voltage vgsTran "Gate to source voltage"; inner SI.Voltage vbsTran "Bulk to source voltage"; SI.Voltage drain_vAC_mag "Magnitude of AC small-signal drain voltage"; SI.Voltage drain_vAC_mag_dB "Magnitude (dB) of AC small-signal drain voltage"; nonSI.Angle_deg drain_vAC_phase(start=0) "Phase (deg) of AC small-signal drain voltage"; SI.Voltage source_vAC_mag "Magnitude of AC small-signal source voltage"; SI.Voltage source_vAC_mag_dB "Magnitude (dB) of AC small-signal source voltage"; nonSI.Angle_deg source_vAC_phase(start=0) "Phase (deg) of drain AC small-signal source voltage"; SI.Voltage bulk_vAC_mag "Magnitude of AC small-signal bulk voltage"; SI.Voltage bulk_vAC_mag_dB "Magnitude (dB) of AC small-signal bulk voltage"; nonSI.Angle_deg bulk_vAC_phase(start=0) "Phase (deg) of AC small-signal bulk voltage"; SI.Voltage gate_vAC_mag "Magnitude of AC small-signal gate voltage"; SI.Voltage gate_vAC_mag_dB "Magnitude (dB) of AC small-signal gate voltage"; nonSI.Angle_deg gate_vAC_phase(start=0) "Phase (deg) of AC small-signal gate voltage"; SI.Current drain_iAC_mag "Magnitude of AC small-signal drain current"; SI.Current drain_iAC_mag_dB "Magnitude (dB) of AC small-signal drain current"; nonSI.Angle_deg drain_iAC_phase(start=0) "Phase (deg) of AC small-signal drain current"; SI.Current source_iAC_mag "Magnitude of AC small-signal source current"; SI.Current source_iAC_mag_dB "Magnitude (dB) of AC small-signal source current"; nonSI.Angle_deg source_iAC_phase(start=0) "Phase (deg) of drain AC small-signal source current"; SI.Current bulk_iAC_mag "Magnitude of AC small-signal bulk current"; SI.Current bulk_iAC_mag_dB "Magnitude (dB) of AC small-signal bulk current"; nonSI.Angle_deg bulk_iAC_phase(start=0) "Phase (deg) of AC small-signal bulk current"; SI.Current gate_iAC_mag "Magnitude of AC small-signal gate current"; SI.Current gate_iAC_mag_dB "Magnitude (dB) of AC small-signal gate current"; nonSI.Angle_deg gate_iAC_phase(start=0) "Phase (deg) of AC small-signal gate current"; parameter Boolean HIDDEN_COMPONENT=false "Enable or disable log"; parameter SI.Area AD=1e-8 "drain difussion area"; parameter SI.Area AS=1e-8 "Source difussion area"; parameter Real CGBO=2e-10 "Gate-bulk overlap capacitance per meter [F/m]"; parameter Real CGDO=4e-11 "Gate-drain overlap capacitance per meter [F/m]"; parameter Real CGSO=4e-11 "Gate-source overlap capacitance per meter [F/m]"; parameter Real CJ=2e-4 "Capacitance at zero-bias voltage per square meter of area [F/m2]"; parameter Real CJSW=1e-9 "Capacitance at zero-bias voltage per meter of perimeter [F/m]"; parameter Real FC=0.5 "Substrate-junction forward-bias coefficient"; parameter Real GAMMA=0.526 "Body-effect parameter [V0.5]"; parameter SI.Current IS=1e-14 "Reverse saturation current at 300K"; parameter Real KP=27.6e-6 "Transconductance parameter [A/V2]"; parameter SI.Length L=100e-6 "Gate length"; parameter Real LAMBDA=0.00 "Channel-length modulation [V-1]"; parameter SI.Length LD=0.8e-6 "Lateral diffusion"; parameter Real MJ=0.5 "Bulk junction capacitnce grading coefficient"; parameter Real MJSW=0.33 "Perimeter capacitance grading coefficient"; parameter SI.Length PD=4e-4 "drain difussion perimeter"; parameter SI.Length PS=4e-4 "source difussion perimeter"; parameter SI.Voltage PB=0.75 "Junction potencial"; parameter SI.Voltage PHI=0.65 "Surface inversion potencial"; parameter SI.Resistance RD=10 "Drain ohmic resistance"; parameter SI.Resistance RS=10 "Source ohmic resistance"; parameter SI.Resistance RB=10 "Bulk ohmic resistance"; parameter SI.Resistance RG=10 "Gate ohmic resistance"; parameter SI.Length TOX=1e-7 "Gate oxide thickness"; parameter SI.Voltage VTO=1 "Zero-bias threshold voltage"; parameter SI.Length W=100e-6 "Gate width"; constant Real EPSR=3.9 "Dielectric constant of the oxide"; parameter SI.Resistance RSB=1e-4 "Source-Bulk junction resistance"; parameter SI.Resistance RDB=1e-4 "Drain-Bulk junction resistance"; protected inner SI.Voltage vdsDCSgn "Drain-pin to source-pin voltage"; inner SI.Voltage vthDC "Threshold voltage"; inner SI.Voltage vdsTranSgn "Drain-pin to source-pin voltage"; inner SI.Voltage vthTran "Threshold voltage"; inner SI.Voltage gate_vAC_Re; inner SI.Voltage gate_vAC_Im; inner SI.Voltage bulk_vAC_Re; inner SI.Voltage bulk_vAC_Im; // -------------------- // Drain-Source current // -------------------- SPICE2_MOS1.Ids Ids( VTO=VTO, GAMMA=GAMMA, PHI=PHI, KP=KP, W=W, L=L, LD=LD, LAMBDA=LAMBDA) annotation (extent=[-10, 0; 10, 20], rotation=-90); // -------------------- // Source-Bulk junction // -------------------- SPICE2_MOS1.Idiode Dbs(IS=IS) annotation (extent=[40, -25; 60, -5], rotation=180); SPICE2_MOS1.Cdiode Cbs( CJ=CJ, CJSW=CJSW, MJ=MJ, MJSW=MJSW, FC=FC, PB=PB, P=PS, A=AS) annotation (extent=[40, -50; 60, -30], rotation=180); // ------------------- // Drain-Bulk junction // ------------------- SPICE2_MOS1.Idiode Dbd(IS=IS) annotation (extent=[40, 25; 60, 45], rotation=180); SPICE2_MOS1.Cdiode Cbd( CJ=CJ, CJSW=CJSW, MJ=MJ, MJSW=MJSW, FC=FC, PB=PB, P=PD, A=AD) annotation (extent=[40, 50; 60, 70], rotation=180); // ---------------- // Gate capacitance // ---------------- SPICE2_MOS1.Cgd Cgd( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGDO=CGDO, CGSO=CGSO, gateSourcePinsC=false) annotation (extent=[-60, 25; -40, 45], rotation=0); SPICE2_MOS1.Cgd Cgs( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGDO=CGDO, CGSO=CGSO, gateSourcePinsC=true) annotation (extent=[-60, -25; -40, -5], rotation=0); SPICE2_MOS1.Cgb Cgb( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGBO=CGBO) annotation (extent=[-60, -65; -40, -45], rotation=0); // --------------- // Drain resistors // --------------- Rbreak Rs(R=RS, HIDDEN_COMPONENT=true) annotation (extent=[-10, -90; 10, -70], rotation=-90); Rbreak Rd(R=RD, HIDDEN_COMPONENT=true) annotation (extent=[-10, 70; 10, 90], rotation=-90); // ------------- // Gate resistor // ------------- Rbreak Rg(R=RG, HIDDEN_COMPONENT=true) annotation (extent=[-120, -10; -100, 10]); // ------------- // Bulk resistor // ------------- Rbreak Rb(R=RB, HIDDEN_COMPONENT=true) annotation (extent=[98, -10; 118, 10], rotation=180); Rbreak Rsb(HIDDEN_COMPONENT=true, R=RSB) annotation (extent=[8, -50; 28, -30], rotation=180); Rbreak Rdb(HIDDEN_COMPONENT=true, R=RDB) annotation (extent=[10, 50; 30, 70], rotation=180); equation // ---------------------------------- // Source-bulk junction: to avoid SSE // ---------------------------------- Dbs.vDiodeTran = Cbs.vTran; // --------------------------------- // Drain-bulk junction: to avoid SSE // --------------------------------- Dbd.vDiodeTran = Cbd.vTran; // ----------------- // Threshold voltage // ----------------- vthDC = VTO + GAMMA*(sqrt(abs(PHI - vbsDC)) - sqrt(PHI)); vthTran = VTO + GAMMA*(sqrt(abs(PHI - vbsTran)) - sqrt(PHI)); // --- // Vds // --- vdsDC = noEvent(abs(Ids.vDC)); vdsDCSgn = Ids.vDC; vdsTran = noEvent(abs(Cgs.vTran - Cgd.vTran)); vdsTranSgn = Cgs.vTran - Cgd.vTran; // --- // Vgs // --- vgsDC = max({Cgs.vDC,Cgd.vDC}); vgsTran = max({Cgs.vTran,Cgd.vTran}); // --- // Vbs // --- vbsDC = max({Cbs.vDC,Cbd.vDC}); vbsTran = max({Cbs.vTran,Cbd.vTran}); // ------------------------------------ // Gate & bulk AC small-signal voltages // ------------------------------------ gate_vAC_Re = g.vAC_Re; gate_vAC_Im = g.vAC_Im; bulk_vAC_Re = b.vAC_Re; bulk_vAC_Im = b.vAC_Im; (drain_vAC_mag,drain_vAC_phase) = Rect2Polar({d.vAC_Re,d.vAC_Im}); drain_vAC_mag_dB = Decibels(drain_vAC_mag); (drain_iAC_mag,drain_iAC_phase) = Rect2Polar({d.iAC_Re,d.iAC_Im}); drain_iAC_mag_dB = Decibels(drain_iAC_mag); (source_vAC_mag,source_vAC_phase) = Rect2Polar({s.vAC_Re,s.vAC_Im}); source_vAC_mag_dB = Decibels(source_vAC_mag); (source_iAC_mag,source_iAC_phase) = Rect2Polar({s.iAC_Re,s.iAC_Im}); source_iAC_mag_dB = Decibels(source_iAC_mag); (bulk_vAC_mag,bulk_vAC_phase) = Rect2Polar({b.vAC_Re,b.vAC_Im}); bulk_vAC_mag_dB = Decibels(bulk_vAC_mag); (bulk_iAC_mag,bulk_iAC_phase) = Rect2Polar({b.iAC_Re,b.iAC_Im}); bulk_iAC_mag_dB = Decibels(bulk_iAC_mag); (gate_vAC_mag,gate_vAC_phase) = Rect2Polar({g.vAC_Re,g.vAC_Im}); gate_vAC_mag_dB = Decibels(gate_vAC_mag); (gate_iAC_mag,gate_iAC_phase) = Rect2Polar({g.iAC_Re,g.iAC_Im}); gate_iAC_mag_dB = Decibels(gate_iAC_mag); when ctrl_log_DC and ((HIDDEN_COMPONENT == false) or (LOG_RESULTS == 2 and HIDDEN_COMPONENT == true)) then LogVariable(g.vDC); LogVariable(d.vDC); LogVariable(s.vDC); LogVariable(b.vDC); end when; when ctrl_log_DC and ((HIDDEN_COMPONENT == false and LOG_RESULTS > 0) or ( HIDDEN_COMPONENT == true and LOG_RESULTS == 2)) then LogVariable(vdsDC); LogVariable(vbsDC); LogVariable(vgsDC); end when; // --------------------- // Component connections // --------------------- connect(d, Rd.p) annotation (points=[0, 110; 0, 100.5; 0, 91; -6.73533e-016, 91], style(color=1)); connect(Rd.n, Ids.p) annotation (points=[6.73533e-016, 69; 6.73533e-016, 57; -4.94602e-022, 57; -4.94602e-022, 45; -6.73533e-016, 45; -6.73533e-016, 21], style(color=1)); connect(Ids.n, Rs.p) annotation (points=[6.73533e-016, -1; -6.73533e-016, -69], style(color=1)); connect(Rs.n, s) annotation (points=[6.73533e-016, -91; 0, -110], style(color=1)); connect(Rg.n, Cgd.p) annotation (points=[-99, 0; -80, 0; -80, 35; -61, 35], style(color=1)); connect(Rg.n, Cgs.p) annotation (points=[-99, 0; -80, 0; -80, -15; -61, -15], style(color=1)); connect(Rg.n, Cgb.p) annotation (points=[-99, 0; -80, 0; -80, -55; -61, -55], style(color=1)); connect(Rg.p, g) annotation (style(color=1)); connect(Rb.n, Dbs.p) annotation (points=[97, 1.34707e-015; 80, 0; 80, -15; 61, -15], style(color=1)); connect(Rb.n, Cbs.p) annotation (points=[97, 1.34707e-015; 80, 0; 80, -40; 61, -40], style(color=1)); connect(Rb.n, Dbd.p) annotation (points=[97, 1.34707e-015; 80, 0; 80, 35; 61, 35], style(color=1)); connect(Rb.n, Cbd.p) annotation (points=[97, 1.34707e-015; 80, 0; 80, 60; 61, 60], style(color=1)); connect(Rb.n, Cgb.n) annotation (points=[97, 1.34707e-015; 80, 0; 80, -55; -39, -55], style(color=1)); connect(b, Rb.p) annotation (style(color=1)); connect(Ids.n, Cgs.n) annotation (points=[6.73533e-016, -1; 6.73533e-016, -15; -39, -15], style(color=1)); // connect(Ids.n, Rbs.n); connect(Ids.p, Cgd.n) annotation (points=[-6.73533e-016, 21; -6.73533e-016, 35; -39, 35], style(color=1)); // connect(Ids.p, Rbd.n); connect(Rsb.p, Cbs.n) annotation (points=[29, -40; 39, -40], style(color=1)); connect(Rsb.n, Ids.n) annotation (points=[7, -40; 6.73533e-016, -40; 6.73533e-016, -1], style(color=1)); connect(Rdb.p, Cbd.n) annotation (points=[31, 60; 39, 60], style(color=1)); connect(Rdb.n, Rd.n) annotation (points=[9, 60; 6.73533e-016, 60; 6.73533e-016, 69], style(color=1)); connect(Cbd.n, Dbd.n) annotation (points=[39, 60; 39, 53.5; 38, 53.5; 38, 47; 39, 47; 39, 35], style(color=1)); connect(Dbs.n, Cbs.n) annotation (points=[39, -15; 39, -21.25; 40, -21.25; 40, -27.5; 39, -27.5; 39, -40], style(color=1)); annotation ( Coordsys(extent=[-130, -100; 130, 100]), Documentation(info=""), Icon( Text( extent=[0, -100; 100, 0], string="%name", style(color=0)), Text( extent=[-160, 100; 160, 140], string="%=W", style(color=0)), Text( extent=[-160, 60; 160, 100], string="%=L", style(color=0)), Line(points=[-80, 0; -60, 0], style(thickness=1, color=3)), Line(points=[0, 80; 0, 50], style(thickness=1, color=3)), Line(points=[0, -80; 0, -50], style(thickness=1, color=3)), Line(points=[-40, 0; 80, 0], style(thickness=1, color=3)), Line(points=[-40, 50; 0, 50], style(thickness=1, color=3)), Line(points=[-40, 70; -40, -70], style(thickness=1, color=3)), Line(points=[-60, 40; -60, -40], style(thickness=1, color=3)), Line(points=[-100, 0; -80, 0], style(thickness=1, color=3)), Line(points=[0, 100; 0, 80], style(thickness=1, color=3)), Line(points=[0, -100; 0, -80], style(thickness=1, color=3)), Line(points=[80, 0; 100, 0], style(thickness=1, color=3)), Line(points=[-40, -50; 0, -50]), Polygon(points=[-20, -42; -20, -58; 0, -50; -20, -42], style( fillPattern=1))), Diagram( Text( extent=[-145, -5; -135, 5], string="G", style(color=0)), Text( extent=[-5, 105; 5, 115], string="D", style(color=0)), Text( extent=[-5, -115; 5, -105], string="S", style(color=0)), Text( extent=[135, -5; 145, 5], string="B", style(color=0)))); end Spice2MOS1; package SPICE2_MOS1P // ----------------------------------------------------------- // SPICE2 Level1 MOS // Reference: // Semiconductor Device Modeling with SPICE. 2nd Edition, 1993 // G. Massobrio and P. Antognetti. // McGraw-Hill, Inc // ----------------------------------------------------------- model Idiode extends INTERFACE.OnePort; extends INIT.Part; parameter SI.Current IS "Reverse saturation current at 300K"; // Boolean forwardDC "Operation region"; // Boolean forwardTran; SI.Voltage vDiodeTran "Voltage drop across the diode"; protected SI.Conductance gAC(start=1) "AC small-signal conductance"; SI.Voltage thermalVolt "Thermal voltage"; equation // Thermal voltage: kT/q thermalVolt = temp/11600; // ------------ // Static model // ------------ iDC = IS*(exp(vDC/thermalVolt) - 1) + vDC*scaleGMIN*GMIN; // ------------- // Dynamic model // ------------- iTran = if noEvent(vDiodeTran > 0) then IS*(exp(vDiodeTran/thermalVolt) - 1) + vDiodeTran*GMIN else (IS/thermalVolt + GMIN)*vDiodeTran; // ------------------ // Small-signal model // ------------------ when ctrl_AC then gAC = if (vDC > 0) then IS/thermalVolt*exp(vDC/thermalVolt) + GMIN else IS/thermalVolt + GMIN; end when; {iAC_Re,iAC_Im} = gAC*{vAC_Re,vAC_Im}; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)), Ellipse(extent=[-60, -60; 60, 60], style(thickness=1, color=3)), Line(points=[-50, 0; 50, 0], style(thickness=1, color=3)), Line(points=[20, 20; 50, 0], style(thickness=1, color=3)), Line(points=[20, -20; 50, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -60, 0], style(thickness=1, color=3)), Line(points=[60, 0; 100, 0], style(thickness=1, color=3)))); end Idiode; model Isd extends INTERFACE.OnePort; extends INIT.Part; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vsgDC "Source to gate voltage"; outer SI.Voltage vsbDC "Source to bulk voltage"; outer SI.Voltage vsdDC "Source to drain voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vsgTran "Source to gate voltage"; outer SI.Voltage vsbTran "Source to bulk voltage"; outer SI.Voltage vsdTran "Source to drain voltage"; outer SI.Voltage vsdTranSgn "Source-pin to drain-pin voltage"; outer SI.Voltage gate_vAC_Re; outer SI.Voltage gate_vAC_Im; outer SI.Voltage bulk_vAC_Re; outer SI.Voltage bulk_vAC_Im; parameter SI.Voltage VTO "Zero-bias threshold voltage"; parameter Real GAMMA "Body-effect parameter [V0.5]"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter Real KP "Transconductance parameter [A/V2]"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length LD "Lateral diffusion"; parameter Real LAMBDA "Channel-length modulation [V-1]"; protected parameter Real beta=KP*W/(L - 2*LD); Boolean pinPisSourceAC(start=true); SI.Current isdDC "Source to drain current"; SI.Current isdTran "Source to drain current"; Real ARG(start=0); SI.Conductance gsdAC "dIsd/dVsd"; SI.Conductance gmbsAC "dIsb/dVsb"; SI.Conductance gmAC "dIsd/dVsg"; SI.Voltage vsdAC_Re; SI.Voltage vsdAC_Im; SI.Voltage vsgAC_Re; SI.Voltage vsgAC_Im; SI.Voltage vsbAC_Re; SI.Voltage vsbAC_Im; SI.Current isdAC_Re; SI.Current isdAC_Im; equation // ------------ // Static model // ------------ iDC = noEvent(if vDC > 0 then isdDC else -isdDC); isdDC = if vsgDC <= -vthDC then 0 else noEvent(if vsdDC < vsgDC + vthDC then beta*(vsgDC + vthDC - 0.5*vsdDC)*vsdDC*(1 + LAMBDA*vsdDC) else 0.5*beta*(vsgDC + vthDC)^2*(1 + LAMBDA*vsdDC)); // ------------------ // Large-signal model // ------------------ iTran = if noEvent(vsdTranSgn >= 0) then isdTran else -isdTran; isdTran = if vsgTran <= -vthTran then 0 else if noEvent(vsdTran < vsgTran + vthTran) then beta*(vsgTran + vthTran - 0.5*vsdTran)*vsdTran*(1 + LAMBDA*vsdTran) else 0.5*beta*(vsgTran + vthTran)^2*(1 + LAMBDA*vsdTran); // --------------------- // AC small-signal model // --------------------- {vsdAC_Re,vsdAC_Im} = if pinPisSourceAC then {vAC_Re,vAC_Im} else -{ vAC_Re,vAC_Im}; {vsgAC_Re,vsgAC_Im} = if pinPisSourceAC then -{gate_vAC_Re - p.vAC_Re, gate_vAC_Im - p.vAC_Im} else -{gate_vAC_Re - n.vAC_Re,gate_vAC_Im - n. vAC_Im}; {vsbAC_Re,vsbAC_Im} = if pinPisSourceAC then -{bulk_vAC_Re - p.vAC_Re, bulk_vAC_Im - p.vAC_Im} else -{bulk_vAC_Re - n.vAC_Re,bulk_vAC_Im - n. vAC_Im}; {isdAC_Re,isdAC_Im} = gsdAC*{vsdAC_Re,vsdAC_Im} + gmbsAC*{vsbAC_Re, vsbAC_Im} + gmAC*{vsgAC_Re,vsgAC_Im}; {iAC_Re,iAC_Im} = if pinPisSourceAC then {isdAC_Re,isdAC_Im} else -{ isdAC_Re,isdAC_Im}; when ctrl_AC then pinPisSourceAC = (vDC >= 0); gsdAC = if (vsgDC <= -vthDC) then 0 else if (vsdDC < vsgDC + vthDC) then beta*(vsgDC + vthDC - vsdDC)*(1 + LAMBDA*vsdDC) + beta*(vsgDC + vthDC - 0.5*vsdDC)*LAMBDA*vsdDC else 0.5*beta*(vsgDC + vthDC)^2* LAMBDA; gmbsAC = gmAC*ARG; ARG = if vsbDC > 0 then 0.5*GAMMA/(sqrt(PHI) - 0.5*vsbDC/sqrt(PHI)) else 0.5*GAMMA/sqrt(PHI - vsbDC); gmAC = if (vsgDC <= -vthDC) then 0 else if (vsdDC < vsgDC + vthDC) then beta*vsdDC*(1 + LAMBDA*vsdDC) else beta*(vsgDC + vthDC)*(1 + LAMBDA*vsdDC); end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon( Text( extent=[-100, -110; 100, -55], string="%name", style(color=0)), Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)), Ellipse(extent=[-60, -60; 60, 60], style(thickness=1, color=3)), Line(points=[-50, 0; 50, 0], style(thickness=1, color=3)), Line(points=[20, 20; 50, 0], style(thickness=1, color=3)), Line(points=[20, -20; 50, 0], style(thickness=1, color=3)), Line(points=[-100, 0; -60, 0], style(thickness=1, color=3)), Line(points=[60, 0; 100, 0], style(thickness=1, color=3)))); end Isd; model Cdiode extends BREAKOUT.Capacitor; parameter Real CJ "Capacitance at zero-bias voltage per squere meter of area [F/m2]"; parameter Real CJSW "Capacitance at zero-bias voltage per meter of perimeter [F/m]"; parameter Real MJ "Bulk junction capacitnce grading coefficient"; parameter Real MJSW "Perimeter capacitance grading coefficient"; parameter Real FC "Substrate-junction forward-bias coefficient"; parameter SI.Voltage PB "Junction potencial"; parameter SI.Length P "Junction perimeter"; parameter SI.Area A "Junction area"; // Real der_vTran "Voltage derivative [V/s]"; protected parameter Real F2=(1 - FC)^(1 + MJ); parameter Real F3=1 - FC*(1 + MJ); parameter Real FCtimesPB=FC*PB; parameter Real CJtimesA=CJ*A; parameter Real CJSWtimesP=CJSW*P; parameter Real coef1=F3*(CJtimesA/F2 + CJSW*P/F2); parameter Real coef2=(CJtimesA*MJ/F2 + CJSW*P*MJSW/F2)/PB; parameter Real invPB=1/PB; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar = if noEvent(vTran < FCtimesPB) then CJtimesA/(1 - invPB*vTran)^MJ + CJSWtimesP/(1 - invPB*vTran)^MJSW else coef1 + coef2*vTran; // --------------------------- // AC small-signal capacitance // --------------------------- when ctrl_AC then CvarAC = if (vDC < FCtimesPB) then CJtimesA/(1 - invPB*vDC)^MJ + CJSWtimesP/(1 - invPB*vDC)^MJSW else coef1 + coef2*vDC; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cdiode; model Cbg extends BREAKOUT.Capacitor; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vsdDC "Drain to source voltage"; outer SI.Voltage vsgDC "Gate to source voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vsdTran "Drain to source voltage"; outer SI.Voltage vsgTran "Gate to source voltage"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter SI.Length LD "Lateral diffusion"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length TOX "Gate oxide thickness"; parameter Real EPSR "Dielectric constant of the oxide"; parameter Real CGBO "Gate-bulk overlap capacitance per meter [F/m]"; protected parameter SI.Length LEFF=L + 2*LD "Effective length"; parameter SI.Capacitance COX=EPS0*EPSR*W*LEFF/TOX "Gate oxide capacitance"; parameter Real CGBOtimesLEFF=CGBO*LEFF; parameter Real COXtimesinvPHI=COX/PHI; constant Real EPS0=8.85e-12 "Permittivity of free space [F/m]"; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar - CGBOtimesLEFF = if noEvent(vsgTran < -vthTran - PHI) then COX else if noEvent(vsgTran < -vthTran) then COXtimesinvPHI*(-vthTran - vsgTran) else 0; // ------------------------------------------------ // AC small-signal capacitance and operation region // ------------------------------------------------ when ctrl_AC then CvarAC = if (vsgDC < -vthDC - PHI) then COX + CGBOtimesLEFF else if ( vsgDC < -vthDC) then COXtimesinvPHI*(-vthDC - vsgDC) + CGBOtimesLEFF else CGBOtimesLEFF; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cbg; model Cdg extends BREAKOUT.Capacitor; outer SI.Voltage vthDC "Threshold voltage"; outer SI.Voltage vsdDC "Source to drain voltage"; outer SI.Voltage vsdDCSgn "Source-pin to drain-pin voltage"; outer SI.Voltage vsgDC "Source to gate voltage"; outer SI.Voltage vthTran "Threshold voltage"; outer SI.Voltage vsdTran "Source to drain voltage"; outer SI.Voltage vsdTranSgn "Source-pin to drain-pin voltage"; outer SI.Voltage vsgTran "Source to gate voltage"; parameter SI.Voltage PHI "Surface inversion potencial"; parameter SI.Length LD "Lateral diffusion"; parameter SI.Length W "Gate width"; parameter SI.Length L "Gate length"; parameter SI.Length TOX "Gate oxide thickness"; parameter Real EPSR "Dielectric constant of the oxide"; parameter Real CGDO "Gate-drain overlap capacitance per meter [F/m]"; parameter Real CGSO "Gate-source overlap capacitance per meter [F/m]"; parameter Boolean sourceGatePinsC; protected parameter SI.Length LEFF=L + 2*LD "Effective length"; parameter SI.Capacitance COX=EPS0*EPSR*W*LEFF/TOX "Gate oxide capacitance"; constant Real EPS0=8.85e-12 "Permittivity of free space [F/m]"; parameter Real CGSOtimesW=CGSO*W; parameter Real CGDOtimesW=CGDO*W; parameter Real twoThirdsCOX=2/3*COX; parameter Real threeFourthsCOX=3/4*COX; parameter Real halfCOX=0.5*COX; parameter SI.Voltage vsdTranEPS=1e-4; parameter SI.Voltage vsdDCEPS=1e-4; Real Csg; Real Cdg; Real CsgAC; Real CdgAC; Real CpinsSG; Real CpinsDG; Real CpinsSGAC; Real CpinsDGAC; equation // ------------------------ // Large-signal capacitance // ------------------------ Cvar*der(vTran) = iTran; Cvar = if sourceGatePinsC then CpinsSG else CpinsDG; CpinsSG = if noEvent(vsdTranSgn < -vsdTranEPS) then Cdg else if noEvent( vsdTranSgn < vsdTranEPS) then 0.5*(Csg - Cdg)*vsdTranSgn/vsdTranEPS + 0.5*(Csg + Cdg) else Csg; CpinsDG = if noEvent(vsdTranSgn < -vsdTranEPS) then Csg else if noEvent( vsdTranSgn < vsdTranEPS) then 0.5*(Cdg - Csg)*vsdTranSgn/vsdTranEPS + 0.5*(Csg + Cdg) else Cdg; Csg - CGSOtimesW = if noEvent(vsgTran <= -vthTran - PHI) then 0 else if noEvent(vsgTran <= -vthTran) then twoThirdsCOX*((vthTran - vsgTran)/PHI + 1) else if noEvent(vsgTran <= -vthTran + vsdTran) then twoThirdsCOX else if noEvent(vsdTran <= 2*vsdTranEPS) then halfCOX else twoThirdsCOX*(1 - ((vsgTran - vsdTran + vthTran)/(2*(vsgTran + vthTran) - vsdTran))^2); Cdg - CGDOtimesW = if noEvent(vsgTran <= -vthTran + vsdTran) then 0 else if noEvent(vsdTran <= 2*vsdTranEPS) then threeFourthsCOX else COX*(1 - ((vsgTran + vthTran)/(2*(vsgTran + vthTran) - vsdTran))^2); // ------------------------------------------------ // AC small-signal capacitance and operation region // ------------------------------------------------ when ctrl_AC then CvarAC = if sourceGatePinsC then CpinsSGAC else CpinsDGAC; CpinsSGAC = if noEvent(vsdDCSgn < -vsdDCEPS) then CdgAC else if noEvent( vsdDCSgn < vsdDCEPS) then 0.5*(CsgAC - CdgAC)*vsdDCSgn/vsdDCEPS + 0.5 *(CsgAC + CdgAC) else CsgAC; CpinsDGAC = if noEvent(vsdDCSgn < -vsdDCEPS) then CsgAC else if noEvent( vsdDCSgn < vsdDCEPS) then 0.5*(CdgAC - CsgAC)*vsdDCSgn/vsdDCEPS + 0.5 *(CsgAC + CdgAC) else CdgAC; CsgAC = if (vsgDC <= -vthDC - PHI) then CGSOtimesW else if (vsgDC <= - vthDC) then twoThirdsCOX*((vthDC + vsgDC)/PHI + 1) + CGSOtimesW else if (vsgDC <= -vthDC + vsdDC) then twoThirdsCOX + CGSOtimesW else if ( vsdDC <= 2*vsdDCEPS) then halfCOX + CGSOtimesW else twoThirdsCOX*(1 - ((vsgDC - vsdDC + vthDC)/(2*(vsgDC + vthDC) - vsdDC))^2) + CGSOtimesW; CdgAC = if (vsgDC <= -vthDC + vsdDC) then CGDOtimesW else if (vsdDC <= 2*vsdDCEPS) then threeFourthsCOX + CGDOtimesW else COX*(1 - ((vsgDC + vthDC)/(2*(vsgDC + vthDC) - vsdDC))^2) + CGDOtimesW; end when; annotation ( Coordsys(extent=[-100, -100; 100, 100]), Documentation(info=""), Icon(Line(points=[-75, -75; 75, 75], style( thickness=1, color=3, arrow=1)))); end Cdg; annotation (Icon(Rectangle(extent=[-80, 60; 80, -60], style(color=0, thickness=2)), Text(extent=[-74, 26; 80, -28], string= "SPICE2_MOS1"))); end SPICE2_MOS1P; model Spice2MOS1P extends INTERFACE.MOSFET; extends INIT.Part; inner SI.Voltage vsdDC "Source to drain voltage"; inner SI.Voltage vsgDC "Source to gate voltage"; inner SI.Voltage vsbDC "Source to bulk voltage"; inner SI.Voltage vsdTran "Source to drain voltage"; inner SI.Voltage vsgTran "Source to gate voltage"; inner SI.Voltage vsbTran "Source to bulk voltage"; SI.Voltage drain_vAC_mag "Magnitude of AC small-signal drain voltage"; SI.Voltage drain_vAC_mag_dB "Magnitude (dB) of AC small-signal drain voltage"; nonSI.Angle_deg drain_vAC_phase(start=0) "Phase (deg) of AC small-signal drain voltage"; SI.Voltage source_vAC_mag "Magnitude of AC small-signal source voltage"; SI.Voltage source_vAC_mag_dB "Magnitude (dB) of AC small-signal source voltage"; nonSI.Angle_deg source_vAC_phase(start=0) "Phase (deg) of drain AC small-signal source voltage"; SI.Voltage bulk_vAC_mag "Magnitude of AC small-signal bulk voltage"; SI.Voltage bulk_vAC_mag_dB "Magnitude (dB) of AC small-signal bulk voltage"; nonSI.Angle_deg bulk_vAC_phase(start=0) "Phase (deg) of AC small-signal bulk voltage"; SI.Voltage gate_vAC_mag "Magnitude of AC small-signal gate voltage"; SI.Voltage gate_vAC_mag_dB "Magnitude (dB) of AC small-signal gate voltage"; nonSI.Angle_deg gate_vAC_phase(start=0) "Phase (deg) of AC small-signal gate voltage"; SI.Current drain_iAC_mag "Magnitude of AC small-signal drain current"; SI.Current drain_iAC_mag_dB "Magnitude (dB) of AC small-signal drain current"; nonSI.Angle_deg drain_iAC_phase(start=0) "Phase (deg) of AC small-signal drain current"; SI.Current source_iAC_mag "Magnitude of AC small-signal source current"; SI.Current source_iAC_mag_dB "Magnitude (dB) of AC small-signal source current"; nonSI.Angle_deg source_iAC_phase(start=0) "Phase (deg) of drain AC small-signal source current"; SI.Current bulk_iAC_mag "Magnitude of AC small-signal bulk current"; SI.Current bulk_iAC_mag_dB "Magnitude (dB) of AC small-signal bulk current"; nonSI.Angle_deg bulk_iAC_phase(start=0) "Phase (deg) of AC small-signal bulk current"; SI.Current gate_iAC_mag "Magnitude of AC small-signal gate current"; SI.Current gate_iAC_mag_dB "Magnitude (dB) of AC small-signal gate current"; nonSI.Angle_deg gate_iAC_phase(start=0) "Phase (deg) of AC small-signal gate current"; parameter Boolean HIDDEN_COMPONENT=false "Enable or disable log"; parameter SI.Area AD=1e-8 "drain difussion area"; parameter SI.Area AS=1e-8 "Source difussion area"; parameter Real CGBO=2e-10 "Gate-bulk overlap capacitance per meter [F/m]"; parameter Real CGDO=4e-11 "Gate-drain overlap capacitance per meter [F/m]"; parameter Real CGSO=4e-11 "Gate-source overlap capacitance per meter [F/m]"; parameter Real CJ=2e-4 "Capacitance at zero-bias voltage per squere meter of area [F/m2]"; parameter Real CJSW=1e-9 "Capacitance at zero-bias voltage per meter of perimeter [F/m]"; parameter Real FC=0.5 "Substrate-junction forward-bias coefficient"; parameter Real GAMMA=0.526 "Body-effect parameter [V0.5]"; parameter SI.Current IS=1e-14 "Reverse saturation current at 300K"; parameter Real KP=27.6e-6 "Transconductance parameter [A/V2]"; parameter SI.Length L=100e-6 "Gate length"; parameter Real LAMBDA=0.00 "Channel-length modulation [V-1]"; parameter SI.Length LD=0.8e-6 "Lateral diffusion"; parameter Real MJ=0.5 "Bulk junction capacitnce grading coefficient"; parameter Real MJSW=0.33 "Perimeter capacitance grading coefficient"; parameter SI.Length PD=4e-4 "drain difussion perimeter"; parameter SI.Length PS=4e-4 "source difussion perimeter"; parameter SI.Voltage PB=0.75 "Junction potencial"; parameter SI.Voltage PHI=0.65 "Surface inversion potencial"; parameter SI.Resistance RD=10 "Drain ohmic resistance"; parameter SI.Resistance RS=10 "Source ohmic resistance"; parameter SI.Resistance RB=10 "Bulk ohmic resistance"; parameter SI.Resistance RG=10 "Gate ohmic resistance"; parameter SI.Length TOX=1e-7 "Gate oxide thickness"; parameter SI.Voltage VTO=-1 "Zero-bias threshold voltage"; parameter SI.Length W=100e-6 "Gate width"; constant Real EPSR=3.9 "Dielectric constant of the oxide"; parameter SI.Resistance RSB=1e-4 "Source-Bulk junction resistance"; parameter SI.Resistance RDB=1e-4 "Drain-Bulk junction resistance"; protected inner SI.Voltage vthDC "Threshold voltage"; inner SI.Voltage vsdDCSgn "Source-pin to drain-pin voltage"; inner SI.Voltage vsdTranSgn "Source-pin to drain-pin voltage"; inner SI.Voltage vthTran "Threshold voltage"; inner SI.Voltage gate_vAC_Re; inner SI.Voltage gate_vAC_Im; inner SI.Voltage bulk_vAC_Re; inner SI.Voltage bulk_vAC_Im; // -------------------- // Drain-Source current // -------------------- SPICE2_MOS1P.Isd Isd( VTO=VTO, GAMMA=GAMMA, PHI=PHI, KP=KP, W=W, L=L, LD=LD, LAMBDA=LAMBDA) annotation (extent=[-10, -4; 10, 16], rotation=90); // -------------------- // Source-Bulk junction // -------------------- SPICE2_MOS1P.Idiode Dsb(IS=IS) annotation (extent=[48, -9; 68, 11], rotation=0); SPICE2_MOS1P.Cdiode Csb( CJ=CJ, CJSW=CJSW, MJ=MJ, MJSW=MJSW, FC=FC, PB=PB, P=PS, A=AS) annotation (extent=[40, -50; 60, -30], rotation=0); // ------------------- // Drain-Bulk junction // ------------------- SPICE2_MOS1P.Idiode Ddb(IS=IS) annotation (extent=[42, 23; 62, 43], rotation=0); SPICE2_MOS1P.Cdiode Cdb( CJ=CJ, CJSW=CJSW, MJ=MJ, MJSW=MJSW, FC=FC, PB=PB, P=PD, A=AD) annotation (extent=[52, 50; 72, 70], rotation=0); // ---------------- // Gate capacitance // ---------------- SPICE2_MOS1P.Cdg Cdg( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGDO=CGDO, CGSO=CGSO, sourceGatePinsC=false) annotation (extent=[-58, 31; -38, 51], rotation=180); SPICE2_MOS1P.Cdg Csg( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGDO=CGDO, CGSO=CGSO, sourceGatePinsC=true) annotation (extent=[-54, -25; -34, -5], rotation=180); SPICE2_MOS1P.Cbg Cbg( PHI=PHI, LD=LD, W=W, L=L, TOX=TOX, EPSR=EPSR, CGBO=CGBO) annotation (extent=[-48, -69; -28, -49], rotation=180); // --------------- // Drain resistors // --------------- Rbreak Rs(R=RS, HIDDEN_COMPONENT=true) annotation (extent=[-10, -90; 10, -70], rotation=90); Rbreak Rd(R=RD, HIDDEN_COMPONENT=true) annotation (extent=[-10, 62; 10, 82], rotation=90); // ------------- // Gate resistor // ------------- Rbreak Rg(R=RG, HIDDEN_COMPONENT=true) annotation (extent=[-116, -10; -96, 10], rotation=180); // ------------- // Bulk resistor // ------------- Rbreak Rb(R=RB, HIDDEN_COMPONENT=true) annotation (extent=[94, -10; 114, 10], rotation=0); Rbreak Rsb(HIDDEN_COMPONENT=true, R=RSB) annotation (extent=[8, -50; 28, -30]); Rbreak Rdb(HIDDEN_COMPONENT=true, R=RDB) annotation (extent=[14, 50; 34, 70]); equation //---------------------------------- //Source-bulk junction: to avoid SSE //---------------------------------- Dsb.vDiodeTran = Csb.vTran; //---------------------------------- //Drain-bulk junction: to avoid SSE //---------------------------------- Ddb.vDiodeTran = Cdb.vTran; // ----------------- // Threshold voltage // ----------------- -vsbDC vthDC = (VTO - GAMMA*(sqrt(abs(PHI - vsbDC)) - sqrt(PHI))); vthTran = (VTO - GAMMA*(sqrt(abs(PHI - vsbTran)) - sqrt(PHI))); // --- // Vsd // --- vsdDC = noEvent((abs(Isd.vDC))); vsdDCSgn = Isd.vDC; vsdTran = noEvent(abs(Csg.vTran - Cdg.vTran)); vsdTranSgn = Csg.vTran - Cdg.vTran; // --- // Vgs // --- vsgDC = max({Csg.vDC,Cdg.vDC}); vsgTran = max({Csg.vTran,Cdg.vTran}); // --- // Vbs // --- vsbDC = max({Csb.vDC,Cdb.vDC}); vsbTran = max({Csb.vTran,Cdb.vTran}); // ------------------------------------ // Gate & bulk AC small-signal voltages // ------------------------------------ gate_vAC_Re = g.vAC_Re; gate_vAC_Im = g.vAC_Im; bulk_vAC_Re = b.vAC_Re; bulk_vAC_Im = b.vAC_Im; (drain_vAC_mag,drain_vAC_phase) = Rect2Polar({d.vAC_Re,d.vAC_Im}); drain_vAC_mag_dB = Decibels(drain_vAC_mag); (drain_iAC_mag,drain_iAC_phase) = Rect2Polar({d.iAC_Re,d.iAC_Im}); drain_iAC_mag_dB = Decibels(drain_iAC_mag); (source_vAC_mag,source_vAC_phase) = Rect2Polar({s.vAC_Re,s.vAC_Im}); source_vAC_mag_dB = Decibels(source_vAC_mag); (source_iAC_mag,source_iAC_phase) = Rect2Polar({s.iAC_Re,s.iAC_Im}); source_iAC_mag_dB = Decibels(source_iAC_mag); (bulk_vAC_mag,bulk_vAC_phase) = Rect2Polar({b.vAC_Re,b.vAC_Im}); bulk_vAC_mag_dB = Decibels(bulk_vAC_mag); (bulk_iAC_mag,bulk_iAC_phase) = Rect2Polar({b.iAC_Re,b.iAC_Im}); bulk_iAC_mag_dB = Decibels(bulk_iAC_mag); (gate_vAC_mag,gate_vAC_phase) = Rect2Polar({g.vAC_Re,g.vAC_Im}); gate_vAC_mag_dB = Decibels(gate_vAC_mag); (gate_iAC_mag,gate_iAC_phase) = Rect2Polar({g.iAC_Re,g.iAC_Im}); gate_iAC_mag_dB = Decibels(gate_iAC_mag); when ctrl_log_DC and ((HIDDEN_COMPONENT == false) or (LOG_RESULTS == 2 and HIDDEN_COMPONENT == true)) then LogVariable(g.vDC); LogVariable(d.vDC); LogVariable(s.vDC); LogVariable(b.vDC); end when; when ctrl_log_DC and ((HIDDEN_COMPONENT == false and LOG_RESULTS > 0) or ( HIDDEN_COMPONENT == true and LOG_RESULTS == 2)) then LogVariable(vsdDC); LogVariable(vsbDC); LogVariable(vsgDC); end when; // --------------------- // Component connections // --------------------- connect(d, Rd.n) annotation (points=[0, 110; 0, 83; 6.73533e-016, 83], style(color=1)); connect(Rd.p, Isd.n) annotation (points=[-6.73533e-016, 61; -6.73533e-016, 49; 4.94602e-022, 49; 4.94602e-022, 37; 6.73533e-016, 37; 6.73533e-016, 17], style(color=1)); connect(Isd.p, Rs.n) annotation (points=[-6.73533e-016, -5; -6.73533e-016, -20.75; 4.94602e-022, -20.75; 4.94602e-022, -36.5; 6.73533e-016, -36.5; 6.73533e-016, -69], style(color=1)); connect(Rs.p, s) annotation (points=[-6.73533e-016, -91; -6.73533e-016, -98.25; 0, -98.25; 0, -110], style(color=1)); connect(Rg.p, Cdg.n) annotation (points=[-95, -1.34707e-015; -80, -1.34707e-015; -80, 41; -59, 41], style(color=1)); connect(Rg.p, Csg.n) annotation (points=[-95, -1.34707e-015; -80, -1.34707e-015; -80, -15; -55, -15], style(color=1)); connect(Rg.p, Cbg.n) annotation (points=[-95, -1.34707e-015; -80, -1.34707e-015; -80, -59; -49, -59], style(color=1)); connect(Rg.n, g); connect(Rb.p, Dsb.n) annotation (points=[93, 0; 80, 0; 80, 1; 69, 1], style(color=1)); connect(Rb.p, Csb.n) annotation (points=[93, 0; 80, 0; 80, -40; 61, -40], style(color=1)); connect(Rb.p, Ddb.n) annotation (points=[93, 0; 80, 0; 80, 33; 63, 33], style(color=1)); connect(Rb.p, Cdb.n) annotation (points=[93, 0; 80, 0; 80, 60; 73, 60], style(color=1)); connect(Rb.p, Cbg.p) annotation (points=[93, 0; 80, 0; 80, -59; -27, -59], style(color=1)); connect(b, Rb.n); connect(Isd.p, Csg.p) annotation (points=[-6.73533e-016, -5; -6.73533e-016, -15; -33, -15], style(color=1)); connect(Isd.n, Cdg.p) annotation (points=[6.73533e-016, 17; 6.73533e-016, 41; -37, 41], style(color=1)); connect(Rsb.n, Csb.p) annotation (points=[29, -40; 39, -40], style(color=1)); connect(Rsb.p, Isd.p) annotation (points=[7, -40; -6.73533e-016, -40; -6.73533e-016, -5], style(color=1)); connect(Rdb.n, Cdb.p) annotation (points=[35, 60; 51, 60], style(color=1)); connect(Rdb.p, Rd.p) annotation (points=[13, 60; -6.73533e-016, 60; -6.73533e-016, 61], style(color=1)); connect(Cdb.p, Ddb.p) annotation (points=[51, 60; 41, 60; 41, 33], style(color=1)); connect(Dsb.p, Csb.p) annotation (points=[47, 1; 39, 1; 39, -40], style(color=1)); annotation ( Coordsys(extent=[-130, -100; 130, 100]), Documentation(info=""), Icon( Text( extent=[0, -100; 100, 0], string="%name", style(color=0)), Text( extent=[-160, 100; 160, 140], string="%=W", style(color=0)), Text( extent=[-160, 60; 160, 100], string="%=L", style(color=0)), Line(points=[-80, 0; -60, 0], style(thickness=1, color=3)), Line(points=[0, 80; 0, 50], style(thickness=1, color=3)), Line(points=[0, -80; 0, -50], style(thickness=1, color=3)), Line(points=[-40, 0; 80, 0], style(thickness=1, color=3)), Line(points=[-40, 50; 0, 50], style(thickness=1, color=3)), Line(points=[-40, 70; -40, -70], style(thickness=1, color=3)), Line(points=[-60, 40; -60, -40], style(thickness=1, color=3)), Line(points=[-100, 0; -80, 0], style(thickness=1, color=3)), Line(points=[0, 100; 0, 80], style(thickness=1, color=3)), Line(points=[0, -100; 0, -80], style(thickness=1, color=3)), Line(points=[80, 0; 100, 0], style(thickness=1, color=3)), Polygon(points=[-11, -42; -11, -58; -32, -50; -11, -42], style( fillPattern=1)), Line(points=[0, -50; -40, -50], style(fillPattern=1))), Diagram( Text( extent=[-145, -5; -135, 5], string="G", style(color=0)), Text( extent=[-5, 105; 5, 115], string="D", style(color=0)), Text( extent=[-5, -115; 5, -105], string="S", style(color=0)), Text( extent=[135, -5; 145, 5], string="B", style(color=0)))); end Spice2MOS1P; end BREAKOUT;