⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmmeters.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/* ===========================================================================FILE    CMmeters.cMEMBER OF process XSPICECopyright 1991Georgia Tech Research CorporationAtlanta, Georgia 30332All Rights ReservedPROJECT A-8503AUTHORS    9/12/91  Bill KuhnMODIFICATIONS    <date> <person name> <nature of modifications>SUMMARY    This file contains functions callable from code models.    These functions are primarily designed for use by the    "cmeter" and "lmeter" models provided in the XSPICE    code model library.INTERFACES    cm_netlist_get_c()    cm_netlist_get_l()REFERENCED FILES    None.NON-STANDARD FEATURES    None.=========================================================================== */#include "ngspice.h"#include "cm.h"#include "mif.h"#include "cktdefs.h"#include "mifdefs.h"#include "cap/capdefs.h"#include "ind/inddefs.h"#include "vsrc/vsrcdefs.h"#include "inpdefs.h"/*cm_netlist_get_c()This is a special function designed for use with the c_metermodel.  It returns the parallel combination of the capacitanceconnected to the first port on the instance.*/double cm_netlist_get_c(){    CKTcircuit          *ckt;        MIFinstance         *cmeter_inst;    CAPinstance         *cap_inst;    VSRCinstance        *vsrc_inst;    CAPmodel            *cap_head;    CAPmodel            *cap_model;    VSRCmodel           *vsrc_head;    VSRCmodel           *vsrc_model;    int                 cap_type;    int                 vsrc_type;    int                 cmeter_node;    int                 vsrc_node;    double              c;    /* Get the circuit data structure and current instance */    ckt = g_mif_info.ckt;    cmeter_inst = g_mif_info.instance;    /* Get internal node number for positive node of cmeter input */    cmeter_node = cmeter_inst->conn[0]->port[0]->smp_data.pos_node;    /* Initialize total capacitance value to zero */    c = 0.0;    /* ****************************************************** */    /* Look for capacitors connected directly to cmeter input */    /* ****************************************************** */    /* Get the head of the list of capacitor models in the circuit */    cap_type = INPtypelook("Capacitor");    if(cap_type < 0) {        printf("\nERROR - Capacitor type not supported in this binary\n");        return(0);    }    cap_head = (CAPmodel *) ckt->CKThead[cap_type];    /* Scan through all capacitor instances and add in values */    /* of any capacitors connected to cmeter input */    for(cap_model = cap_head; cap_model; cap_model = cap_model->CAPnextModel) {        for(cap_inst = cap_model->CAPinstances;                cap_inst;                cap_inst = cap_inst->CAPnextInstance) {            if((cmeter_node == cap_inst->CAPposNode) ||                    (cmeter_node == cap_inst->CAPnegNode)) {                c += cap_inst->CAPcapac;            }        }    }    /* ***************************************************************** */    /* Look for capacitors connected through zero-valued voltage sources */    /* ***************************************************************** */    /* Get the head of the list of voltage source models in the circuit */    vsrc_type = INPtypelook("Vsource");    if(vsrc_type < 0) {        printf("\nERROR - Vsource type not supported in this binary\n");        return(0);    }    vsrc_head = (VSRCmodel *) ckt->CKThead[vsrc_type];    /* Scan through all voltage source instances and add in values */    /* of any capacitors connected to cmeter input through voltage source */    for(vsrc_model = vsrc_head; vsrc_model; vsrc_model = vsrc_model->VSRCnextModel) {        for(vsrc_inst = vsrc_model->VSRCinstances;                vsrc_inst;                vsrc_inst = vsrc_inst->VSRCnextInstance) {            /* Skip to next if not DC source with value = 0.0 */            if((vsrc_inst->VSRCfunctionType != 0) ||                    (vsrc_inst->VSRCdcValue != 0.0))                continue;            /* See if voltage source is connected to cmeter input */            /* If so, get other node voltage source is connected to */            /* If not, skip to next source */            if(cmeter_node == vsrc_inst->VSRCposNode)                vsrc_node = vsrc_inst->VSRCnegNode;            else if(cmeter_node == vsrc_inst->VSRCnegNode)                vsrc_node = vsrc_inst->VSRCposNode;            else                continue;            /* Scan through all capacitor instances and add in values */            /* of any capacitors connected to the voltage source node */            for(cap_model = cap_head; cap_model; cap_model = cap_model->CAPnextModel) {                for(cap_inst = cap_model->CAPinstances;                        cap_inst;                        cap_inst = cap_inst->CAPnextInstance) {                    if((vsrc_node == cap_inst->CAPposNode) ||                            (vsrc_node == cap_inst->CAPnegNode)) {                        c += cap_inst->CAPcapac;                    }                }            }        } /* end for all vsrc instances */    } /* end for all vsrc models */    /* Return the total capacitance value */    return(c);}/*cm_netlist_get_l()This is a special function designed for use with the l_metermodel.  It returns the equivalent value of inductanceconnected to the first port on the instance.*/double cm_netlist_get_l(){    CKTcircuit          *ckt;        MIFinstance         *lmeter_inst;    INDinstance         *ind_inst;    VSRCinstance        *vsrc_inst;    INDmodel            *ind_head;    INDmodel            *ind_model;    VSRCmodel           *vsrc_head;    VSRCmodel           *vsrc_model;    int                 ind_type;    int                 vsrc_type;    int                 lmeter_node;    int                 vsrc_node;    double              l;    /* Get the circuit data structure and current instance */    ckt = g_mif_info.ckt;    lmeter_inst = g_mif_info.instance;    /* Get internal node number for positive node of lmeter input */    lmeter_node = lmeter_inst->conn[0]->port[0]->smp_data.pos_node;    /* Initialize total inductance to infinity */    l = 1.0e12;    /* ****************************************************** */    /* Look for inductors connected directly to lmeter input */    /* ****************************************************** */    /* Get the head of the list of inductor models in the circuit */    ind_type = INPtypelook("Inductor");    if(ind_type < 0) {        printf("\nERROR - Inductor type not supported in this binary\n");        return(0);    }    ind_head = (INDmodel *) ckt->CKThead[ind_type];    /* Scan through all inductor instances and add in values */    /* of any inductors connected to lmeter input */    for(ind_model = ind_head; ind_model; ind_model = ind_model->INDnextModel) {        for(ind_inst = ind_model->INDinstances;                ind_inst;                ind_inst = ind_inst->INDnextInstance) {            if((lmeter_node == ind_inst->INDposNode) ||                    (lmeter_node == ind_inst->INDnegNode)) {                l = 1.0 / ( (1.0 / l) + (1.0 / ind_inst->INDinduct) );            }        }    }    /* ***************************************************************** */    /* Look for inductors connected through zero-valued voltage sources */    /* ***************************************************************** */    /* Get the head of the list of voltage source models in the circuit */    vsrc_type = INPtypelook("Vsource");    if(vsrc_type < 0) {        printf("\nERROR - Vsource type not supported in this binary\n");        return(0);    }    vsrc_head = (VSRCmodel *) ckt->CKThead[vsrc_type];    /* Scan through all voltage source instances and add in values */    /* of any inductors connected to lmeter input through voltage source */    for(vsrc_model = vsrc_head; vsrc_model; vsrc_model = vsrc_model->VSRCnextModel) {        for(vsrc_inst = vsrc_model->VSRCinstances;                vsrc_inst;                vsrc_inst = vsrc_inst->VSRCnextInstance) {            /* Skip to next if not DC source with value = 0.0 */            if((vsrc_inst->VSRCfunctionType != 0) ||                    (vsrc_inst->VSRCdcValue != 0.0))                continue;            /* See if voltage source is connected to lmeter input */            /* If so, get other node voltage source is connected to */            /* If not, skip to next source */            if(lmeter_node == vsrc_inst->VSRCposNode)                vsrc_node = vsrc_inst->VSRCnegNode;            else if(lmeter_node == vsrc_inst->VSRCnegNode)                vsrc_node = vsrc_inst->VSRCposNode;            else                continue;            /* Scan through all inductor instances and add in values */            /* of any inductors connected to the voltage source node */            for(ind_model = ind_head; ind_model; ind_model = ind_model->INDnextModel) {                for(ind_inst = ind_model->INDinstances;                        ind_inst;                        ind_inst = ind_inst->INDnextInstance) {                    if((vsrc_node == ind_inst->INDposNode) ||                            (vsrc_node == ind_inst->INDnegNode)) {                        l = 1.0 / ( (1.0 / l) + (1.0 / ind_inst->INDinduct) );                    }                }            }        } /* end for all vsrc instances */    } /* end for all vsrc models */    /* Return the total capacitance value */    return(l);}

⌨️ 快捷键说明

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