From 85d44a5fa4a9b88cd9946689c5ff354694fbe78e Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 8 May 2007 19:33:40 +0000 Subject: [PATCH] Only the long channel version as a placeholder --- src/spicelib/devices/adms/ekv/Makefile.am | 110 ++++++++++++++++++++ src/spicelib/devices/adms/ekv/admsva/ekv.va | 110 ++++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100644 src/spicelib/devices/adms/ekv/Makefile.am create mode 100644 src/spicelib/devices/adms/ekv/admsva/ekv.va diff --git a/src/spicelib/devices/adms/ekv/Makefile.am b/src/spicelib/devices/adms/ekv/Makefile.am new file mode 100644 index 000000000..03c262b0a --- /dev/null +++ b/src/spicelib/devices/adms/ekv/Makefile.am @@ -0,0 +1,110 @@ +## +## Interface: ngspice 1.0.0.0 +## created by: admsXml-2.2.5 - Wed, 02 May 2007 21:18:56 + +## Process this file with automake to produce Makefile.in + +ADMSXMLINTERFACE:=../admst +ekv.c: + admsXml -Iadmsva admsva/ekv.va \ + -e $(ADMSXMLINTERFACE)/ngspiceVersion.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEitf.h.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEinit.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEinit.h.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEext.h.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEdefs.h.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEask.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEmask.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEpar.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEmpar.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEload.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEacld.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEpzld.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEtemp.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEtrunc.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEsetup.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEdel.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEmdel.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEdest.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULEguesstopology.c.xml \ + -e $(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml + perl -p -i.bak -e 's/IOP\("(\w+)"/IOP("\L\1"/' ekv.c + +noinst_LIBRARIES = libekv.a + +libekv_a_SOURCES = \ + ekv.c \ + ekvacld.c \ + ekvask.c \ + ekvdefs.h \ + ekvdel.c \ + ekvdest.c \ + ekvext.h \ + ekvguesstopology.c \ + ekvinit.c \ + ekvinit.h \ + ekvitf.h \ + ekvload.c \ + ekvmask.c \ + ekvmdel.c \ + ekvmpar.c \ + ekvpar.c \ + ekvpzld.c \ + ekvsetup.c \ + ekvtemp.c \ + ekvtrunc.c + +BUILT_SOURCES = \ + ekv.c \ + ekvacld.c \ + ekvask.c \ + ekvdefs.h \ + ekvdel.c \ + ekvdest.c \ + ekvext.h \ + ekvguesstopology.c \ + ekvinit.c \ + ekvinit.h \ + ekvitf.h \ + ekvload.c \ + ekvmask.c \ + ekvmdel.c \ + ekvmpar.c \ + ekvpar.c \ + ekvpzld.c \ + ekvsetup.c \ + ekvtemp.c \ + ekvtrunc.c + +CLEANFILES = \ + ekv.c \ + ekv.c.bak \ + ekvacld.c \ + ekvask.c \ + ekvdefs.h \ + ekvdel.c \ + ekvdest.c \ + ekvext.h \ + ekvguesstopology.c \ + ekvinit.c \ + ekvinit.h \ + ekvitf.h \ + ekvload.c \ + ekvmask.c \ + ekvmdel.c \ + ekvmpar.c \ + ekvpar.c \ + ekvpzld.c \ + ekvsetup.c \ + ekvtemp.c \ + ekvtrunc.c + + +#TODO (not implemented) \ + ekvconv.c \ + ekvgetic.c \ + ekvnoise.c + +INCLUDES = -I$(top_srcdir)/src/include + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/adms/ekv/admsva/ekv.va b/src/spicelib/devices/adms/ekv/admsva/ekv.va new file mode 100644 index 000000000..8a1924df0 --- /dev/null +++ b/src/spicelib/devices/adms/ekv/admsva/ekv.va @@ -0,0 +1,110 @@ + +//`include "std.va" +//`include "const.va" +//Spice +`include "constants.h" +`include "discipline.h" + +`ifdef insideADMS + `define P(p) (*p*) + `define PGIVEN(p) $given(p) + `define INITIAL_MODEL @(initial_model) +`else + `define P(p) + `define PGIVEN(p) p + `define INITIAL_MODEL @(initial_step) +`endif + +//dw +`define TMAX 326.85 +`define TMIN -100.0 + + +// **************************************************************** +// * EKV MOS model (long channel) based on version 2.6 rev.15 +// * Function name : ekv26_dc_long for verilog-a implementation +// * The model documetation: http://legwww.epfl.ch/ekv +// **************************************************************** + +module ekv(d,g,s,b); +// +// Node definitions +// + inout d,g,s,b ; // external nodes + electrical d,g,s,b ; // external nodes + + +//dw +real VT,Tamb,Tdev,Tnom,dT; +parameter real tnom = 27 `P(spice:name="tnom" info="Temperature for which parameters are valid" unit="C"); +parameter real dt = 0.0 `P(spice:name="dt" type="instance" info="Temperature change for particular transistor" unit="K"); + +// +//*** Local variables +// +real x, VG, VS, VD, VGprime, VP; +real beta, n, iff, ir, Ispec, Id; +// +//*** model parameter definitions +// +parameter real L = 10E-6 from[0.0:inf]; +parameter real W = 10E-6 from[0.0:inf]; + +//*** Threshold voltage +// substrate effect parameters (long-channel) +parameter real VTO = 0.5 from[0.0:inf]; +parameter real GAMMA = 0.7 from[0.0:inf]; +parameter real PHI = 0.5 from[0.2:inf]; + +//*** Mobility parameters (long-channel) +parameter real KP = 20E-6 from[0.0:inf]; +parameter real THETA = 50.0E-3 from[0.0:inf]; + +analog begin // EKV v2.6 long-channel + +//dw +Tnom = tnom+273.15; +Tamb = $temperature; +Tdev = Tamb+dt; // selfheating instead dT later possible +// Limit temperature to avoid FPE's in equations +if(Tdev < `TMIN + 273.15) + Tdev = `TMIN + 273.15; +else +if (Tdev > `TMAX + 273.15) + Tdev = `TMAX + 273.15; + +VT = `P_K*Tdev /`P_Q; + + +VG = V(g); VS = V(s); VD = V(d); + +// Effective gate voltage (33) +VGprime = VG - VTO + PHI + GAMMA * sqrt(PHI); + +// Pinch-off voltage (34) +VP = VGprime - PHI - GAMMA + * (sqrt(VGprime+(GAMMA/2.0)*(GAMMA/2.0))-(GAMMA/2.0)); + +// Slope factor (39) +n = 1.0 + GAMMA / (2.0*sqrt(PHI + VP + 4.0*VT)); + +// Mobility equation (58), (64) +beta = KP * (W/L) * (1.0/(1.0 + THETA * VP)); + +// forward (44) and reverse (56) currents +x=(VP-VS)/VT; iff = (ln(1.0+exp( x /2.0)))*(ln(1.0+exp( x /2.0))); +x=(VP-VD)/VT; ir = (ln(1.0+exp( x /2.0)))*(ln(1.0+exp( x /2.0))); + +// Specific current (65) +Ispec = 2 * n * beta * VT * VT; + +// Drain current (66) +Id = Ispec * (iff - ir); + +// +// Branch contributions to EKV v2.6 model (long-channel) +// +I(d,s) <+ Id; + +end // analog +endmodule