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

📄 mifdelete.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/*============================================================================FILE    MIFdelete.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 the function used by SPICE to delete an    instance and its allocated data structures from the internal    circuit description data structures.INTERFACES    MIFdelete()REFERENCED FILES    None.NON-STANDARD FEATURES    None.============================================================================*/#include <stdio.h>#include "ngspice.h"#include "sperror.h"#include "gendefs.h"#include "mifproto.h"#include "mifdefs.h"#include "suffix.h"/*MIFdeleteThis function deletes a particular instance from the linked listof instance structures, freeing all dynamically allocated memoryused by the instance structure.*/intMIFdelete(    GENmodel    *inModel,   /* The head of the model list */    IFuid       name,       /* The name of the instance to delete */    GENinstance **inst      /* The instance structure to delete */){    MIFmodel    *model;    MIFinstance **fast;    MIFinstance **prev;    MIFinstance *here=NULL;    Mif_Boolean_t  found;    int         i;    int         j;    int         k;    int         num_conn;    int         num_port;    int         num_inst_var;    /* Convert generic pointers in arg list to MIF specific pointers */    model = (MIFmodel *) inModel;    fast  = (MIFinstance **) inst;    /*******************************************/    /* Cut the instance out of the linked list */    /*******************************************/    /* Loop through all models */    for(found = MIF_FALSE; model; model = model->MIFnextModel) {        prev = &(model->MIFinstances);        /* Loop through all instances of this model */        for(here = *prev; here; here = here->MIFnextInstance) {            /* If name or pointer matches, cut it out and mark that its found */            if(here->MIFname == name || (fast && here == *fast) ) {                *prev= here->MIFnextInstance;                found = MIF_TRUE;                break;            }            prev = &(here->MIFnextInstance);        }        if(found)            break;    }    /* Return error if not found */    if(!found)        return(E_NODEV);    /*******************************/    /* Free the instance structure */    /*******************************/    /* Loop through all connections on the instance */    /* and dismantle the stuff allocated during readin/setup */    /* in MIFinit_inst, MIFget_port, and MIFsetup   */    num_conn = here->num_conn;    for(i = 0; i < num_conn; i++) {        /* If connection never used, skip it */        if(here->conn[i]->is_null)            continue;        /* If analog output, lots to free... */        if(here->conn[i]->is_output && here->analog) {            num_port = here->conn[i]->size;            /* For each port on the connector */            for(j = 0; j < num_port; j++) {                /* Free the partial/ac_gain/smp stuff allocated in MIFsetup */                for(k = 0; k < num_conn; k++) {                    if((here->conn[k]->is_null) || (! here->conn[k]->is_input) )                        continue;                    FREE(here->conn[i]->port[j]->partial[k].port);                    FREE(here->conn[i]->port[j]->ac_gain[k].port);                    FREE(here->conn[i]->port[j]->smp_data.input[k].port);                }                FREE(here->conn[i]->port[j]->partial);                FREE(here->conn[i]->port[j]->ac_gain);                FREE(here->conn[i]->port[j]->smp_data.input);                /* but don't free strings.  They are either not owned */                /* by the inst or are part of tokens.  SPICE3C1 never */                /* frees tokens, so we don't either... */            }        }        /* Free the basic port structure allocated in MIFget_port */        num_port = here->conn[i]->size;        for(j = 0; j < num_port; j++)            FREE(here->conn[i]->port[j]);        FREE(here->conn[i]->port);    }    /* Free the connector stuff allocated in MIFinit_inst */    /* Don't free name/description!  They are not owned */    /* by the instance */    for(i = 0; i < num_conn; i++) {        FREE(here->conn[i]);    }    FREE(here->conn);    /* Loop through all instance variables on the instance */    /* and free stuff */    num_inst_var = here->num_inst_var;    for(i = 0; i < num_inst_var; i++) {        if(here->inst_var[i]->element != NULL) {            FREE(here->inst_var[i]->element);        }        FREE(here->inst_var[i]);    }    FREE(here->inst_var);    /* ************************************************************* */    /* Dont free params here.  They are not currently implemented on */    /* a per-instance basis, so their allocated space is owned by    */    /* the parent model, not the instance. Param stuff will be freed */    /* by MIFmDelete                                                 */    /* ************************************************************* */    /* Free the stuff used by the cm_... functions */    if(here->num_state && here->state)        FREE(here->state);    if(here->num_intgr && here->intgr)        FREE(here->intgr);    if(here->num_conv && here->conv)        FREE(here->conv);    /* Finally, free the instance struct itself */    FREE(here);    return(OK);}

⌨️ 快捷键说明

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