diff --git a/ChangeLog b/ChangeLog
index ebfc2d502..2b2fb21db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,14 @@
2003-12-31 Paolo Nenzi
+ * 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
* src/spicelibe/devices/hfet2/*: Added parallel multiplier and "dtemp"
diff --git a/DEVICES b/DEVICES
index 94a694f0f..85a947f5c 100644
--- a/DEVICES
+++ b/DEVICES
@@ -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 ****************************
diff --git a/src/spicelib/devices/mesa/Makefile.am b/src/spicelib/devices/mesa/Makefile.am
index d86d483be..5ecbcbc0d 100644
--- a/src/spicelib/devices/mesa/Makefile.am
+++ b/src/spicelib/devices/mesa/Makefile.am
@@ -19,6 +19,7 @@ libmesa_a_SOURCES = \
mesamdel.c \
mesamparam.c \
mesaparam.c \
+ mesapzl.c \
mesasetup.c \
mesatemp.c \
mesatrunc.c
diff --git a/src/spicelib/devices/mesa/mesa.c b/src/spicelib/devices/mesa/mesa.c
index bdc3a887e..50dab9294 100644
--- a/src/spicelib/devices/mesa/mesa.c
+++ b/src/spicelib/devices/mesa/mesa.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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"),
diff --git a/src/spicelib/devices/mesa/mesaacl.c b/src/spicelib/devices/mesa/mesaacl.c
index efe4c8c6d..d9c9616d2 100644
--- a/src/spicelib/devices/mesa/mesaacl.c
+++ b/src/spicelib/devices/mesa/mesaacl.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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);
diff --git a/src/spicelib/devices/mesa/mesaask.c b/src/spicelib/devices/mesa/mesaask.c
index 931f88342..a7a4dbe62 100644
--- a/src/spicelib/devices/mesa/mesaask.c
+++ b/src/spicelib/devices/mesa/mesaask.c
@@ -7,7 +7,6 @@ Imported into MESA model: 2001 Paolo Nenzi
*/
#include "ngspice.h"
-#include
#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:
diff --git a/src/spicelib/devices/mesa/mesadefs.h b/src/spicelib/devices/mesa/mesadefs.h
index 2daf7b6fc..81c2e9809 100644
--- a/src/spicelib/devices/mesa/mesadefs.h
+++ b/src/spicelib/devices/mesa/mesadefs.h
@@ -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
diff --git a/src/spicelib/devices/mesa/mesadel.c b/src/spicelib/devices/mesa/mesadel.c
index 7df0bcfd9..d971098a3 100644
--- a/src/spicelib/devices/mesa/mesadel.c
+++ b/src/spicelib/devices/mesa/mesadel.c
@@ -7,17 +7,13 @@ Imported into mesa model: 2001 Paolo Nenzi
*/
#include "ngspice.h"
-#include
#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;
diff --git a/src/spicelib/devices/mesa/mesadest.c b/src/spicelib/devices/mesa/mesadest.c
index 56cd32313..ccc93b766 100644
--- a/src/spicelib/devices/mesa/mesadest.c
+++ b/src/spicelib/devices/mesa/mesadest.c
@@ -4,14 +4,12 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#include "mesadefs.h"
#include "suffix.h"
void
-MESAdestroy(inModel)
- GENmodel **inModel;
+MESAdestroy(GENmodel **inModel)
{
MESAmodel **model = (MESAmodel**)inModel;
MESAinstance *here;
diff --git a/src/spicelib/devices/mesa/mesaext.h b/src/spicelib/devices/mesa/mesaext.h
index 39db02e25..a1967cf44 100644
--- a/src/spicelib/devices/mesa/mesaext.h
+++ b/src/spicelib/devices/mesa/mesaext.h
@@ -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
diff --git a/src/spicelib/devices/mesa/mesagetic.c b/src/spicelib/devices/mesa/mesagetic.c
index 160ab4429..4fb8897d2 100644
--- a/src/spicelib/devices/mesa/mesagetic.c
+++ b/src/spicelib/devices/mesa/mesagetic.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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) -
diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c
index dcc1a7fd5..d8e910c69 100644
--- a/src/spicelib/devices/mesa/mesainit.c
+++ b/src/spicelib/devices/mesa/mesainit.c
@@ -57,7 +57,7 @@ SPICEdev MESAinfo = {
DEVsetic : MESAgetic,
DEVask : MESAask,
DEVmodAsk : MESAmAsk,
- DEVpzLoad : NULL,
+ DEVpzLoad : MESApzLoad,
DEVconvTest : NULL,
DEVsenSetup : NULL,
DEVsenLoad : NULL,
diff --git a/src/spicelib/devices/mesa/mesaload.c b/src/spicelib/devices/mesa/mesaload.c
index cd6444cef..72f5a749f 100644
--- a/src/spicelib/devices/mesa/mesaload.c
+++ b/src/spicelib/devices/mesa/mesaload.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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);
diff --git a/src/spicelib/devices/mesa/mesamask.c b/src/spicelib/devices/mesa/mesamask.c
index 85e9d2809..40a0c6f19 100644
--- a/src/spicelib/devices/mesa/mesamask.c
+++ b/src/spicelib/devices/mesa/mesamask.c
@@ -6,7 +6,6 @@ Author: 1987 Thomas L. Quarles
*/
#include "ngspice.h"
-#include
#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) {
diff --git a/src/spicelib/devices/mesa/mesamdel.c b/src/spicelib/devices/mesa/mesamdel.c
index e5cbdf136..25712e30f 100644
--- a/src/spicelib/devices/mesa/mesamdel.c
+++ b/src/spicelib/devices/mesa/mesamdel.c
@@ -7,17 +7,13 @@ Author: 1985 S. Hwang
*/
#include "ngspice.h"
-#include
#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;
diff --git a/src/spicelib/devices/mesa/mesamparam.c b/src/spicelib/devices/mesa/mesamparam.c
index 1a13a328c..d02d760c0 100644
--- a/src/spicelib/devices/mesa/mesamparam.c
+++ b/src/spicelib/devices/mesa/mesamparam.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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) {
diff --git a/src/spicelib/devices/mesa/mesaparam.c b/src/spicelib/devices/mesa/mesaparam.c
index 87e8aa2d8..ba6ea64fe 100644
--- a/src/spicelib/devices/mesa/mesaparam.c
+++ b/src/spicelib/devices/mesa/mesaparam.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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);
}
diff --git a/src/spicelib/devices/mesa/mesapzl.c b/src/spicelib/devices/mesa/mesapzl.c
new file mode 100644
index 000000000..35dc0cee3
--- /dev/null
+++ b/src/spicelib/devices/mesa/mesapzl.c
@@ -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);
+}
diff --git a/src/spicelib/devices/mesa/mesasetup.c b/src/spicelib/devices/mesa/mesasetup.c
index 3a9d6c799..dfc0e628e 100644
--- a/src/spicelib/devices/mesa/mesasetup.c
+++ b/src/spicelib/devices/mesa/mesasetup.c
@@ -5,7 +5,6 @@ Modified: 2001 AlansFixes
**********/
#include "ngspice.h"
-#include
#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;
-}
\ No newline at end of file
+}
diff --git a/src/spicelib/devices/mesa/mesatemp.c b/src/spicelib/devices/mesa/mesatemp.c
index 3940bed9d..eda6610a6 100644
--- a/src/spicelib/devices/mesa/mesatemp.c
+++ b/src/spicelib/devices/mesa/mesatemp.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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/
diff --git a/src/spicelib/devices/mesa/mesatrunc.c b/src/spicelib/devices/mesa/mesatrunc.c
index 43ac9b005..d83388be4 100644
--- a/src/spicelib/devices/mesa/mesatrunc.c
+++ b/src/spicelib/devices/mesa/mesatrunc.c
@@ -4,7 +4,6 @@ Author: Trond Ytterdal
**********/
#include "ngspice.h"
-#include
#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);
}