2 changed files with 220 additions and 0 deletions
@ -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 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue