vcvsask.c

来自「支持数字元件仿真的SPICE插件」· C语言 代码 · 共 153 行

C
153
字号
/* * Copyright (c) 1987 Thomas L. Quarles *//* * This routine gives access to the internal device parameters * of Voltage Controlled Voltage Source */#include "prefix.h"#include <stdio.h>#include <math.h>#include "CKTdefs.h"#include "DEVdefs.h"#include "IFsim.h"#include "VCVSdefs.h"#include "SPerror.h"#include "util.h"#include "suffix.h"RCSID("VCVSask.c $Revision: 1.1 $ on $Date: 90/10/11 12:47:22 $")/* ARGSUSED */intVCVSask(ckt,inst,which,value,select)    CKTcircuit *ckt;    GENinstance *inst;    int which;    IFvalue *value;    IFvalue *select;{    VCVSinstance *here = (VCVSinstance *)inst;    double vr;    double vi;    double sr;    double si;    double vm;    static char *msg = "Current and power not available for ac analysis";    switch(which) {        case VCVS_POS_NODE:            value->iValue = here->VCVSposNode;            return (OK);        case VCVS_NEG_NODE:            value->iValue = here->VCVSnegNode;            return (OK);        case VCVS_CONT_P_NODE:            value->iValue = here->VCVScontPosNode;            return (OK);        case VCVS_CONT_N_NODE:            value->iValue = here->VCVScontNegNode;            return (OK);        case VCVS_IC:            value->rValue = here->VCVSinitCond;            return (OK);        case VCVS_GAIN:            value->rValue = here->VCVScoeff;            return (OK);        case VCVS_CONT_V_OLD:            value->rValue = *(ckt->CKTstate0 + here->VCVScontVOld);            return (OK);        case VCVS_BR:            value->iValue = here->VCVSbranch;            return (OK);        case VCVS_QUEST_SENS_DC:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+                        here->VCVSsenParmNo);            }            return(OK);        case VCVS_QUEST_SENS_REAL:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->VCVSsenParmNo);            }            return(OK);        case VCVS_QUEST_SENS_IMAG:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->VCVSsenParmNo);            }            return(OK);        case VCVS_QUEST_SENS_MAG:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = sqrt(vr*vr + vi*vi);                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->VCVSsenParmNo);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->VCVSsenParmNo);                value->rValue = (vr * sr + vi * si)/vm;            }            return(OK);        case VCVS_QUEST_SENS_PH:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = vr*vr + vi*vi;                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->VCVSsenParmNo);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->VCVSsenParmNo);                value->rValue =  (vr * si - vi * sr)/vm;            }            return(OK);        case VCVS_QUEST_SENS_CPLX:            if(ckt->CKTsenInfo){                value->cValue.real=                         *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->VCVSsenParmNo);                value->cValue.imag=                         *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->VCVSsenParmNo);            }            return(OK);        case VCVS_CURRENT :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "VCVSask";                strcpy(errMsg,msg);                return(E_ASKCURRENT);            } else {                value->rValue = *(ckt->CKTrhsOld + here->VCVSbranch);            }            return(OK);        case VCVS_POWER :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "VCVSask";                strcpy(errMsg,msg);                return(E_ASKPOWER);            } else {                value->rValue = *(ckt->CKTrhsOld + here->VCVSbranch) *                        (*(ckt->CKTrhsOld + here->VCVSposNode) -                         *(ckt->CKTrhsOld + here->VCVSnegNode));            }            return(OK);        default:            return (E_BADPARM);    }    /* NOTREACHED */}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?