120 lines
3.5 KiB
C
120 lines
3.5 KiB
C
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1987 Thomas L. Quarles
|
|
**********/
|
|
/*
|
|
*/
|
|
|
|
/*
|
|
* This routine gives access to the internal device parameters
|
|
* of independent Voltage SouRCe
|
|
*/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "ngspice/devdefs.h"
|
|
#include "ngspice/ifsim.h"
|
|
#include "vsrcdefs.h"
|
|
#include "ngspice/sperror.h"
|
|
#include "ngspice/suffix.h"
|
|
|
|
|
|
/* ARGSUSED */
|
|
int
|
|
VSRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
|
|
{
|
|
VSRCinstance *here = (VSRCinstance*)inst;
|
|
static char *msg = "Current and power not available in ac analysis";
|
|
int temp;
|
|
double *v, *w;
|
|
|
|
NG_IGNORE(select);
|
|
|
|
switch(which) {
|
|
case VSRC_DC:
|
|
value->rValue = here->VSRCdcValue;
|
|
return (OK);
|
|
case VSRC_AC_MAG:
|
|
value->rValue = here->VSRCacMag;
|
|
return (OK);
|
|
case VSRC_AC_PHASE:
|
|
value->rValue = here->VSRCacPhase;
|
|
return (OK);
|
|
case VSRC_PULSE:
|
|
case VSRC_SINE:
|
|
case VSRC_EXP:
|
|
case VSRC_PWL:
|
|
case VSRC_SFFM:
|
|
case VSRC_AM:
|
|
case VSRC_TRNOISE:
|
|
case VSRC_TRRANDOM:
|
|
case VSRC_FCN_COEFFS:
|
|
temp = value->v.numValue = here->VSRCfunctionOrder;
|
|
v = value->v.vec.rVec = TMALLOC(double, here->VSRCfunctionOrder);
|
|
w = here->VSRCcoeffs;
|
|
while (temp--)
|
|
*v++ = *w++;
|
|
return (OK);
|
|
case VSRC_AC:
|
|
value->v.numValue = 2;
|
|
value->v.vec.rVec = TMALLOC(double, value->v.numValue);
|
|
value->v.vec.rVec[0] = here->VSRCacMag;
|
|
value->v.vec.rVec[1] = here->VSRCacPhase;
|
|
return (OK);
|
|
case VSRC_NEG_NODE:
|
|
value->iValue = here->VSRCnegNode;
|
|
return (OK);
|
|
case VSRC_POS_NODE:
|
|
value->iValue = here->VSRCposNode;
|
|
return (OK);
|
|
case VSRC_FCN_TYPE:
|
|
value->iValue = here->VSRCfunctionType;
|
|
return (OK);
|
|
case VSRC_AC_REAL:
|
|
value->rValue = here->VSRCacReal;
|
|
return (OK);
|
|
case VSRC_AC_IMAG:
|
|
value->rValue = here->VSRCacImag;
|
|
return (OK);
|
|
case VSRC_R:
|
|
value->rValue = here->VSRCr;
|
|
return (OK);
|
|
case VSRC_TD:
|
|
value->rValue = here->VSRCrdelay;
|
|
return (OK);
|
|
case VSRC_FCN_ORDER:
|
|
value->rValue = here->VSRCfunctionOrder;
|
|
return (OK);
|
|
case VSRC_CURRENT:
|
|
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
|
errMsg = TMALLOC(char, strlen(msg) + 1);
|
|
errRtn = "VSRCask";
|
|
strcpy(errMsg,msg);
|
|
return(E_ASKCURRENT);
|
|
} else {
|
|
value->rValue = *(ckt->CKTrhsOld+here->VSRCbranch);
|
|
}
|
|
return(OK);
|
|
case VSRC_POWER:
|
|
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
|
errMsg = TMALLOC(char, strlen(msg) + 1);
|
|
errRtn = "VSRCask";
|
|
strcpy(errMsg,msg);
|
|
return(E_ASKPOWER);
|
|
} else {
|
|
value->rValue = (*(ckt->CKTrhsOld+here->VSRCposNode)
|
|
- *(ckt->CKTrhsOld + here->VSRCnegNode)) *
|
|
-*(ckt->CKTrhsOld + here->VSRCbranch);
|
|
}
|
|
return(OK);
|
|
#ifdef SHARED_MODULE
|
|
case VSRC_EXTERNAL:
|
|
/* Don't do anything */
|
|
return (OK);
|
|
#endif
|
|
default:
|
|
return (E_BADPARM);
|
|
}
|
|
/* NOTREACHED */
|
|
}
|