Added dtemp and "m" to mesa, corrected MESAunsetup and added pole-zero analysis.
This commit is contained in:
parent
3329216be0
commit
828a50686c
|
|
@ -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
21
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 ****************************
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ libmesa_a_SOURCES = \
|
|||
mesamdel.c \
|
||||
mesamparam.c \
|
||||
mesaparam.c \
|
||||
mesapzl.c \
|
||||
mesasetup.c \
|
||||
mesatemp.c \
|
||||
mesatrunc.c
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) -
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ SPICEdev MESAinfo = {
|
|||
DEVsetic : MESAgetic,
|
||||
DEVask : MESAask,
|
||||
DEVmodAsk : MESAmAsk,
|
||||
DEVpzLoad : NULL,
|
||||
DEVpzLoad : MESApzLoad,
|
||||
DEVconvTest : NULL,
|
||||
DEVsenSetup : NULL,
|
||||
DEVsenLoad : NULL,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue