/********** 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 */ }