Added dtemp and "m" to mesa, corrected MESAunsetup and added pole-zero analysis.

This commit is contained in:
pnenzi 2003-12-31 10:44:45 +00:00
parent 3329216be0
commit 828a50686c
21 changed files with 324 additions and 189 deletions

View File

@ -1,9 +1,14 @@
2003-12-31 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/mesa/*: Added parallel multiplier and "dtemp",
pole-zero analysis and parallel code switches.
* src/spicelib/devices/mes/*: Added parallel multiplier.
* tests/mes, tests/mes/subth.cir: added test netlist for mes devices.
* DEVICES: updated documentation including MES and MESA changes.
2003-12-30 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelibe/devices/hfet2/*: Added parallel multiplier and "dtemp"

21
DEVICES
View File

@ -207,7 +207,7 @@ JFET2 - Junction Field Effect Transistor (PS model)
*************************** HFET devices ***************************
***************************************************************************
HFET - HFET Level 1 (Ytterdal)
HFET - HFET Level 1 (MacSpice3f4)
Initial Release.
Ver: N/A
Class: Z
@ -222,7 +222,7 @@ HFET - HFET Level 1 (Ytterdal)
- Added pole-zero analysis
HFET2 - HFET Level 2 (Ytterdal)
HFET2 - HFET Level 2 (MacSpice3f4)
Initial Release.
Ver: N/A
Class: Z
@ -253,8 +253,21 @@ MES - MESfet model
- Parallel multiplier
- Alan Gillespie junction diodes implementation
MESA - MESA model
Initial release. TO BE TESTED
MESA - MESA model (MacSpice3f4)
Initial Release.
Ver: N/A
Class: Z
Level: 2,3,4
Status:
This is a multilevel model. It contains code for mesa levels
2,3 and 4
Enhancements over the original model:
- Parallel multiplier
- Instance temperature as difference from circuit temperature
- Added pole-zero analysis
***************************************************************************
**************************** MOS devices ****************************

View File

@ -19,6 +19,7 @@ libmesa_a_SOURCES = \
mesamdel.c \
mesamparam.c \
mesaparam.c \
mesapzl.c \
mesasetup.c \
mesatemp.c \
mesatrunc.c

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "devdefs.h"
#include "mesadefs.h"
@ -15,10 +14,12 @@ IFparm MESApTable[] = { /* parameters */
OP("off", MESA_OFF, IF_FLAG ,"Device initially off"),
IOP("l", MESA_LENGTH, IF_REAL ,"Length of device"),
IOP("w", MESA_WIDTH, IF_REAL ,"Width of device"),
IOP("m", MESA_M, IF_REAL ,"Parallel Multiplier"),
IOP("icvds", MESA_IC_VDS, IF_REAL ,"Initial D-S voltage"),
IOP("icvgs", MESA_IC_VGS, IF_REAL ,"Initial G-S voltage"),
IOP("td", MESA_TD, IF_REAL ,"Instance drain temperature"),
IOP("ts", MESA_TS, IF_REAL ,"Instance source temperature"),
IOP("dtemp", MESA_DTEMP, IF_REAL ,"Instance temperature difference"),
OP("dnode", MESA_DRAINNODE, IF_INTEGER,"Number of drain node"),
OP("gnode", MESA_GATENODE, IF_INTEGER,"Number of gate node"),
OP("snode", MESA_SOURCENODE, IF_INTEGER,"Number of source node"),

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "mesadefs.h"
#include "sperror.h"
@ -12,9 +11,7 @@ Author: Trond Ytterdal
int
MESAacLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
MESAacLoad(GENmodel *inModel, CKTcircuit *ckt)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
@ -32,9 +29,14 @@ MESAacLoad(inModel,ckt)
double delidgch;
double delidvds;
double m;
for( ; model != NULL; model = model->MESAnextModel ) {
for( here = model->MESAinstances; here != NULL;
here = here->MESAnextInstance) {
if (here->MESAowner != ARCHme) continue;
f = ckt->CKTomega/2/M_PI;
if(here->MESAdelf == 0)
lambda = here->MESAtLambda;
@ -56,41 +58,43 @@ MESAacLoad(inModel,ckt)
ggd= *(ckt->CKTstate0 + here->MESAggd) ;
xgd= *(ckt->CKTstate0 + here->MESAqgd) * ckt->CKTomega ;
*(here->MESAdrainDrainPtr) += here->MESAdrainConduct;
*(here->MESAsourceSourcePtr) += here->MESAsourceConduct;
*(here->MESAgateGatePtr) += here->MESAgateConduct;
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += (here->MESAtGi+ggspp);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += (here->MESAtGf+ggdpp);
*(here->MESAdrainDrainPrimePtr) -= here->MESAdrainConduct;
*(here->MESAdrainPrimeDrainPtr) -= here->MESAdrainConduct;
*(here->MESAsourceSourcePrimePtr) -= here->MESAsourceConduct;
*(here->MESAsourcePrimeSourcePtr) -= here->MESAsourceConduct;
*(here->MESAgateGatePrimePtr) -= here->MESAgateConduct;
*(here->MESAgatePrimeGatePtr) -= here->MESAgateConduct;
*(here->MESAgatePrimeDrainPrimePtr) += (-ggd);
*(here->MESAgatePrimeSourcePrimePtr) += (-ggs);
*(here->MESAdrainPrimeGatePrimePtr) += (gm-ggd);
*(here->MESAdrainPrimeSourcePrimePtr) += (-gds-gm);
*(here->MESAsourcePrimeGatePrimePtr) += (-ggs-gm);
*(here->MESAsourcePrimeDrainPrimePtr) += (-gds);
*(here->MESAgatePrimeGatePrimePtr) += (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp);
*(here->MESAdrainPrimeDrainPrimePtr) += (gds+ggd+here->MESAdrainConduct+here->MESAtGf);
*(here->MESAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi);
*(here->MESAsourcePrimeSourcePrmPrmPtr) -= here->MESAtGi;
*(here->MESAsourcePrmPrmSourcePrimePtr) -= here->MESAtGi;
*(here->MESAgatePrimeSourcePrmPrmPtr) -= ggspp;
*(here->MESAsourcePrmPrmGatePrimePtr) -= ggspp;
*(here->MESAdrainPrimeDrainPrmPrmPtr) -= here->MESAtGf;
*(here->MESAdrainPrmPrmDrainPrimePtr) -= here->MESAtGf;
*(here->MESAgatePrimeDrainPrmPrmPtr) -= ggdpp;
*(here->MESAdrainPrmPrmGatePrimePtr) -= ggdpp;
*(here->MESAsourcePrmPrmSourcePrmPrmPtr+1) += xgs;
*(here->MESAdrainPrmPrmDrainPrmPrmPtr+1) += xgd;
*(here->MESAgatePrimeGatePrimePtr+1) += xgd+xgs;
*(here->MESAgatePrimeDrainPrmPrmPtr+1) -= xgd;
*(here->MESAdrainPrmPrmGatePrimePtr+1) -= xgd;
*(here->MESAgatePrimeSourcePrmPrmPtr+1) -= xgs;
*(here->MESAsourcePrmPrmGatePrimePtr+1) -= xgs;
m = here->MESAm;
*(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct);
*(here->MESAgateGatePtr) += m * (here->MESAgateConduct);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp);
*(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct);
*(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct);
*(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct);
*(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeDrainPrimePtr) += m * (-ggd);
*(here->MESAgatePrimeSourcePrimePtr) += m * (-ggs);
*(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd);
*(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
*(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->MESAsourcePrimeDrainPrimePtr) += m * (-gds);
*(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp);
*(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf);
*(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi);
*(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi);
*(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi);
*(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf);
*(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf);
*(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd);
*(here->MESAgatePrimeGatePrimePtr+1) += m * (xgd+xgs);
*(here->MESAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd);
*(here->MESAdrainPrmPrmGatePrimePtr+1) -= m * (xgd);
*(here->MESAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs);
*(here->MESAsourcePrmPrmGatePrimePtr+1) -= m * (xgs);
}
}
return(OK);

View File

@ -7,7 +7,6 @@ Imported into MESA model: 2001 Paolo Nenzi
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
@ -18,12 +17,7 @@ Imported into MESA model: 2001 Paolo Nenzi
/* ARGSUSED */
int
MESAask(ckt,inst,which,value,select)
CKTcircuit *ckt;
GENinstance *inst;
int which;
IFvalue *value;
IFvalue *select;
MESAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
{
MESAinstance *here = (MESAinstance*)inst;
static char *msg = "Current and power not available in ac analysis";
@ -33,6 +27,10 @@ MESAask(ckt,inst,which,value,select)
return (OK);
case MESA_WIDTH:
value->rValue = here->MESAwidth;
value->rValue *= here->MESAm;
return (OK);
case MESA_M:
value->rValue = here->MESAm;
return (OK);
case MESA_IC_VDS:
value->rValue = here->MESAicVDS;
@ -44,11 +42,14 @@ MESAask(ckt,inst,which,value,select)
value->iValue = here->MESAoff;
return (OK);
case MESA_TD:
value->rValue = here->MESAtd;
value->rValue = here->MESAtd - CONSTCtoK;
return (OK);
case MESA_TS:
value->rValue = here->MESAts;
return (OK);
value->rValue = here->MESAts - CONSTCtoK;
return (OK);
case MESA_DTEMP:
value->rValue = here->MESAdtemp;
return (OK);
case MESA_DRAINNODE:
value->iValue = here->MESAdrainNode;
return (OK);
@ -75,36 +76,47 @@ MESAask(ckt,inst,which,value,select)
return (OK);
case MESA_CG:
value->rValue = *(ckt->CKTstate0 + here->MESAcg);
value->rValue *= here->MESAm;
return (OK);
case MESA_CD:
value->rValue = *(ckt->CKTstate0 + here->MESAcd);
value->rValue *= here->MESAm;
return (OK);
case MESA_CGD:
value->rValue = *(ckt->CKTstate0 + here->MESAcgd);
value->rValue *= here->MESAm;
return (OK);
case MESA_GM:
value->rValue = *(ckt->CKTstate0 + here->MESAgm);
value->rValue *= here->MESAm;
return (OK);
case MESA_GDS:
value->rValue = *(ckt->CKTstate0 + here->MESAgds);
value->rValue *= here->MESAm;
return (OK);
case MESA_GGS:
value->rValue = *(ckt->CKTstate0 + here->MESAggs);
value->rValue *= here->MESAm;
return (OK);
case MESA_GGD:
value->rValue = *(ckt->CKTstate0 + here->MESAggd);
value->rValue *= here->MESAm;
return (OK);
case MESA_QGS:
value->rValue = *(ckt->CKTstate0 + here->MESAqgs);
value->rValue *= here->MESAm;
return (OK);
case MESA_CQGS:
value->rValue = *(ckt->CKTstate0 + here->MESAcqgs);
value->rValue *= here->MESAm;
return (OK);
case MESA_QGD:
value->rValue = *(ckt->CKTstate0 + here->MESAqgd);
value->rValue *= here->MESAm;
return (OK);
case MESA_CQGD:
value->rValue = *(ckt->CKTstate0 + here->MESAcqgd);
value->rValue *= here->MESAm;
return (OK);
case MESA_CS :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
@ -115,6 +127,7 @@ MESAask(ckt,inst,which,value,select)
} else {
value->rValue = -*(ckt->CKTstate0 + here->MESAcd);
value->rValue -= *(ckt->CKTstate0 + here->MESAcg);
value->rValue *= here->MESAm;
}
return(OK);
case MESA_POWER :
@ -131,6 +144,7 @@ MESAask(ckt,inst,which,value,select)
value->rValue -= (*(ckt->CKTstate0+here->MESAcd) +
*(ckt->CKTstate0 + here->MESAcg)) *
*(ckt->CKTrhsOld + here->MESAsourceNode);
value->rValue *= here->MESAm;
}
return(OK);
default:

View File

@ -34,11 +34,13 @@ typedef struct sMESAinstance {
int MESAsourcePrmPrmNode;
int MESAdrainPrmPrmNode;
double MESAlength; /* length of MESAfet */
double MESAwidth; /* width of MESAfet */
double MESAicVDS; /* initial condition voltage D-S*/
double MESAicVGS; /* initial condition voltage G-S*/
double MESAtd; /* drain temperature */
double MESAts; /* source temperature */
double MESAwidth; /* width of MESAfet */
double MESAm; /* Parallel Multiplier */
double MESAicVDS; /* initial condition voltage D-S*/
double MESAicVGS; /* initial condition voltage G-S*/
double MESAtd; /* drain temperature */
double MESAts; /* source temperature */
double MESAdtemp; /* Instance temperature difference */
double MESAtVto;
double MESAtLambda;
double MESAtLambdahf;
@ -110,11 +112,13 @@ typedef struct sMESAinstance {
int MESAoff;
unsigned MESAlengthGiven : 1;
unsigned MESAwidthGiven : 1;
unsigned MESAicVDSGiven : 1;
unsigned MESAicVGSGiven : 1;
unsigned MESAtdGiven : 1;
unsigned MESAtsGiven : 1;
unsigned MESAwidthGiven : 1;
unsigned MESAmGiven : 1;
unsigned MESAicVDSGiven : 1;
unsigned MESAicVGSGiven : 1;
unsigned MESAtdGiven : 1;
unsigned MESAtsGiven : 1;
unsigned MESAdtempGiven : 1;
int MESAmode;
@ -368,6 +372,8 @@ typedef struct sMESAmodel { /* model structure for a MESAfet */
#define MESA_OFF 8
#define MESA_CS 9
#define MESA_POWER 10
#define MESA_DTEMP 11
#define MESA_M 12
/* model parameters */
#define MESA_MOD_VTO 101

View File

@ -7,17 +7,13 @@ Imported into mesa model: 2001 Paolo Nenzi
*/
#include "ngspice.h"
#include <stdio.h>
#include "mesadefs.h"
#include "sperror.h"
#include "suffix.h"
int
MESAdelete(inModel,name,inst)
GENmodel *inModel;
IFuid name;
GENinstance **inst;
MESAdelete(GENmodel *inModel, IFuid name, GENinstance **inst)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance **fast = (MESAinstance**)inst;

View File

@ -4,14 +4,12 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "mesadefs.h"
#include "suffix.h"
void
MESAdestroy(inModel)
GENmodel **inModel;
MESAdestroy(GENmodel **inModel)
{
MESAmodel **model = (MESAmodel**)inModel;
MESAinstance *here;

View File

@ -3,7 +3,6 @@ Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reser
Author: Trond Ytterdal
**********/
#ifdef __STDC__
extern int MESAacLoad(GENmodel*,CKTcircuit*);
extern int MESAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
extern int MESAdelete(GENmodel*,IFuid,GENinstance**);
@ -14,24 +13,8 @@ extern int MESAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*);
extern int MESAmDelete(GENmodel**,IFuid,GENmodel*);
extern int MESAmParam(int,IFvalue*,GENmodel*);
extern int MESAparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int MESApzLoad(GENmodel*,CKTcircuit*, SPcomplex*);
extern int MESAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int MESAtemp(GENmodel*,CKTcircuit*);
extern int MESAtrunc(GENmodel*,CKTcircuit*,double*);
extern int MESAunsetup(GENmodel*,CKTcircuit*);
#else /*stdc*/
extern int MESAacLoad();
extern int MESAask();
extern int MESAdelete();
extern void MESAdestroy();
extern int MESAgetic();
extern int MESAload();
extern int MESAmAsk();
extern int MESAmDelete();
extern int MESAmParam();
extern int MESAparam();
extern int MESAsetup();
extern int MESAtemp();
extern int MESAtrunc();
extern int MESAunsetup();
#endif

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "mesadefs.h"
#include "sperror.h"
@ -12,9 +11,7 @@ Author: Trond Ytterdal
int
MESAgetic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
MESAgetic(GENmodel *inModel, CKTcircuit *ckt)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
@ -25,6 +22,8 @@ MESAgetic(inModel,ckt)
for( ; model ; model = model->MESAnextModel) {
for(here = model->MESAinstances; here ; here = here->MESAnextInstance) {
if (here->MESAowner != ARCHme) continue;
if(!here->MESAicVDSGiven) {
here->MESAicVDS =
*(ckt->CKTrhs + here->MESAdrainNode) -

View File

@ -57,7 +57,7 @@ SPICEdev MESAinfo = {
DEVsetic : MESAgetic,
DEVask : MESAask,
DEVmodAsk : MESAmAsk,
DEVpzLoad : NULL,
DEVpzLoad : MESApzLoad,
DEVconvTest : NULL,
DEVsenSetup : NULL,
DEVsenLoad : NULL,

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "cktdefs.h"
#include "mesadefs.h"
@ -35,10 +34,7 @@ static void mesa3(MESAmodel*, MESAinstance*, double, double, double,
void Pause(void);
int
MESAload(inModel,ckt)
GENmodel *inModel;
//register CKTcircuit *ckt;
CKTcircuit *ckt;
MESAload(GENmodel *inModel, CKTcircuit *ckt)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
@ -95,12 +91,15 @@ MESAload(inModel,ckt)
int ichk1;
int error;
double m;
/* loop through all the models */
for( ; model != NULL; model = model->MESAnextModel ) {
/* loop through all the instances of the model */
for (here = model->MESAinstances; here != NULL ;
here=here->MESAnextInstance) {
if (here->MESAowner != ARCHme) continue;
/*
* dc model parameters
@ -418,51 +417,54 @@ MESAload(inModel,ckt)
* load current vector
*/
load:
m = here->MESAm;
ccorr = model->MESAag*(cgs-cgd);
ceqgd = cgd + cgdpp - ggd*vgd - ggdpp*vgdpp;
ceqgs = cgs + cgspp - ggs*vgs - ggspp*vgspp;
cdreq=((cd+cgd+cgdpp)-gds*vds-gm*vgs);
*(ckt->CKTrhs + here->MESAgatePrimeNode) += (-ceqgs-ceqgd);
*(ckt->CKTrhs + here->MESAgatePrimeNode) += m * (-ceqgs-ceqgd);
ceqgd = (cgd-ggd*vgd);
*(ckt->CKTrhs + here->MESAdrainPrimeNode) += (-cdreq+ceqgd+ccorr);
*(ckt->CKTrhs + here->MESAdrainPrimeNode) += m * (-cdreq+ceqgd+ccorr);
ceqgd = (cgdpp-ggdpp*vgdpp);
*(ckt->CKTrhs + here->MESAdrainPrmPrmNode) += ceqgd;
ceqgs = (cgs-ggs*vgs);
*(ckt->CKTrhs + here->MESAsourcePrimeNode) += (cdreq+ceqgs-ccorr);
*(ckt->CKTrhs + here->MESAsourcePrimeNode) += m * (cdreq+ceqgs-ccorr);
ceqgs = (cgspp-ggspp*vgspp);
*(ckt->CKTrhs + here->MESAsourcePrmPrmNode) += ceqgs;
/*
* load y matrix
*/
*(here->MESAdrainDrainPtr) += here->MESAdrainConduct;
*(here->MESAsourceSourcePtr) += here->MESAsourceConduct;
*(here->MESAgateGatePtr) += here->MESAgateConduct;
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += (here->MESAtGi+ggspp);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += (here->MESAtGf+ggdpp);
*(here->MESAgatePrimeGatePrimePtr) += (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp);
*(here->MESAdrainPrimeDrainPrimePtr) += (gds+ggd+here->MESAdrainConduct+here->MESAtGf);
*(here->MESAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi);
*(here->MESAdrainDrainPrimePtr) -= here->MESAdrainConduct;
*(here->MESAdrainPrimeDrainPtr) -= here->MESAdrainConduct;
*(here->MESAsourceSourcePrimePtr) -= here->MESAsourceConduct;
*(here->MESAsourcePrimeSourcePtr) -= here->MESAsourceConduct;
*(here->MESAgateGatePrimePtr) -= here->MESAgateConduct;
*(here->MESAgatePrimeGatePtr) -= here->MESAgateConduct;
*(here->MESAgatePrimeDrainPrimePtr) -= ggd;
*(here->MESAgatePrimeSourcePrimePtr) -= ggs;
*(here->MESAdrainPrimeGatePrimePtr) += (gm-ggd);
*(here->MESAdrainPrimeSourcePrimePtr) += (-gds-gm);
*(here->MESAsourcePrimeGatePrimePtr) += (-ggs-gm);
*(here->MESAsourcePrimeDrainPrimePtr) -= gds;
*(here->MESAsourcePrimeSourcePrmPrmPtr) -= here->MESAtGi;
*(here->MESAsourcePrmPrmSourcePrimePtr) -= here->MESAtGi;
*(here->MESAgatePrimeSourcePrmPrmPtr) -= ggspp;
*(here->MESAsourcePrmPrmGatePrimePtr) -= ggspp;
*(here->MESAdrainPrimeDrainPrmPrmPtr) -= here->MESAtGf;
*(here->MESAdrainPrmPrmDrainPrimePtr) -= here->MESAtGf;
*(here->MESAgatePrimeDrainPrmPrmPtr) -= ggdpp;
*(here->MESAdrainPrmPrmGatePrimePtr) -= ggdpp;
*(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct);
*(here->MESAgateGatePtr) += m * (here->MESAgateConduct);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp);
*(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp);
*(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf);
*(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi);
*(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct);
*(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct);
*(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct);
*(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeDrainPrimePtr) -= m * (ggd);
*(here->MESAgatePrimeSourcePrimePtr) -= m * (ggs);
*(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd);
*(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
*(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->MESAsourcePrimeDrainPrimePtr) -= m * (gds);
*(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi);
*(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi);
*(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf);
*(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf);
*(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
}
}
return(OK);

View File

@ -6,7 +6,6 @@ Author: 1987 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
@ -17,11 +16,7 @@ Author: 1987 Thomas L. Quarles
/* ARGSUSED */
int
MESAmAsk(ckt,inst,which,value)
CKTcircuit *ckt;
GENmodel *inst;
int which;
IFvalue *value;
MESAmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
{
MESAmodel *here = (MESAmodel*)inst;
switch(which) {

View File

@ -7,17 +7,13 @@ Author: 1985 S. Hwang
*/
#include "ngspice.h"
#include <stdio.h>
#include "mesadefs.h"
#include "sperror.h"
#include "suffix.h"
int
MESAmDelete(inModel,modname,kill)
GENmodel **inModel;
IFuid modname;
GENmodel *kill;
MESAmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
{
MESAmodel **model = (MESAmodel**)inModel;
MESAmodel *modfast = (MESAmodel*)kill;

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "mesadefs.h"
@ -13,10 +12,7 @@ Author: Trond Ytterdal
int
MESAmParam(param,value,inModel)
int param;
IFvalue *value;
GENmodel *inModel;
MESAmParam(int param, IFvalue *value, GENmodel *inModel)
{
MESAmodel *model = (MESAmodel*)inModel;
switch(param) {

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "mesadefs.h"
@ -14,11 +13,7 @@ Author: Trond Ytterdal
/* ARGSUSED */
int
MESAparam(param,value,inst,select)
int param;
IFvalue *value;
GENinstance *inst;
IFvalue *select;
MESAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
MESAinstance *here = (MESAinstance*)inst;
switch(param) {
@ -30,6 +25,11 @@ MESAparam(param,value,inst,select)
here->MESAwidth = value->rValue;
here->MESAwidthGiven = TRUE;
break;
case MESA_M:
here->MESAm = value->rValue;
here->MESAmGiven = TRUE;
break;
case MESA_IC_VDS:
here->MESAicVDS = value->rValue;
here->MESAicVDSGiven = TRUE;
@ -62,6 +62,10 @@ MESAparam(param,value,inst,select)
here->MESAts = value->rValue+CONSTCtoK;
here->MESAtsGiven = TRUE;
break;
case MESA_DTEMP:
here->MESAdtemp = value->rValue;
here->MESAdtempGiven = TRUE;
break;
default:
return(E_BADPARM);
}

View File

@ -0,0 +1,108 @@
/**********
Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved.
Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include "cktdefs.h"
#include "mesadefs.h"
#include "sperror.h"
#include "suffix.h"
int
MESApzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
double gm;
double gds;
double ggspp;
double ggdpp;
double ggs;
double xgs;
double ggd;
double xgd;
double f;
double lambda;
double vds;
double delidgch;
double delidvds;
double m;
for( ; model != NULL; model = model->MESAnextModel ) {
for( here = model->MESAinstances; here != NULL;
here = here->MESAnextInstance) {
if (here->MESAowner != ARCHme) continue;
f = ckt->CKTomega/2/M_PI;
if(here->MESAdelf == 0)
lambda = here->MESAtLambda;
else
lambda = here->MESAtLambda+0.5*(here->MESAtLambdahf-here->MESAtLambda)*
(1+tanh((f-here->MESAfl)/here->MESAdelf));
vds= *(ckt->CKTstate0 + here->MESAvgs) -
*(ckt->CKTstate0 + here->MESAvgd);
delidgch = here->MESAdelidgch0*(1+lambda*vds);
delidvds = here->MESAdelidvds0*(1+2*lambda*vds) -
here->MESAdelidvds1;
gm = (delidgch*here->MESAgm0+here->MESAgm1)*here->MESAgm2;
gds = delidvds+here->MESAgds0;
ggspp=*(ckt->CKTstate0 + here->MESAggspp);
ggdpp=*(ckt->CKTstate0 + here->MESAggdpp);
ggs= *(ckt->CKTstate0 + here->MESAggs) ;
xgs= *(ckt->CKTstate0 + here->MESAqgs) ;
ggd= *(ckt->CKTstate0 + here->MESAggd) ;
xgd= *(ckt->CKTstate0 + here->MESAqgd) ;
m = here->MESAm;
*(here->MESAdrainDrainPtr) += m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePtr) += m * (here->MESAsourceConduct);
*(here->MESAgateGatePtr) += m * (here->MESAgateConduct);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (here->MESAtGi+ggspp);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (here->MESAtGf+ggdpp);
*(here->MESAdrainDrainPrimePtr) -= m * (here->MESAdrainConduct);
*(here->MESAdrainPrimeDrainPtr) -= m * (here->MESAdrainConduct);
*(here->MESAsourceSourcePrimePtr) -= m * (here->MESAsourceConduct);
*(here->MESAsourcePrimeSourcePtr) -= m * (here->MESAsourceConduct);
*(here->MESAgateGatePrimePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeGatePtr) -= m * (here->MESAgateConduct);
*(here->MESAgatePrimeDrainPrimePtr) += m * (-ggd);
*(here->MESAgatePrimeSourcePrimePtr) += m * (-ggs);
*(here->MESAdrainPrimeGatePrimePtr) += m * (gm-ggd);
*(here->MESAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
*(here->MESAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->MESAsourcePrimeDrainPrimePtr) += m * (-gds);
*(here->MESAgatePrimeGatePrimePtr) += m * (ggd+ggs+here->MESAgateConduct+ggspp+ggdpp);
*(here->MESAdrainPrimeDrainPrimePtr) += m * (gds+ggd+here->MESAdrainConduct+here->MESAtGf);
*(here->MESAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+here->MESAsourceConduct+here->MESAtGi);
*(here->MESAsourcePrimeSourcePrmPrmPtr) -= m * (here->MESAtGi);
*(here->MESAsourcePrmPrmSourcePrimePtr) -= m * (here->MESAtGi);
*(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->MESAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->MESAdrainPrimeDrainPrmPrmPtr) -= m * (here->MESAtGf);
*(here->MESAdrainPrmPrmDrainPrimePtr) -= m * (here->MESAtGf);
*(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->MESAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr) += m * (xgs * s->real);
*(here->MESAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs * s->imag);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr) += m * (xgd * s->real);
*(here->MESAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd * s->imag);
*(here->MESAgatePrimeGatePrimePtr) += m * ((xgd+xgs) * s->real);
*(here->MESAgatePrimeGatePrimePtr+1) += m * ((xgd+xgs) * s->imag);
*(here->MESAgatePrimeDrainPrmPrmPtr) -= m * (xgd * s->real);
*(here->MESAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd * s->imag);
*(here->MESAdrainPrmPrmGatePrimePtr) -= m * (xgd * s->real);
*(here->MESAdrainPrmPrmGatePrimePtr+1) -= m * (xgd * s->imag);
*(here->MESAgatePrimeSourcePrmPrmPtr) -= m * (xgs * s->real);
*(here->MESAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs * s->imag);
*(here->MESAsourcePrmPrmGatePrimePtr) -= m * (xgs * s->real);
*(here->MESAsourcePrmPrmGatePrimePtr+1) -= m * (xgs * s->imag);
}
}
return(OK);
}

View File

@ -5,7 +5,6 @@ Modified: 2001 AlansFixes
**********/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "mesadefs.h"
@ -15,18 +14,14 @@ Modified: 2001 AlansFixes
int
MESAsetup(matrix,inModel,ckt,states)
register SMPmatrix *matrix;
register GENmodel *inModel;
register CKTcircuit *ckt;
int *states;
MESAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
/* load the diode structure with those pointers needed later
* for fast matrix loading
*/
{
register MESAmodel *model = (MESAmodel*)inModel;
register MESAinstance *here;
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
int error;
CKTnode *tmp;
@ -217,23 +212,32 @@ MESAsetup(matrix,inModel,ckt,states)
/* loop through all the instances of the model */
for (here = model->MESAinstances; here != NULL ;
here=here->MESAnextInstance) {
if (here->MESAowner != ARCHme) goto matrixpointers;
if(!here->MESAlengthGiven) {
here->MESAlength = 1e-6;
}
if(!here->MESAwidthGiven) {
here->MESAwidth = 20e-6;
}
if(!here->MESAmGiven) {
here->MESAm = 1.0;
}
if(!here->MESAdtempGiven) {
here->MESAdtemp = 0.0;
}
if(!here->MESAtdGiven) {
here->MESAtd = ckt->CKTtemp;
here->MESAtd = ckt->CKTtemp + here->MESAdtemp;
}
if(!here->MESAtsGiven) {
here->MESAts = ckt->CKTtemp;
here->MESAts = ckt->CKTtemp + here->MESAdtemp;
}
here->MESAstate = *states;
*states += 20;
matrixpointers:
if(model->MESAsourceResist != 0 && here->MESAsourcePrimeNode==0) {
error = CKTmkVolt(ckt,&tmp,here->MESAname,"source");
if(error) return(error);
@ -264,7 +268,7 @@ MESAsetup(matrix,inModel,ckt,states)
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
@ -284,7 +288,7 @@ MESAsetup(matrix,inModel,ckt,states)
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
@ -307,7 +311,7 @@ MESAsetup(matrix,inModel,ckt,states)
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
@ -379,9 +383,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
int
MESAunsetup(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
MESAunsetup(GENmodel *inModel, CKTcircuit *ckt)
{
MESAmodel *model;
MESAinstance *here;
@ -404,14 +406,26 @@ MESAunsetup(inModel,ckt)
CKTdltNNum(ckt, here->MESAsourcePrimeNode);
here->MESAsourcePrimeNode = 0;
}
if (here->MESAgatePrimeNode
&& here->MESAgatePrimeNode != here->MESAgateNode)
{
CKTdltNNum(ckt, here->MESAgatePrimeNode);
here->MESAgatePrimeNode = 0;
}
if (here->MESAgatePrimeNode
&& here->MESAgatePrimeNode != here->MESAgateNode)
{
CKTdltNNum(ckt, here->MESAgatePrimeNode);
here->MESAgatePrimeNode = 0;
}
if (here->MESAsourcePrmPrmNode
&& here->MESAsourcePrmPrmNode != here->MESAsourcePrimeNode)
{
CKTdltNNum(ckt, here->MESAsourcePrmPrmNode);
here->MESAsourcePrmPrmNode = 0;
}
if (here->MESAdrainPrmPrmNode
&& here->MESAdrainPrmPrmNode != here->MESAdrainPrimeNode)
{
CKTdltNNum(ckt, here->MESAdrainPrmPrmNode);
here->MESAdrainPrmPrmNode = 0;
}
}
}
return OK;
}
}

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "mesadefs.h"
@ -16,13 +15,11 @@ Author: Trond Ytterdal
#define EPSILONGAAS (12.244*8.85418e-12)
int
MESAtemp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
MESAtemp(GENmodel *inModel, CKTcircuit *ckt)
{
register MESAmodel *model = (MESAmodel*)inModel;
register MESAinstance *here;
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
double temp;
double vt;
double d;
@ -45,6 +42,9 @@ MESAtemp(inModel,ckt)
for (here = model->MESAinstances; here != NULL ;
here=here->MESAnextInstance) {
if (here->MESAowner != ARCHme) continue;
vt = CONSTKoverQ * here->MESAts;
if(model->MESAmu1 == 0 && model->MESAmu2 == 0)
here->MESAtMu = model->MESAmu*pow(here->MESAts/

View File

@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "mesadefs.h"
#include "sperror.h"
@ -12,16 +11,17 @@ Author: Trond Ytterdal
int
MESAtrunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
double *timeStep;
MESAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{
MESAmodel *model = (MESAmodel*)inModel;
MESAinstance *here;
for( ; model != NULL; model = model->MESAnextModel) {
for(here=model->MESAinstances;here!=NULL;here = here->MESAnextInstance){
for(here=model->MESAinstances;here!=NULL;
here = here->MESAnextInstance){
if (here->MESAowner != ARCHme) continue;
CKTterr(here->MESAqgs,ckt,timeStep);
CKTterr(here->MESAqgd,ckt,timeStep);
}