You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

154 lines
5.3 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Thomas L. Quarles
**********/
/*
Imported into MESA model: 2001 Paolo Nenzi
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
#include "mesadefs.h"
#include "sperror.h"
#include "suffix.h"
/* ARGSUSED */
int
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";
switch(which) {
case MESA_LENGTH:
value->rValue = here->MESAlength;
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;
return (OK);
case MESA_IC_VGS:
value->rValue = here->MESAicVGS;
return (OK);
case MESA_OFF:
value->iValue = here->MESAoff;
return (OK);
case MESA_TD:
value->rValue = here->MESAtd - CONSTCtoK;
return (OK);
case MESA_TS:
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);
case MESA_GATENODE:
value->iValue = here->MESAgateNode;
return (OK);
case MESA_SOURCENODE:
value->iValue = here->MESAsourceNode;
return (OK);
case MESA_DRAINPRIMENODE:
value->iValue = here->MESAdrainPrimeNode;
return (OK);
case MESA_SOURCEPRIMENODE:
value->iValue = here->MESAsourcePrimeNode;
return (OK);
case MESA_GATEPRIMENODE:
value->iValue = here->MESAgatePrimeNode;
return (OK);
case MESA_VGS:
value->rValue = *(ckt->CKTstate0 + here->MESAvgs);
return (OK);
case MESA_VGD:
value->rValue = *(ckt->CKTstate0 + here->MESAvgd);
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) {
errMsg = MALLOC(strlen(msg)+1);
errRtn = "MESAask";
strcpy(errMsg,msg);
return(E_ASKCURRENT);
} else {
value->rValue = -*(ckt->CKTstate0 + here->MESAcd);
value->rValue -= *(ckt->CKTstate0 + here->MESAcg);
value->rValue *= here->MESAm;
}
return(OK);
case MESA_POWER :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
errMsg = MALLOC(strlen(msg)+1);
errRtn = "MESAask";
strcpy(errMsg,msg);
return(E_ASKPOWER);
} else {
value->rValue = *(ckt->CKTstate0 + here->MESAcd) *
*(ckt->CKTrhsOld + here->MESAdrainNode);
value->rValue += *(ckt->CKTstate0 + here->MESAcg) *
*(ckt->CKTrhsOld + here->MESAgateNode);
value->rValue -= (*(ckt->CKTstate0+here->MESAcd) +
*(ckt->CKTstate0 + here->MESAcg)) *
*(ckt->CKTrhsOld + here->MESAsourceNode);
value->rValue *= here->MESAm;
}
return(OK);
default:
return (E_BADPARM);
}
/* NOTREACHED */
}