Only the long channel version as a placeholder

This commit is contained in:
dwarning 2007-05-08 19:33:40 +00:00
parent f3c3cd8909
commit 85d44a5fa4
2 changed files with 220 additions and 0 deletions

View File

@ -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

View File

@ -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