Only the long channel version as a placeholder
This commit is contained in:
parent
f3c3cd8909
commit
85d44a5fa4
|
|
@ -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
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue