From 828a50686c60280eb036148552dcc214ebf0d2ee Mon Sep 17 00:00:00 2001 From: pnenzi Date: Wed, 31 Dec 2003 10:44:45 +0000 Subject: [PATCH] Added dtemp and "m" to mesa, corrected MESAunsetup and added pole-zero analysis. --- ChangeLog | 5 ++ DEVICES | 21 ++++- src/spicelib/devices/mesa/Makefile.am | 1 + src/spicelib/devices/mesa/mesa.c | 3 +- src/spicelib/devices/mesa/mesaacl.c | 82 ++++++++++--------- src/spicelib/devices/mesa/mesaask.c | 34 +++++--- src/spicelib/devices/mesa/mesadefs.h | 26 +++--- src/spicelib/devices/mesa/mesadel.c | 6 +- src/spicelib/devices/mesa/mesadest.c | 4 +- src/spicelib/devices/mesa/mesaext.h | 19 +---- src/spicelib/devices/mesa/mesagetic.c | 7 +- src/spicelib/devices/mesa/mesainit.c | 2 +- src/spicelib/devices/mesa/mesaload.c | 74 ++++++++--------- src/spicelib/devices/mesa/mesamask.c | 7 +- src/spicelib/devices/mesa/mesamdel.c | 6 +- src/spicelib/devices/mesa/mesamparam.c | 6 +- src/spicelib/devices/mesa/mesaparam.c | 16 ++-- src/spicelib/devices/mesa/mesapzl.c | 108 +++++++++++++++++++++++++ src/spicelib/devices/mesa/mesasetup.c | 62 ++++++++------ src/spicelib/devices/mesa/mesatemp.c | 12 +-- src/spicelib/devices/mesa/mesatrunc.c | 12 +-- 21 files changed, 324 insertions(+), 189 deletions(-) create mode 100644 src/spicelib/devices/mesa/mesapzl.c 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); }