From efc9995164e19e323cb19fbe97ac4665991bbf5c Mon Sep 17 00:00:00 2001 From: Roka Miklos Date: Wed, 1 Jul 2026 13:27:32 +0200 Subject: [PATCH] Added palette JFET opamp --- circuit/ael/mr/mr_opamp.ael | 35 +++ circuit/ael/mr/tubes/mr_triode.ael | 190 ++++++++++++++++ circuit/bitmaps/mr_bjt_npn.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_bjt_pnp.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_capacitor.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_diode.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_inductor.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_jfet_n.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_jfet_p.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_opamp.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_resistor.bmp | Bin 0 -> 630 bytes circuit/bitmaps/mr_zener.bmp | Bin 0 -> 630 bytes circuit/models/jfet/plp/BF862.mod | 99 ++++++++ circuit/models/jfet/plp/njfet.modx | 52 +++++ circuit/models/jfet/plp/pjfet.modx | 12 + de/ael/boot.ael | 7 + de/ael/palette.ael | 54 +++++ mrModels/mr_opamp/symbol/master.tag | 2 + mrModels/mr_opamp/symbol/symbol.oa | Bin 0 -> 29764 bytes mrModels/test3/schematic/sch.oa | Bin 82820 -> 77180 bytes veriloga/mr/bf862.va | 84 +++++++ veriloga/mr/mr_opamp.va | 188 ++++++++++++++++ veriloga/mr/opamps/opamps.va | 338 ++++++++++++++++++++++++++++ 23 files changed, 1061 insertions(+) create mode 100644 circuit/ael/mr/mr_opamp.ael create mode 100644 circuit/ael/mr/tubes/mr_triode.ael create mode 100644 circuit/bitmaps/mr_bjt_npn.bmp create mode 100644 circuit/bitmaps/mr_bjt_pnp.bmp create mode 100644 circuit/bitmaps/mr_capacitor.bmp create mode 100644 circuit/bitmaps/mr_diode.bmp create mode 100644 circuit/bitmaps/mr_inductor.bmp create mode 100644 circuit/bitmaps/mr_jfet_n.bmp create mode 100644 circuit/bitmaps/mr_jfet_p.bmp create mode 100644 circuit/bitmaps/mr_opamp.bmp create mode 100644 circuit/bitmaps/mr_resistor.bmp create mode 100644 circuit/bitmaps/mr_zener.bmp create mode 100644 circuit/models/jfet/plp/BF862.mod create mode 100644 circuit/models/jfet/plp/njfet.modx create mode 100644 circuit/models/jfet/plp/pjfet.modx create mode 100644 de/ael/palette.ael create mode 100644 mrModels/mr_opamp/symbol/master.tag create mode 100644 mrModels/mr_opamp/symbol/symbol.oa create mode 100644 veriloga/mr/bf862.va create mode 100644 veriloga/mr/mr_opamp.va create mode 100644 veriloga/mr/opamps/opamps.va diff --git a/circuit/ael/mr/mr_opamp.ael b/circuit/ael/mr/mr_opamp.ael new file mode 100644 index 0000000..1c881d3 --- /dev/null +++ b/circuit/ael/mr/mr_opamp.ael @@ -0,0 +1,35 @@ +// (setq tab-width 4) + +create_item( + "mr_opamp", // name + "mr Operation Amplifier", // label + "U", // prefix + 0, // attributes + NULL, // priority + NULL, // icon + + standard_dialog, // dialog name + "", // dialog data + + CmpModelNetlistFmt, // netlist format + "", // netlist data + + 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 + + // ----------------------------------------------------- + // model + // ----------------------------------------------------- + create_parm( + "Model", + "Model instance name", + 0, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm", "va_opamp") + ) + +); diff --git a/circuit/ael/mr/tubes/mr_triode.ael b/circuit/ael/mr/tubes/mr_triode.ael new file mode 100644 index 0000000..3a0447b --- /dev/null +++ b/circuit/ael/mr/tubes/mr_triode.ael @@ -0,0 +1,190 @@ +// (setq tab-width 4) +//decl diode_va_ModelNetlistFmt = "%43?global %;model %t diode_va %b%r%8?%29?%:%30?%p %:%k%?[%1i]%;=%p %;%;%;%e%e"; + +create_item( + "mr_triode", // name + "Verilog-A implementation of Triode", // label + "T", // prefix + 0, // attributes + NULL, // priority + NULL, // icon + + standard_dialog, // dialog name + "", // dialog data + + CmpModelNetlistFmt, // netlist format + "", // 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 + + + // ------------------------------------------------------------------------ + // Model + // ------------------------------------------------------------------------ + create_parm + ( + "Model", + "Model instance name", + 0, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","mr_triode") + ), + + + // ------------------------------------------------------------------------ + // Kp + // ------------------------------------------------------------------------ + create_parm + ( + "Kp", + "Perveance of the triode", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // smallKp + // ------------------------------------------------------------------------ + create_parm + ( + "smallKp", + "Fitting parameter", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // Kvb + // ------------------------------------------------------------------------ + create_parm + ( + "kvb", + "fitting parameter", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // mu + // ------------------------------------------------------------------------ + create_parm + ( + "mu", + "amplification factor", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // X + // ------------------------------------------------------------------------ + create_parm + ( + "X", + "Fitting parameter", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // cgc + // ------------------------------------------------------------------------ + create_parm + ( + "cgc", + "Grid-Cathode capacitance", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + CAPACITANCE_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // cga + // ------------------------------------------------------------------------ + create_parm + ( + "cga", + "Grid-Anode capacitance", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + CAPACITANCE_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // cac + // ------------------------------------------------------------------------ + create_parm + ( + "cac", + "Anode-Cathode capacitance", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + CAPACITANCE_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // Tcathode + // ------------------------------------------------------------------------ + create_parm + ( + "Tchatode", + "Cathode temperature (noise analysis only)", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + TEMPERATURE_UNIT, + prm("StdForm","") + ), + + // ------------------------------------------------------------------------ + // gm + // ------------------------------------------------------------------------ + create_parm + ( + "gm", + "Transconductance (noise analysis only)", + PARM_NO_DISPLAY | + PARM_OPTIMIZABLE | + PARM_STATISTICAL, + "StdFileFormSet", + UNITLESS_UNIT, + prm("StdForm","") + ) +); diff --git a/circuit/bitmaps/mr_bjt_npn.bmp b/circuit/bitmaps/mr_bjt_npn.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a0dec46be0375e8cd3e4af9cb9701b574e3cf0ff GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GeG4*903Lf1`r0Z!MFiLIxv8!28ITPh6V

VxUdi;g3cE#6f74P zEH4)nF9*vD7M6>H_~M0Nz92}KAXq;tAEX|nwGd1Yat&_znbT3_Dp9%Rg?Rbmg5oIh z;)Q5@aa6t_l4_8}$g(p91yM{xmj`J@RuAGMn+M{fSqBbzka&4Gm@F?Zhnf(I&W9-g W*;-y+9tu@ZITNBVG!&))!Uq7Dd+FK$ literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_bjt_pnp.bmp b/circuit/bitmaps/mr_bjt_pnp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f11c9518151fab19faabd682b1a7276f9943ac6 GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GeG4*903Lf1`r0Z!MFiLIxv8!28ITPh6V

wpnw2r17mb~kRY;t5FgF@a!|;D p#9hKm@F?Zhq^x$oext`36TheDVPazMtON?C`=p+CD literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_capacitor.bmp b/circuit/bitmaps/mr_capacitor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..963e3ffa1880efce3fa30eab09b8d93eca35bd4b GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GeG4*903Lf1`r0Z!MFiLIxv8!28ITPh6V

;#ea5NJ_(fMc!LeUh2hN3C}0KOmk AlmGw# literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_jfet_n.bmp b/circuit/bitmaps/mr_jfet_n.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71b9874e05c9376a72b9449c80e045a6272aae0a GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GcYkQ2y;WQ00RR92tyvz|g?Z z(7?cO;J^U}hKBzP3=IFlh~fW#5Q_ms{s#&D|IbiP5EPWNmou;zl$V1T<>lq>$I~*%`_i!154&Ib1zESRRwlzz%{i^Fd~ifoD!f)l`Yf1vv;sqyUKr@)?3Z zy}W=O>_MoCnV^tmK!g-T9x4f@K>EQ9I05k~oLf$a&wyk;NEfpGDEx2`4}_ua4F$15 Y7{-SwfcifarT`i~p`kDZAWh}v0OVZg-2eap literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_jfet_p.bmp b/circuit/bitmaps/mr_jfet_p.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7cf94d80b7c39dfb9085eb8be47e901deacb41c7 GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GcYkQ2y;WQ00RR92tyvz|g?Z z(7?cO;J^U}hKBzP3=IFlh~fW#5Q_ms{s#&D|IbiP5EPWNmou;zl$RGkl(Mt4m$QR7 zIQb0a3}AVv;RyBYU=uL-4D29SUI0}ORzxx}b2_S)N>nb$K`0_n*Mr4CUPSPxmoq>- z2$m}^p9ukR+^ literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_opamp.bmp b/circuit/bitmaps/mr_opamp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..230246e17aaac0982a7bf4e50241dbd74ace8bf9 GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GeG4*903Lf1`r0Z!MFiLIxv8!28ITPh6V

eqjxYck`{0x{2VXDAp zz&PdQC>p#a4H`5#4r{Qv(T6Dnb*g7_Z= z1!p4j#mmc)$L;+Y8hzNx!05QQB E0JHz~+5i9m literal 0 HcmV?d00001 diff --git a/circuit/bitmaps/mr_resistor.bmp b/circuit/bitmaps/mr_resistor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..445616ac0ce608db950191bf891c93f60b94dcfa GIT binary patch literal 630 zcmZ?rEn{K;gE9sN1`P%V1_dZ)WMBb{GeG4*903Lf1`r0Z!MFiLIxv8!28ITPh6V

FE1z7E%gYP@i-Y);AlaFMf`WqoKZ3}aAU?W0NDNs&m@ken55&if!_lNd(fMc!LeUh2 IhN3C}04rtmMgRZ+ literal 0 HcmV?d00001 diff --git a/circuit/models/jfet/plp/BF862.mod b/circuit/models/jfet/plp/BF862.mod new file mode 100644 index 0000000..6581cfd --- /dev/null +++ b/circuit/models/jfet/plp/BF862.mod @@ -0,0 +1,99 @@ +;(setq tab-width 4) +; BF862 + +define BF862 (D G S) + + ; SOT23 package parasitics + L :Ld D 1 L=1.1 nH + L :Ls S 3 L=1.25 nH + L :Lg G 4 L=0.78 nH + + R :Rg 4 2 R=0.535 + + C :Cds D S C=0.0001 pF + C :Cgs G S C=0.05 pF + C :Cgd G D C=0.201 pF + + + + + JBF862 :J1 1 2 3 ; + + model JBF862 JFET \ + PFET = 0 \ + NFET = 1 \ + Vto = -0.7 \ + Beta = 0.035 \ + Lambda = 0.035 \ + Rd = 5 \ + Rs = 5 \ + Cgs = 3.5E-12 \ + Cgd = 1.8E-12 \ + Kf = 5.0E-16 \ + Af = 1.0 + +; model JBF862 JFET \ +; PFET = 0 \ +; NFET = 1 \ +; Vto = -0.57093 \ +; Beta = 47.800E-3 \ +; Lambda = 37.300E-3 \ +; Rd = 0.8 \ +; Rs = 7.5000 \ +; Cgs = 8.2890E-12 \ +; Cgd = 7.4002E-12 \ +; Pb = 0.5 \ +; Is = 424.60E-12 \ +; M = 0.6015 \ +; Kf = 87.5E-18 \ +; Af = 1 \ +; Fc = 0.5 \ +; Betatce = -0.5 \ +; Vtotc = -2.0000E-3 \ +; Isr = 2.995p \ +; N = 1 \ +; Nr = 2 \ +; Xti = 3 \ +; Alpha = -1.0000E-3 \ +; Vk = 69.97 + +; model JBF862 tom1_va \ +; Af = 1.0 \ +; Alpha = 1.0e-3 \ +; Area = 1.0 \ +; Beta = 47.8e-3 \ +; Betace = -0.5 \ +; Cgs = 8.2890e-12 \ +; Cgd = 7.4002e-12 \ +; Fc = 0.5 \ +; Is = 424.60e-12 \ +; Kf = 87.5e-18 \ +; M = 0.6015 \ +; N = 1.0 \ +; Rd = 0.8 \ +; Rs = 7.5 \ +; Vto = -0.57093 \ +; Vtotc = -2.0e-3 + +; model JBF862 jfetva \ +; NJF = 1 \ +; PJF = 0 \ +; Level = 2 \ +; Vto = -0.57093 ; Rhreshold voltage [V] \ +; Beta = 47.8e-3 ; Transconductancia \ +; Lambda = 37.3e-3 ; Channel-length modulation \ +; Lambda1 = 50.0 ; Channel-length modulation \ +; Rd = 0.8 ; Drain ohmic resistance [ohm] \ +; Rs = 7.5 ; Source ohmic resistance [ohm] \ +; Cgs = 8.2890e-12 ; Zero-bias G-S junction capacitance [F] \ +; Cgd = 7.4002e-12 ; Zero-bias G-D junction capacitance [F] \ +; Pb = 0.5 ; Gate juntion potential [V] \ +; Is = 424.6e-12 ; Gate junction saturation current [A] \ +; B = 1.0 ; Doping tail \ +; M = 0.6015 ; Gate p-n grading coefficient \ +; Kf = 87.5e-18 ; Flicker noise coefficient \ +; Af = 1.0 ; Flicker noise exponent \ +; Fc = 0.5 ; Forward bias depletion cap coefficient \ +; Tnom = 27 + +end BF862 diff --git a/circuit/models/jfet/plp/njfet.modx b/circuit/models/jfet/plp/njfet.modx new file mode 100644 index 0000000..77126d8 --- /dev/null +++ b/circuit/models/jfet/plp/njfet.modx @@ -0,0 +1,52 @@ +*=========================== +*NJFET Pinout: 1=D, 2=G, 3=S +*=========================== + +*NJFET +*Default N-Ch J-FET parameters pkg:TO-92 3,1,2 +.MODEL JNJFET~ NJF() + +*2N4393 +*Motorola 40V 30mA Dep-Mode pkg:TO-18 2,3,1 +.MODEL J2N4393 NJF(VTO=-1.422 BETA=0.009109 LAMBDA=0.006 RD=1 RS=1 ++ CGS=4.06E-12 CGD=4.57E-12 IS=2.052E-13 KF=1.23E-16 ) + +*2N5457 MCE 7-10-95 +*25V 25mA 250 ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5457 NJF(VTO=-1.8 BETA=0.00135 LAMBDA=0.001 RD=35 RS=31.5 ++ CGS=2.25E-12 CGD=6E-12 KF=6.5E-17 AF=0.5 ) + +*2N5459 MCE 7-10-95 +*25V 25mA 250 ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5459 NJF(VTO=-3 BETA=0.00135 LAMBDA=0.001 RD=35 RS=31.5 ++ CGS=2.25E-12 CGD=6E-12 KF=6.5E-17 AF=0.5 ) + +*2N5484 MCE 7-10-95 +*25V 30mA 175 ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5484 NJF(VTO=-1.8 BETA=0.004 LAMBDA=0.01 RD=24.5 RS=22 ++ CGS=2.5E-12 CGD=4E-12 IS=9.48E-15 ) + +*2N5486 MCE +*25V 30mA 28.8ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5486 NJF(VTO=-4 BETA=0.0065 LAMBDA=0.00266 RD=4.04 RS=3.63 ++ CGS=2E-12 CGD=3.03E-12 IS=9.48E-15 ) + +*2N5640 MCE +*30V 20mA 35.3ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5640 NJF(VTO=-2.5 BETA=0.005 LAMBDA=0.001 RD=4.95 RS=4.45 ++ CGS=1.92E-11 CGD=5.12E-12 IS=5.26E-15 ) + +*2N5668 MCE +*25V 20mA 35.3ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5668 NJF(VTO=-2.5 BETA=0.0015 LAMBDA=0.0012 RD=4.95 RS=4.45 ++ CGS=2.35E-12 CGD=4E-12 IS=6.32E-15 ) + +*2N5669 MCE +*25V 20mA 35.3ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5669 NJF(VTO=-3.5 BETA=0.0035 LAMBDA=0.0012 RD=4.95 RS=4.45 ++ CGS=2.35E-12 CGD=4E-12 IS=6.32E-15 ) + +*2N5670 MCE +*25V 20mA 35.3ohm Dep-Mode pkg:TO-92 3,1,2 +.MODEL J2N5670 NJF(VTO=-5 BETA=0.0065 LAMBDA=0.0012 RD=4.95 RS=4.45 ++ CGS=2.35E-12 CGD=4E-12 IS=6.32E-15 ) diff --git a/circuit/models/jfet/plp/pjfet.modx b/circuit/models/jfet/plp/pjfet.modx new file mode 100644 index 0000000..b910e4a --- /dev/null +++ b/circuit/models/jfet/plp/pjfet.modx @@ -0,0 +1,12 @@ +*=========================== +*PJFET Pinout: 1=D, 2=G, 3=S +*=========================== + +*PJFET +*Default P-Ch J-FET parameters pkg:TO-92 2,1,3 +.MODEL JPJFET~ PJF() + +*2N5460 +*Motorola Dep-Mode 20V 20mA 35.3ohm pkg:TO-92 2,1,3 +.MODEL J2N5460 PJF(VTO=-3.2 BETA=0.0017 LAMBDA=0.00563 RD=49.4 RS=44.5 ++ CGS=9E-12 CGD=4E-12 IS=1.95E-15 KF=1.104E-17 ) diff --git a/de/ael/boot.ael b/de/ael/boot.ael index 671e291..3a0fe65 100644 --- a/de/ael/boot.ael +++ b/de/ael/boot.ael @@ -36,6 +36,11 @@ else de_error("Failed to open log file!"); } +// ---------------------------------------------------------------------------- +// Load palettes +// ---------------------------------------------------------------------------- +load( strcat( MRMODELS_DIR_DE_AEL, "palette" )); + // ---------------------------------------------------------------------------- // Load // ---------------------------------------------------------------------------- @@ -44,7 +49,9 @@ load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mrmodels_include")); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_capacitor" )); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_inductor" )); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_resistor" )); +load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_opamp" )); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_diode" )); +load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_diode_zener" )); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_bjt" )); load( strcat( MRMODELS_DIR_CIRCUIT_AEL, "mr/mr_jfet" )); diff --git a/de/ael/palette.ael b/de/ael/palette.ael new file mode 100644 index 0000000..736e673 --- /dev/null +++ b/de/ael/palette.ael @@ -0,0 +1,54 @@ +// (setq tab-width 4) +set_design_type(analogRFnet); + +// ------------------------------------------------------------------------------------------------------------------------------ +// mrModels palette +// ------------------------------------------------------------------------------------------------------------------------------ +de_define_library_palette( + "mrModels", // palette library name + SCHEMATIC_WINDOW, // window type (SCHEMATIC_WINDOW, LAYOUT_WINDOW) + "analogRF_net", // design type ("analogRF_net", "sigproc_net") + "mrModels", // palette name + "mrModels", // palette label + 0, // insert position + + // ---------------------------------------------------------------------------------------------------------------------- + // libName cellName viewName compLabel compBitmap + // ---------------------------------------------------------------------------------------------------------------------- + list( "mrModels", "mr_pas_r", "", "Resistor", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_resistor" )), + list( "mrModels", "mr_pas_c", "", "Capacitor", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_capacitor" )), + list( "mrModels", "mr_pas_l", "", "Inductor", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_inductor" )), + + list( "mrModels", "mr_diode", "", "Diode", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_diode" )), + list( "mrModels", "mr_diode_zener", "", "Zener", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_zener" )), + list( "mrModels", "mr_opamp", "", "Operation Amplifier", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_opamp" )), + + list( "mrModels", "mr_bjt_npn", "", "Bipolar Transistor (NPN)", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_bjt_npn" )), + list( "mrModels", "mr_bjt_pnp", "", "Bipolar Transistor (PNP)", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_bjt_pnp" )), + list( "mrModels", "mr_jfet_n", "", "JFET N", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_jfet_n" )), + list( "mrModels", "mr_jfet_p", "", "JFET P", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_jfet_p" )) +); + + + +// ------------------------------------------------------------------------------------------------------------------------------ +// mrModels VerilogA palette +// ------------------------------------------------------------------------------------------------------------------------------ +de_define_library_palette( + "mrModels", // palette library name + SCHEMATIC_WINDOW, // window type (SCHEMATIC_WINDOW,LAYOUT_WINDOW) + "analogRF_net", // design type ("analogRF_net", "sigproc_net") + "mrModels Verilog-A", // palette name + "mrModels VerilogA", // palette label + 1, + + // ---------------------------------------------------------------------------------------------------------------------- + // libName cellName viewName compLabel compBitmap + // ---------------------------------------------------------------------------------------------------------------------- +// list( "mrModels", "mr_opamp", "", "Operation Amplifier", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_opamp" )) +// list( "mrModels", "diode_va", "", "Diode", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_diode" )), +// list( "mrModels", "mrt_nand", "", "NAND", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_diode" )), +// list( "mrModels", "z_res", "", "Resistor", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_resistor" )), +// list( "mrModels", "z_nand", "", "NAND", strcat(MRMODELS_DIR_CIRCUIT_BITMAP, "mr_resistor" )) +); + diff --git a/mrModels/mr_opamp/symbol/master.tag b/mrModels/mr_opamp/symbol/master.tag new file mode 100644 index 0000000..e1024da --- /dev/null +++ b/mrModels/mr_opamp/symbol/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +symbol.oa diff --git a/mrModels/mr_opamp/symbol/symbol.oa b/mrModels/mr_opamp/symbol/symbol.oa new file mode 100644 index 0000000000000000000000000000000000000000..e62da615c4d37e3879a4bd0c679062f83de3a727 GIT binary patch literal 29764 zcmYdyRc2&B0$mIY37|Zh;2O3@E)q1fsA*3_{Nk zhtL&JhXz0cFhLU{E?@|uf0#h%6&4Wsge`>r;RT@`!XWeur~_xjK==*`5c)+jgkF#b zp&d#f^c<+WVE%^1zX3#=0VWQkd7$F3_=R#Ara%?I!a;%wA_Mg<+?)r{_z{58511k9 zZa`@PXad;)b=MQ9_y#Dg01a0iXuNqq6VeK(eQTlWR-n;4pytkj>W4ZPV)-aJ8Umvs zFd71*Aut*OqaiRF0;3@?>_dQs!N^F@z(mi$z)&H-NFgyPzbqBzX*LEnh6zjzAQfhY zdIbiCW)K-8BRw-iJp&^n2$vx|GtU^zW?@ix4sFlo9a$C&l2(7ye@;Rh*VU|X;?d26v~Ho9~dN{d|1DU3F;15|A__4XNA&i zP?{Y|b3kcMD9r_>xuGc zN*h9H^nR!bRNNFwn?Y%FC~X0yEupj(l(vS_Hc;9YN`s;s!~}JBKwTVAKL*sL0rkg0 zT_#Y!4Akcab$38rBT%{nr8!V~1En=kIs>IKQ2GL;El|1wr72K)0(C_}=?T=w2lbyp zT~bhg5HuDb$H2e<>Y9T3#fl6J3`z_P49W})3@Qu^44^RpQ2$z;fq?T60ir?q0z`xI1BeEtYY+`epCB404~h>EA7&n@G|WD98e}FZ801Y@ z7=ZE{NG~Ytpy9&+i+7M1NDitNEDj1vm^erd8irsw5FaK7vIB%cVjv7PvjG&|j0_A1 zKyo0ngxSI4ig5mJMpXU_Mg|6unIQEH46V>H$Y6+lObiTXAQB)ez_=_iKEEK5AvLu) zKP@b^s5mn}&#yE$DYXbiD7d63GcTQi!O zB_uO9HMk@(w}2tQkRdUpI3%?wHz2VnF*mg&waC+j!PPa`-z`2qz%j_t*EPg7C^+8F zH5{Z6t_aTYOUzAWh=Oz7@{4l8Lct{|AU0egEHS4vmBG|N!9ODxRnR#ku>Ty3G81zY z-13VQoE=>m!dzWJD!>*(9Fm$6ke``X0yo7B78geFalk9!m}Ou9tT=@)IY0WAN+)Ip8Gpg?{A zVUPqgUz}is0FclLkiVE1HZepoB`|d{O<`bWbGKfMUs09bH6%?MJ_9HC)pyxkWdcxJez?D9kq3H}gor2n^Ae%w$1P~3j8>#;U zYSV(mLG4=*4NC_gHVA|K0-~YD!}AxYjSLcpg)N9p35MB&%M6%2G#(h%Km|Z;Z&29+ z<>GAT5X#@^;RlN!SbV_j+W@s_3zXggrT0MTBT)JSl>PywVfi`$lrR_=7-0Ff0m_H@ z3l|NG7f|~j6h`QLm^h4vnG*uFAEaj>FsSVV>feCU52&vL%2QBxfb$L$GYcyl0|zG; zHxC0Jzkr|+gNUe@xCDcgw2Z7Ag91n^NI5*ug1o~B%5SVpZ0sDIT+G}&ynOsD0)j%q zBCH^tk__@Ndq8UWgFyfnDJ>0cr-R)B%GQjGOklta1}tE}3I=R!ptKGemjJadIxIbsT0T%(4uJd$awI4oK{UA->KzR2 zu=IKcY7wZ93~DRD)I)_~#UH#Jg5_&QsKa3OHF|!A)!T&XX)dTa+)$baO7lT!^l|}K zehWk8MWM79l!p1|0@MRnp!5wWeFsWEfzn@~G^`wl*)IY$PXEl@ypBr=A@3oaU}4L;rmO244Ug^8onxXgjIJ7DV3)uD^S z+EcK0)&f{U0a-o>Feq3-7~~XCc%qkk;35np32j3l^C7~Bb_$da?iYgkh9I**-eqQG z=Y-YYP;rn_m^yHoc@#QE1d47@(gNuNVOXmtAEW~h2IWD}xE3tk!_qs^91e<6iZ^+{mq9F}fD{S1&i zwC({hDZ-#QBF6w|@M36%iNo^M7O00o<+7v?dT zKVanos0|2`Lys3w`UQ!D{0X9A@dF!^gpEVN+D)MGRFFE*I4X#SjZcBbO+kE6dj>>< z#z{dmY)0|Nu790BEVC>Lk?M{h^K z^fy2?wm|6)DBT04r$A|#y|`#tdWO*;zYa$X3TqGs1q(D@!SxlWZUgxj7Ct%9athQR z2h~F$^&okuFsvAYm)EfNAWQ;R`Gg*iu=)hOo)LhSKd|}_*8WDX2Vw3kfI6%MN~4d{ zv_QpYKxx=IyA4qO0VqwVz4!pC4%Tjb0p*{823!j$aFNEtpu&i70tF%iWV{f>1lIvb z^QN%$2P;ouG%j;+i9dlx7_6TRn;!((IhZgg4T3PpP0+Fho*qG7Kx=D3`ir2>D@X&< zm=Z`Wa$63Kk6unqsA7c7`GKMjghA?=6_^!-6+k2d!v_$6*a0R%^%-cc5tbg&(;+N< z;_M%SECHDWP1m^c2dw`=Y(4>%pCDsN9cMyshe4eMPp9bZEl?Q%vImx4VeKx^d@D#C zH0KJUDaEj0f|)~z4^xMWhUE`feE|wDa9DvN9Mmp`YJ}N?9uCxMcfst3S_cnjSbnE= zI|}A+deJa{q0^vXhUIUN95j!k=SK`a+}$7p7#J8pV>95ef<+Wm97^GAH^AZ#HqQ#L zr$CND!Z7>5b|8(@!pdJ*x`(MFmqxOZXeP*yxWW+T4jX8=fbt>8tsp%h3!uWVY8jsH z;NbvG@YE`gVEsneI1a45gq4r5aTS<*9iR?$fzq&f7au4;1WG4BY1ljrq52*+z6-1O zJD~b|pfqS*6exVAK>4tC!5wILz`_+5jh;?md>D;OAGzW#&se_JrVB}e3aZoUV@(xHpD2TyjE>ts!0?C2PJdgrVISi#?`4yI4D6LOH zkwe*>jq^Dj%Fd|3M%?oMc6qVr+-36x$yNxa1$q<9EpP`MAnAn$k43FGRS<;_{*~Y|Nn#LUUvQe{~yE$SqI{SXmtKfM%1}j zkQ!*Y0A)fbP`rWj7|0V;$p4h)bBL>`N5aw}Y#stMuL5dAL%mCOenp>Ofz`9HdKETq z#}7>`uzs{4ln^l!lcfF!N#aBsx%gEub`Pexw4*UjwCK z`{!Oj`EQ^!EF5vsu<`*^7J_1rTpBj+h)%=IhuIHXCkwJ`Bw zNcjTk923oEf=o)_RR90~|9TLHmLm-yHVEV5gUUvbJP6}b1Cj$_m^`_9K;dzkk%0kJ zFM;wlG&_KVQ81{y1J4AU~kn4@+|} z_2}&xNYY_ofQ_4=mus;0B&>Xb^-o~)%CK=3m^;wtZ3CbVfX&|)K>0mT8n!QEEtIA8^|0NDbr>=+nyz=?o?K?T|ng(^q%%b;Nl6Nk;8pwqDZ05Em1b;7WI6l}dc zY~3)d{RUGHwPutW;voPUlLTRqH(=#5C=W3*fk#8ZYjwDpSy-VBKu8&jTu3pqfSQ*e z?GQQWIvge@W>#iK(5f7e6l6|(!~g&PK|B}@VxwbN8xkZAQU~J0Xi&Qn#E0P<|Ns97 zH9%o}kUWSF69>_tb}5Li02#=@zyP8_>OnL}J%|RG4{C>kXi&QpM1%MsEg(LK2JNc= zwPQgvs2vM47e<53ftd@VVdjJACg>Q{Ht0SP5FaGIiGhJ(@&Et-pD{xAgn+^x6ue0c zNenDlAxI{Pfs+ARAb=bP9sdWnT|frVpnib08$o3($Vzhi!yvsN3@b-qi3c`b43eV+ zLyJ|o5zyd(^I`VF$~%xhK;Z`Khr%l^s75FS7lxS+GY3{bz{Urm`<@yaAsQPNLur_O zu<{h{ASeT79<;cJ?~?=7`yeH-@*6e}4x7)09%}(^KY-N1(ksk7LNv(lAbl`(F!NzF zs9ge*Cl!Od4GRP0eHhU2VF2yB0Qn6Ro=9rJ;-K;fBo4C^8irsw(0l<*4x|sH7N!nb zejR}L1*{4*y?X#;4@fO&X&?&=3y1<^XqZPw?JuJ;Q|u}M=De;HVV|t0%4FGG+jab!Nwyj zt*m8eVP6YwDsmzKcymuPbnhNW9|$utGO;o;3UM*9GBU9;u`&vYfG8#rkcbdJlL!+R zlbjH%5Gx}SKS-99iC>6|QHZsPU5KlRiLr^Dv5ATC5XS<>NlZ*|iV?y?r8a;Bl{k>8 zLmZbl7$-3?fX?WF`5U$m6O`{k{v#Cbu=X*m{D-xZVeMY@b(yeq4zmZguM^gubbwk2 z8;=fv@?)TM0hET7lb{R?3P;$w446M~(I9_;)Wc|4`31|r=rrt{9*`bv7?d7C7$gTv z2OxeOBY5Q^I8Dev3g;7`Ivq661foHC0+bh^WehkUf%vSfkUh>IZ-OvX9%MWigWLx$ zJHP}31A2J@Rs^cwp$w2)piI0JEWBXrSwQ6hs0#sd14tvx9H_O3{sc?`R07>Suyg^= z3=9kmuyJ=-y$DMuFneb}&6@+I!J){&z_0|$hppF#t;>h)feQfz3gmA5eeqSH`q80%g;Km`%BJO_mbOdo6=K5RV@OdOdefiTD{So#97L1_gP zBup%99H2A>xe;dx0|7i(VuB0(^n>NF~k5~3=d5wpptipVz4)c zCIN0@kU;Pa6~Iq3AV5VRNCtrB7wJ(j8UmvsKsW@T^$>`v#GgJ?=Iv{?o2Zz7uo4Gwra40iqtsF?#E`2kh> zAPrE3Pzr7i%v_keVc`mEZ$i(XX@HpvG71^P^ugLo;JAX0GlA5>+SQ5maFBaoeg~NYl83dgKzwK$3%vFObXEh*oeT|WkRcTq4N?rk z4Pg-R2L)gnrrrl+FarYvs0|HjpFz1e!ykR#0lgiK-hPIe59=Sn+My9pi(vgF*tk*- zR2;TWZ~~MMYj?xkjf;lGGmM6%Z&*CT^uf+K0tF22Nu4NsYM0`SbiY4oT1h@D9Ft)w^DH%RaWl}KYnXj7b+EhwQ;#d1!ut7y#sgsM@nPW&3t!m&FWCGU%v~B#hv-0Q*t#DR zC?B@Y54NrkcAi2CR35gTkJxqmOQ0Tx&AY+<4GnyBJ}f_=mwzxmx_Ux<^zl1bd_b+I zI|Z^Igh3Xg=Rc4*2!rwN;CkeuV9(0VfIu1_s#rS=f46*m^$LKAJsHcYp`w zNf^(84Dh?iVjeR1jL7`L!m%(J|HtddO&JHY>)!3vfdu%~w7%?z3jN;KS7zt?rRtJFc2%&rd${VA2Gz3OM2*C0MsM3J8qrufP zD;opDJLniUNDh>57#Lt9{*aIX^>L^%o`^pFOKHCbYsfVo(11;wO zVS?_1IT#vnF#Uwqmx0_0!Z3Sr(V+AKb2Eqrxd((nY><9X8wSLNVVF6vc^S}H8K`Lo z(*t!T&UP!vOb|wIm%_%oVdlc_3xMqdfQ?JS&iRL}-$I{nfb|Dq?!-kyo2TG&@j-rr zsrv!qfX=Ijg*%i_ECo7G282QC!Tv-$!vlP@2k3xF2GIGE44~sB8N|dTz*?Sz_LG9< z8W|w#I~f#6h9GOf800^2$pDQQQu|4i=6A3oNFZS051S7HrAttM2sSPV%crn(1N9bM z7#3YHb71KSHqJN^;+6(z|Da(flz$FNL(idZfY}c&a3OLiB+PtJ_<|&0{Sc6QL44SJ z6lk6g#D`w<#{erwVCy-y!&e3tMm|O%Mq*juHEah!c7yb9V%WsM w#Rwunm>3pBKd7Dtx$(q5Jv}{a1f(ng+XGU^#>URZhK+#u4>Zrg0J=XE0FmmCd;kCd literal 0 HcmV?d00001 diff --git a/mrModels/test3/schematic/sch.oa b/mrModels/test3/schematic/sch.oa index 2cc0d4f32cb9ec265da029d6e529e02dca0d3b94..aff5ff6b189245489021d3f96c42922948ebd095 100644 GIT binary patch delta 15045 zcmZo^XZ>@FWy1=_`WAKuFqi?QEkwawh6Q>M`h@|6zF`HSCpbgtVhFvV4nlKuLTH02 z5coCogjQGvp%1Kv(ElMI=zqr>h=9R+2n`Yc|Np@!RQ`#t5Prc=2rcm!LMt#a zf*BRM5PHt!N~Um62_~>0g9wCTV1d#pk`RUmRQ?SogujCWLNh?UtH2H6M@*Jv)@M56 zFxiXQPGSW!M393OLWgKW=*@+pij12#FyH5xynt81WdaiegOQP*nW0{RfuR{h350K8 zWCYo<)`>27MG+J6*G9o2NdNer5Z9MrWD5)rR8KM=|P3`iYs%I@^fG+ z7Geo-!i5=eVWYFTD-suhTtlbDp6qr?!DpOjx; zlFwjhU|^t-?NP-LT#{d43+EY`G8pI?DipXeINL%Qh6;He3_iACDn33XHK{Z`-ZQtr z$IaD0EsX)n$^$Wivoi}q@=FqPT=Px;N%6L zMJDet($Y0Ex3ILbwz0LdcW`uac5!uc_we-c_VM-e4+snj4hanlkBE$lj){$nPe@Ff z{M^WY@&_Xort=(=KNz`8G8SWEV3-_Z?8l_QFnNu!O0+yfAVUB{978NaHbWLe1w%PQ zB|{ZM8$&z8e1>@p3m6tMurf?zoXWVKaUJ6x#@&o2OpZ)WOtYD0F|A-)&UBvX9Mc`9 z+e|N+UNC)Q`pU%2%)~6f%+D;#EW^w&`Mk0H2 z-!M~(;*|U?fgeXOA*(>;AE{NBz2t(*QG7vgN5kkLFh0q^VCs+N^H-zRy4m7$0 z8W1oV%4Oi;n!J#?j<11*fdPakGcYhHvP|Z4QgP;C;AKc))MAonU|`^95MU5w5MmH! z5MdB!U|>*TkYWJUv(gMQ46+Pz3`$@p=rhDKsxhcDXfQA^XfVVuXiYA4imcaWh+>Ea z=QB-)c!mUqLluzQ9A`Mez`$^V;X1=9hO-Rkz`?-Ic!`05;R?f5h8qkg8O*LR++?`LAj5Q; z;Wop41_p+E409PCF)%PZVPIf*#*oM;&iIPqHN$y^HwrMTUUstS38rvHF(!Q`IVJ`MDW)ro3=E2(WDj;CjL>G9!z|0B%cRHjm&t(X2%{d8 zA(Igk1A_^Z9g`W8C6g6c$2CS{CVM7RCL1OPFyEQUpUIWUgUJ)jb7OL1@?r923Se?! z@?#2Q3Swel2w`OkWeQ`Oe9mnhQ#jM)I(MC*U?v8J<4h-*PBNWhI?Z&3={yqy!$qdE zObiT{m@YG2VYJ^9<&h%(Iz$nHd%e;=6 zfnfvlYUWMMo0+#UZ)IM|yq$Rm^G;?4hMmkunRheqW8Tlqz;KXx5A$K>Bh1H{k1_9J zKEZsF`4lq)!zt!#%x9R-Ghbk4sAssue3tnN^Ht^>%-5MuGv8#s#eAEYf#EjubLP9u z511b^GcY`6zQ_EO`5E&|<`>L&m|ro!W`4uW!0?9o2lG4TkIbK#85q7Wzi0l&{GIt1 z^H1it%)gocF#ly{VED_-$?~6>iG`Vkfq|8UfrXuggN2)gi{&3P4+}2~9}5EmAB&n4 zivWu-iwFw?gBXh-iv)`#iwui23qOl2iyVtQivo)xixP_<%j6WVJ)3iUG}zhafQ#^n zlMO=@CvRZp+k7f`E#u_FVZN+$nN=CoCX0qA*Q+x`GDIYy#(YkO|uvb}%epn8YB&z|A1Y04fM4Gi+oyz;KXZ zI>QWb?mxCUG-5H6)^UcZj7kjC8K*J!GAJ`LFeor7GAS`BGpR7CGO005Vo+w-!?c)D zl1YbY`U6o$kC6Xm}8h@nI|(%VFD%UB<2}RGnr;F&1N!S_{;E*!H{7NQ!;Zda~|^oriDzP zL|x3hlxZ2$a;6nbh7A817#NKhSea{?>zM1A8<-gxnHbM9oMA9x*vPbrX){wJa~E?r z^9qI@=04_r<|)jRnI|w$VxGvbk7+;C0j7gY%NP#TGwo%X$ZW!Jn5l$$0rNs;P!0xV zfMv{Qn9eetV>-`d!obSN#%RiLfoVDOM&?b-pqvcK0Na^wGTmaj&2)#!l!2X*gVBuP zF4GR?L(GSnK{*HRwn3TG5`;Y6tgt546`h=6@wt75TiAN z95XMAIEw^}k|47(GbjTf68~hL_&u9N5)GLqo2T$?4o;3_?kjk&%(njm3?HgAD>$SvlC)I6y#`U6%_)^YQWVO)gI} ztrrjw5a1W!=LgYXEF>f(Bq%5-0-_;UL_|bHSXfvNM1!%In3$NTsHl{Lgan8Q#@gcI z;u2C)ATbFrkQ9@Yl!5~p85tRAX=!;mIXO2sHyIf)AuB7ZC84IKuI}chDX$@~0S0cW zswyhV%F4=0N=izKii(N~3JMBta&m5yL(_e^-3;{f3=NHpINaPOuT4*qaIixH_V)Jf zP6=L4jEszv4Kp+*J7jQqxqyMItAm@Hn}fTXgS$I3^F$Ds?TSq}aWMouS3iv7;9%fjK(IhOUT{&%$-s&vj;?}}0VL0gq8FPQka-Ak z1dD@#Bc6em0b~qF2?!%35iE!bkTuvZez{>zqfzSnEP39=j*ld+s#l#KrB*;@7 z44ji2ON4nqx?tu_UXUZT`A2>qBPU1|NGI#$gSo1c6AIZTKgd>^JRyf|vO$i_WPw~h zB$~wtq!Oe9Gw?uu!s?!!B8Pg2GeDL@SPTu=l!D|z7~y@=tpn)?VH7j!8%T3A$N&&V zF@yp$R3Sl+?i&c7p#f^m04-8=7gymI5>=2Xw9YQ+m9~uQ>@hMk<;~AYjwp+^VPL469JN?+vU!yX6NB>P z*eZD@pNP$MReJ1<%99sX3Qs=JsLaBkz@WJKd7~s_J*3IPz_10}bYWmP1ErrpX;5nl zWHk%4m&605L5(7iIBfjv544vm0_~mZKxr2!9RsCHptJ&HkWP@n0>WUhfzp!`DhwDk zCLe6J=llY)fPsPG%Vfb8^~o2SIV52nMhU14)G-Van*&>z8F}~_z++(yd<+Z>lM`BX zg6bd&Pk_RWm6cUbUX_)VRbEd|o)z3v1dFq9^Xtl~$e5aYIr`XV7l2F#i!-AFus8$5 zWIhww$=_Q)*1!4x|365~hJgXxGXvFcp#DnBzyJRwxEUCjm_R*01_qCR|NkfOF)(~# zWMKI4|Ns9hfB*k4;ALR=z{tR0!^*(m%gn%VinSsIN z-~azh{`~(h!^6N}!py*MgN1=1=kNdj0(=bh;I8EwQ2X}J|NjcS3=BD-E(j|F!|F36Yn5?yyYx0G5p+r#7 zGJpe&lT)0DnVp%Fm5GUoiJ5$HP~!jzPj>E51?K{giQwuTPB1bsFflNMF)}dR*xcIT z&*(gfiIIt)iA#td&R}3j0mTvn#ED48f|v}sAq)%-3}910CV>V^Cr>DmWoBq#*eu@_ z$-?Nmxw5aCk@WyG1B1fkpZ(QrCs;vIG`VWR8OFPl-6ys($wh2FH*pb2W#P2{O!a*X z3=AL)ii|3#%^0}BHy0~-T7xGLfTx7&Fc_`t1j(C~sJ zcvwLUI?Nye%CHPd3dEa)sgdC9D`jLegRW}7Lp3NnjJ%S-bL$?^%wa!bleNy^G7$;ip@ z3o%PF^GnM~PhL6OxSokYlBtn_iGhhhl7WfAkRg(RiNTlQB!f6ZB7-mkH-jQWC4(kI zDT6hGA%i~yH-jfbFoQOOH$x*sI)gZaGJ`CGD5ESxD?=fJDZ_LIb_QJrCI(gpCWh4v ztPF~bAaj>9>|`)x!Q#K6rE&cMmg%D}{MpMi;? z87#uYu#tfmqyS8sf>}%qI~fESmNGCgs4{RfFfq6@FfnK|R5FM&a5Btf$Yu~{oXyC< z;L5b zhLx3vfq{W%vh8B&kefH(J$?7$-Ln@jUOWYrJD>!{!N|?X$tc3W!^q7D8cpS5WMvd# z08glZb0;Gs<19Ny6GlcZM$qUPRE(L0nTZ*cVOb^{tTk}}6;?Wb{{O$h$G{-K!ocwH z@BjZh{`~*1#>c>LoS6YMVhYXw44|Ru29W&pKmY$<;bmZ0#>~JlIbgYh07&rWpa1`_ z^Fm6o$sd-B2)g|J|G$BcfkB&vfnkpy1B1%siEHI2%bnwyuEE0iV)6xjp3NpJ_b@TC zPX4%Bp7rL7cTb;97G2}b%FN2b%(OXmjXERK9>2|fYn7NZ71SX4s=*LKmzY54IhGK5 z4=6{2LU8g$Vfo2F)*EPSfmS*R(3zkwpa27n%t0$H1?U()c=BiR2IlE$0z``JbCpWW#bFnCc7=t*21Oq5%D==_EhY`8J za@^2d&B!3fAkVCMt25JhJ}pm3~CG#;3132KAR=# z0~xp(f*7VTOlJ^g2xbUj2nCN@U@KjC7?Qx_6{!qq47?2K@DYm~20o;+hM&QN!Ihy1 zy}V(l29I~tG1M~%GBhv!`OhKo*?+QP+rf?@7t^(~h2 zvl)&s7&Evrm@v3A2(!&#mZAT2E|Jy~R{3X`<-WUH+*EX>T((vzdMsxYyNO z%P2N^-qwGD^$aXXP?522^V)43j7$tHllO1epL}jRhcPRIIwK1MI|C~igEBm{HFKhr zk%8d{0|Uc!Mg|69Mg|7!|NsA2|NsC0=48bk^7Yr5AfnvN3=B&c85p#g85s66GBALq zAafZ(Q+*5!9Z-HP1B4Hn3IM5>VS=bPXJTLg@qaTiFo4<+pa~%mznPJNVJR~M!#t3! z3=9k)_0bFr3?TK^3=9mv85!ys?l3SgfHZ&vbQl>JKnmQU8n_u57>+S8FsLy?ERbdZ zjTbU7fTm7C7JynyR?G|x;S3OYkosxN2=yTIKpp~_2U5R<0pj5EQ1z1;lp!u$$H2e< zasbEzkcA)%Kzxt|(UTK*+B2@0yl|&KW6k7`JMS}2nS62A{Cd#1b^rhW|7AhL;s5{t z_W_M>|NsBrk%NKZEHeW`6SUa{;)6m3#0QmnAbvM91H%>$NGS*6-(`ZR|G~t-0OId~ z@RRC;$KdUzwSK zA@l$L|1Og+?$KwQF`03%zGDL`1A_xI14Aq;0|N^)14BP61A{y>1H)D(28I`m3=AOK zn3)(Dlvx-U^cff!Tv!+wyg(uI|NsA}|NsBro?N(Bo^kr*iF>tO|NQ&^AJmQkwd2;Z zGBALG_&h5ELlPqcLlY|l!&62EhQ*-rj){Q*Bp=VjzyOj5wIf0DXBik67Efl}CvNM^ z!oaYEiGd-7g@Iu|69a<{3j@OpMh1ph76yjRpk^%#14B6@1H*h428KzD3=AOk%}fjo zTUi(w=1mUW*DSk z%9zjp{r_JI<%5cLtN;K1Px}wapdj->F%L@qpk81GV?6@{Xx29aRJuc(FiqSH3?K`F zxfvKh7JT7mU;tUr%mL}CZQ@{H(Ek7bKZyVS-~a!7oD2+H|Ns97sh{!h|9_BvP{4!u z<^TTwf6L9lFbR~*xgq*N@*w>n`SBW^*$z`2PL>zlWQFA>;4={~*53-~a#ra5FHt|NZ~} zD=!0sGXq0C1E^^n$H2e<5li0}6Q|9?=P2KD7Z5eK3dure@!A`r$0l?|W>=wW4G zI0r2&KwWo6Rt5%8gn^PStZBXJ&;S1*KBy_~$;-fS`Op9Vpr-nb|C94hX)*anOrCY> zmk>jP3Ih}>sDMW{H!nNQ#>fH^o4nzS6_X0X<~L`27^gQVGa}X?IZy65r@&bQX%aCk z0Ix%Oa883$1r&)43=BDwFAD2Vwm7fB7%_Pvv-#wLG8W0z5Y-KikQPe=bRial0ZDIHN41GNTrw38NjOE2B4K z5Mv}`0%ICu4r38xC1Vp~594G;28Nl8^TFO+#<-So3*$bbh4raX>mJcRZJ$yyCeU6EElFy2n~9yo`*3lN%pTpX~QsX0qRN zHBg>s0FAKEVr5`pX54)5xhEs*Bn8GMrpY=lLwJ}jISTPJG8HrFGI32_`chYeX`c`) zqmYP@1|w*ghn2CJQOJhLhLMpel<6>&4HG{jqmVK)qma#Jj#nCtn=M}3G1faW3dsqv zGBU9`GcxHOWMtZMkV%A*QAn|Q%#WLG(Ff)E&PoKfY7%=?+7h{1SD9k|72~rChEn%I$kdIM$dIC42#^g7vIkxw3 zGxjh|eo(_QU51Zw8>8p;%Y2M$87EH=W|`h1z_PBG8e02`Ie&?1dP42KyeKZ_8UZXm)~!@|S3jbZx+5k?Ni`bmtl8747KWSqh{ zl@XNqXE4rWoW(esaSr2L#(9kM85b}vWL&~HiE#P4^_cXT48SY1jF}cOnlhO&nKM~{S7%u>*)Z8M*)iEOIWd8jj<_-{ zWpte!*fP1^m1zRgL{Lg+n8Y-dX&TdXCdkSW28QWObD8FWW#%(2Vp`0!gbA`@#GYv- z(<-LbOlz3dGOc4;&$NLFvPxtN(*~w(Oxu}uFzsa8#k7|RwmRex({3hEm-qP$QX!xJ`08v$&q0s{mlOy4KPsL2VQat8@bKOn{ETb}@(>jbHROEDyXA%c%!kuQ?~ zvJ~Am6R<^CrNA->ixDiaN2I6Q%QA9o7nWf>!pPac05TzgAz}IhSw?BF7eW3}n7&1d zQFZ!$DMq>J?sAM*7!xK>C=usY0GkX_&@jC~no)Xsz8qtPF&P0dokf9By&hx`0+V43 z14Vk`7!;5KmHg;IgfD~zB|)hK9M(qD?WGwdrr!qz=6)r{gVQyb7 z8MB$EFhZtWCkQK8f<`ex`C$%-U|?WqfYv1`AUzBW3?86$xC{&o2cW$Q=)3?!2dE2U z*a6iAtBF8K8YF~HSAa7K14GMXMG@=i7nB(#1Y!M~-5~W03=ERfKdLZJ76nyYP!Z6~ z2&gY|pkeYtX1VFxRT(p;&sSq)^|;0anO#g_%4O7KOl0zBI?S`0XCluwhKWqSn4WOH zVS3JVm(!mKlP|>pf{jcqO!FnOIHxygGkVp7M5Gu#F@0l#uwb%Rp?vDdWO2@yXkluE zn)!|C6O?teo(ZQE6K*HK^wcteoC`9povDkdm+2}~6%!u|7t1$h2ziyMf~k}VTstUV0a_#o2- z7$KUpOc*7m8yGSMP2XV3_yNQc2zkl*gL4mL@yP*c$f^Wz?gjZFgo&M3ieWm>D@Ivn z5dRU|M+p!MlMj-WVhCaKWn_{3A~Ah~HKWJ$1RF-7dYDiM*Z_z!2nmzPz$s&eQ|5~V zi=;1O2sCp;%ma~D%xE&xznU}33c##_Nlq8AVw9L}Wx*&U2=a~;1I%N8IAy0ZS}=-E zFS1~)W6NZcVtB;}@r<1%V+zwPiRnu$86$W>7E4G#{0i0}K3&0zQOE{n54yu;nNejP zv4I>52}>ykJ4puSM{LvctQcq5qB;jNoYCc_7(k8$nI^>$0?DMZNMRrWjfxG{j8RIc zZh+{4kT99)IyQ_NY_iNBB_6R&zhlEF0gpa(A0grzcf{h>gIfkIF{m;iEW)j6ngyc- zlN7^r16#%>QE+4LKp-SVGeFkpvQH0mVq7-;ygegi)h;{xQukxf~gFrt3H` z@=ibC!00tS#EDU0dW;ie*K|93M&9Wf4vbdQ3!E4;x!KvFX0fwP|Lw%s3hptcyDBpR E0OwBlxBvhE delta 14166 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 VTO) begin + id = 0; // Cutoff + end else begin + id = BETA * (vgs - VTO)*(vgs - VTO) * (1 + LAMBDA * vds); + end + + // Transconductance (for noise calculation) + gm = 2 * BETA * (vgs - VTO) * (1 + LAMBDA * vds); + + // ==================== Package Parasitics ==================== + V(d, di) <+ Ld * ddt(I(d, di)) + Rd_pkg * I(d, di); + V(g, gi) <+ Lg * ddt(I(g, gi)) + Rg_pkg * I(g, gi); + V(s, si) <+ Ls * ddt(I(s, si)) + Rs_pkg * I(s, si); + + // ==================== Internal Resistances ==================== + V(di, di) <+ RD * I(di); + V(si, si) <+ RS * I(si); + + // ==================== Drain Current ==================== + I(di, si) <+ id; + + // ==================== NOISE SOURCES ==================== + + // 1. Thermal channel noise (dominant in JFETs) + if (gm > 0) begin + I(di, si) <+ white_noise( (4.0/3.0) * `P_K * T * gm , "thermal"); + end + + // 2. Flicker (1/f) noise on drain current + if (KF > 0 && id > 0) begin + I(di, si) <+ flicker_noise(KF * pow(id, AF), 1.0, "flicker"); + end + + // 3. Gate shot noise (very small in JFETs) + I(g, gi) <+ white_noise(2 * `P_Q * 1e-12, "gate_shot"); // ~1pA leakage + + // ==================== Capacitances ==================== + I(gi, si) <+ ddt( CGS * V(gi, si) ); + I(gi, di) <+ ddt( CGD * V(gi, di) ); + + end +endmodule diff --git a/veriloga/mr/mr_opamp.va b/veriloga/mr/mr_opamp.va new file mode 100644 index 0000000..c97d5ab --- /dev/null +++ b/veriloga/mr/mr_opamp.va @@ -0,0 +1,188 @@ +// (setq tab-width 4) +`include "constants.h" +`include "discipline.h" + +`define dB2dec(x) pow(10,x/20) + +`include "mr_diode.va" + +module va_opamp(inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + + // default parameters are for a typical uA741. + + + parameter real Aol = 200e3 from (0 : inf); // Open loop DC gain [V/V] 200e3 + parameter real GBW = 1e6 from (1 : inf); // Gain bandwidth product [Hz] 10e6 + parameter real Rin = 2e6 from [0.01 : inf]; // Differential Input resistance [Ohm] + parameter real Rout = 75 from [0.01 : inf]; // Output resistance [Ohm] + + parameter real VRailp = 1 from [0 : inf]; // Positive output voltage limit [V] + parameter real VRailn = 1 from [0 : inf]; // Negative output voltage limit [V] + + parameter real Vos = 1.0e-3 from [0 : inf]; // Input voltage offset [V] + parameter real Ios = 20.0e-9 from [1e-20 : inf]; // Input offset current [A] + parameter real Ib = 80.0e-9 from [-inf : inf]; // Input bias current [A] + parameter real Cin = 1.4e-12 from [1e-20 : inf]; // Differential input capacitance [F] + + parameter real SRp = 500e3 from [1 : inf]; // Positive slew rate [V/s] + parameter real SRn = 500e3 from [1 : inf]; // Negative slew rate [V/s] + +// parameter real fp2 = 3e6 from [0.01 : inf]; // Secod pole frequency [Hz] + +// parameter real CMR = 90 from [1 : inf]; // Common mode rejection ratio at DC [dB] +// parameter real FCM = 200 from [0.01 : inf]; // Common mode zero corner frequency [Hz] + +// parameter real Io_maxp = 35e-3 from [1e-09 : inf]; // Positive output voltage limit [V] +// parameter real Io_maxn = -35e-3 from [-inf : 0]; // Negative output voltage limit [V] + +// parameter real CScale = 50 from [0 : inf]; // Current limit scaling factor + + electrical net_s1; + electrical net_ref; + electrical net_limp; + electrical net_limn; + + branch (net_s1, net_ref) cur_s1, res_s1, cap_s1; + branch (net_s1, net_limp) res_limp, cap_limp; + branch (net_limn, net_s1) res_limn, cap_limn; + + // --- + real Vin; + + // ------------------------------------------------------------------------- + // first stage (gain, pole, slew) + // ------------------------------------------------------------------------- + real I1; + real Ig1; + real fp1; + real Kp1; + real Rp1; + real Cp1; + + // ------------------------------------------------------------------------- + // simplified diode model parameters + // the diodes used in voltage limit subcircuits + // ------------------------------------------------------------------------- + real is = 10f; // saturation current [A] 10f + real tf = 1u; // forward transit tim [s] + real cjo = 10f; // zero-bias junction capacitance [F] + real phi = 0.7; // built-in junction potential [V] + + // ------------------------------------------------------------------------- + // output voltage limitation + // ------------------------------------------------------------------------- + real Vo_max; // maximum positive output voltage + real Vo_min; // maximum negative output voltage + + real qdp; // positive output voltage limit diode charge + real qdn; // negative output voltage limit diode charge + + analog + begin + @(initial_step) + begin + I1 = 0.01; + fp1 = GBW / Aol; + Cp1 = I1 / SRp; + Rp1 = 1 / (2 * `M_PI * fp1 * Cp1); + Kp1 = Aol / (I1 * Rp1); + + Vo_max = V(vdd) - VRailp; + Vo_min = V(vss) + VRailn; + + $display("\n"); + $display("--------------------------------------"); + $display("GBW = %12.3f Hz", GBW); + $display("SRp = %12.3f V/s", SRp); + $display("--------------------------------------"); + $display("I1 = %12.3f mA", I1 *1e3); + $display("fp1 = %12.3f Hz", fp1); + $display("Cp1 = %12.3f nF", Cp1 *1e9); + $display("Rp1 = %12.3f kOhm", Rp1 /1000); + $display("Kp1 = %12.3f V/V", Kp1); + $display("--------------------------------------"); + $display("Vdd = %12.3f V", V(vdd)); + $display("Vss = %12.3f V", V(vss)); + $display("Vo_max = %12.3f V", Vo_max); + $display("Vo_min = %12.3f V", Vo_min); + end; + + // ----------------------------------------------------------- + // set fix net voltages + // ----------------------------------------------------------- + V(net_ref) <+ (V(vdd) +V(vss)) / 2; + V(net_limp) <+ Vo_max - phi; + V(net_limn) <+ Vo_min + phi; + + // ----------------------------------------------------------- + // input bias and offset currents, offset voltage + // ----------------------------------------------------------- + Vin = V(inp,inn) + Vos; // Input offset voltage + + I(inp) <+ Ib; // Input bias current + I(inn) <+ Ib; // Input bias current + I(inp,inn) <+ Ios / 2; // Input offset current + I(inp,inn) <+ Vin / Rin; // Input stage current + + // ----------------------------------------------------------- + // gain, pole 1, slew + // ----------------------------------------------------------- + I(cur_s1) <+ -I1 * tanh( Kp1 * Vin);; + V(res_s1) <+ Rp1 * I(res_s1); + +/* + if( analysis("ic")) + $display("-> IC"); + else if( analysis("dc")) + $display("-> DC"); + else if( analysis("ac")) + $display("-> AC"); + else if(analysis("static")) + $display("-> STATIC"); + else if( analysis("tran")) + $display("-> TRAN"); + else if( analysis("noise")) + $display("-> NOISE"); + else + $display("-> unknown"); +*/ + + + + if( analysis("ic")) + begin + + V(cap_s1) <+ 0; + V(cap_limp) <+ 0; + V(cap_limn) <+ 0; + end + + else if( analysis("dc")) + I(cap_s1) <+ 0; + else + I(cap_s1) <+ Cp1 * ddt( V(cap_s1)); + + if( !analysis("ac")) + begin + // ----------------------------------------------------------------- + // positive output voltage limiting + // ----------------------------------------------------------------- + qdp = tf * I(res_limp) - 2 * cjo * phi * sqrt(1 -V(cap_limp)/phi); + I(res_limp) <+ is * (limexp( V(res_limp)/$vt) -1); + I(cap_limp) <+ ddt(qdp); + + // ----------------------------------------------------------------- + // negative output voltage limiting + // ----------------------------------------------------------------- + qdn = tf * I(res_limn) - 2 * cjo * phi * sqrt(1 -V(cap_limn)/phi); + I(res_limn) <+ is * (limexp( V(res_limn)/$vt) -1); + I(cap_limn) <+ ddt(qdn); + end; + + V(out) <+ V(cap_s1); + end + +endmodule diff --git a/veriloga/mr/opamps/opamps.va b/veriloga/mr/opamps/opamps.va new file mode 100644 index 0000000..9787d53 --- /dev/null +++ b/veriloga/mr/opamps/opamps.va @@ -0,0 +1,338 @@ +`include "constants.h" +`include "discipline.h" + +// uA741 +// AD822 +// LTC1050 +// TL071 +// NE5534 +// OPA627 + + + +// --------------------------------------------------------- +// uA741 +// --------------------------------------------------------- +module uA741( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// TLC2272 +// --------------------------------------------------------- +module TLC2272( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(50e3), + .GBW(2.18e6), + .Rin(10e12), + .Rout(140), + + .VRailp(0.25), + .VRailn(0.25), + + .Vos(950e-6), + .Ios(100e-12), + .Ib(100e-12), + .Cin(8), + + .SRp(3.5e6), + .SRn(3.5e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + + + +// --------------------------------------------------------- +// NJM2068 +// +// .Rout(), +// .Cin(), +// --------------------------------------------------------- +module NJM2068( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(750e3), + .GBW(27e6), + .Rin(300e3), + + .VRailp(1.5), + .VRailn(1.5), + + .Vos(3e-3), + .Ios(200e-9), + .Ib(1e-6), + + .SRp(6e6), + .SRn(6e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// NJM4058 (50 mA) +// +// .Rin() +// .Rout() +// .Cin() +// --------------------------------------------------------- +module NJM4058( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(750e3), + .GBW(15e6), + + .VRailp(1.5), + .VRailn(1.5), + + .Vos(3e-3), + .Ios(200e-9), + .Ib(500e-9), + + .SRp(5e6), + .SRn(5e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// LT1001 +// +// .Rout() +// .Cin() +// --------------------------------------------------------- +module LT1001( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(8e5), + .GBW(8e5), + .Rin(80e6), + + .VRailp(1), + .VRailn(1), + + .Vos(60e-6), + .Ios(1e-9), + .Ib(1e-9), + + .SRp(0.25e6), + .SRn(0.25e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// LT1007 +// +// .Cin() +// --------------------------------------------------------- +module LT1007( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(20e6), + .GBW(8e6), + .Rin(5e9), + .Rout(70), + + .VRailp(1.5), + .VRailn(1.5), + + .Vos(60e-6), + .Ios(50e-9), + .Ib(50e-9), + + .SRp(2.5e6), + .SRn(2.5e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// OPA627 +// --------------------------------------------------------- +module OPA627( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(1e6), + .GBW(16e6), + .Rin(10e13), + .Rout(55), + + .VRailp(2.7), + .VRailn(2.7), + + .Vos(100e-6), + .Ios(1e-12), + .Ib(2e-12), + .Cin(8e-12), + + .SRp(55e6), + .SRn(55e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// LTC1050 +// --------------------------------------------------------- +module LTC1050( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(1e6), + .GBW(2.5e6), + .Rin(1e13), + .Rout(50), + + .VRailp(0.15), + .VRailn(0.15), + + .Vos(5e-6), + .Ios(60e-12), + .Ib(30e-12), + .Cin(8e-12), + + .SRp(4e6), + .SRn(4e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// TL071 +// --------------------------------------------------------- +module TL071( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(200e3), + .GBW(3e6), + .Rin(1e12), + .VRailp(1.5), + .VRailn(1.5), + .Vos(3e-3), + .Ios(5e-12), + .Ib(65e-12), + .SRp(13e6), + .SRn(13e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// LM324 +// --------------------------------------------------------- +module LM324( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(100e3), + .GBW(1e6), + .VRailp(1.5), + .VRailn(0.01), + .Vos(2e-3), + .Ios(5e-9), + .Ib(-45e-9), + .SRp(1.2e6), + .SRn(1.2e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// NE5534 +// --------------------------------------------------------- +module NE5534( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(101e3), + .GBW(10e6), + .Rin(100e3), + .Rout(0.3), + + .VRailp(2), + .VRailn(2), + + .Vos(0.5e-3), + .Ios(20e-9), + .Ib(500e-9), + + .SRp(13e6), + .SRn(13e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +// --------------------------------------------------------- +// AD822 +// --------------------------------------------------------- +module AD822( inp, inn, out, vdd, vss); + inout inp, inn, out, vdd, vss; + electrical inp, inn, out, vdd, vss; + + va_opamp #( .Aol(1e6), + .GBW(1.8e6), + .Rin(1e13), + .Rout(20), + + .VRailp(0.1), + .VRailn(0.1), + + .Vos(0.5e-3), // 0.5e-3 + .Ios(10e-12), + .Ib(10e-12), + .Cin(0.5e-12), + + .SRp(3e6), + .SRn(3e6) + ) + opa( inp, inn, out, vdd, vss); +endmodule + +/* + parameter real Aol = 200e3 from (0 : inf); // Open loop DC gain [V/V] 200e3 + parameter real GBW = 1e6 from (1 : inf); // Gain bandwidth product [Hz] 10e6 + parameter real Rin = 2e6 from [0.01 : inf]; // Differential Input resistance [Ohm] + parameter real Rout = 75 from [0.01 : inf]; // Output resistance [Ohm] + + parameter real VRailp = 1 from [0 : inf]; // Positive output voltage limit [V] + parameter real VRailn = 1 from [0 : inf]; // Negative output voltage limit [V] + + parameter real Vos = 1.0e-3 from [0 : inf]; // Input voltage offset [V] + parameter real Ios = 20.0e-9 from [1e-20 : inf]; // Input offset current [A] + parameter real Ib = 80.0e-9 from [1e-20 : inf]; // Input bias current [A] + parameter real Cin = 1.4e-12 from [1e-20 : inf]; // Differential input capacitance [F] + + parameter real SRp = 500e3 from [1 : inf]; // Positive slew rate [V/s] + parameter real SRn = 500e3 from [1 : inf]; // Negative slew rate [V/s] + + va_opamp #( .Aol(), + .GBW(), + .Rin(), + .Rout(), + + .VRailp(), + .VRailn(), + + .Vos(), + .Ios(), + .Ib(), + .Cin(), + + .SRp(), + .SRn() + ) + opa( inp, inn, out, vdd, vss); + +*/