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

📄 cfunc.mod

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 MOD
📖 第 1 页 / 共 2 页
字号:
/* $Id: cfunc.mod,v 1.4 2005/08/23 08:21:01 pnenzi Exp $ *//*.......1.........2.........3.........4.........5.........6.........7.........8================================================================================FILE <model_name>/cfunc.modCopyright 1991Georgia Tech Research Corporation, Atlanta, Ga. 30332All Rights ReservedPROJECT A-8503-405               AUTHORS                          25 Jun 1991     Jeffrey P. MurrayMODIFICATIONS       13 Aug 1991     Jeffrey P. Murray    30 Sep 1991     Jeffrey P. Murray    29 Jan 1992     Jeffrey P. Murray                                   SUMMARY    This file contains the model-specific routines used to    functionally describe the <model_name> code model.INTERFACES           FILE                 ROUTINE CALLED         CMutil.c             void cm_toggle_bit();     CMevt.c              void *cm_event_alloc()                         void *cm_event_get_ptr()REFERENCED FILES    Inputs from and outputs to ARGS structure.                     NON-STANDARD FEATURES    NONE===============================================================================*//*=== INCLUDE FILES ====================*/                                      /*=== CONSTANTS ========================*//*=== MACROS ===========================*/  /*=== LOCAL VARIABLES & TYPEDEFS =======*/                                        /*=== FUNCTION PROTOTYPE DEFINITIONS ===*/                                      /*==============================================================================FUNCTION cm_toggle_bit()AUTHORS                          27 Sept 1991     Jeffrey P. MurrayMODIFICATIONS       NONESUMMARY    Alters the state of a passed digital variable to its    complement. Thus, a ONE changes to a ZERO. A ZERO changes    to a ONE, and an UNKNOWN remains unchanged.INTERFACES           FILE                 ROUTINE CALLED         N/A                  N/ARETURNED VALUE        No returned value. Passed pointer to variable is used     to redefine the variable value.           GLOBAL VARIABLES        NONENON-STANDARD FEATURES    NONE                                                   ===============================================================================*//*=== CM_TOGGLE_BIT ROUTINE ===*/static void cm_toggle_bit(Digital_State_t *bit) {    /* Toggle bit from ONE to ZERO or vice versa, unless the       bit value is UNKNOWN. In the latter case, return        without changing the bit value.                      */    if ( UNKNOWN != *bit ) {        if ( ONE == *bit ) {            *bit = ZERO;        }        else {             *bit = ONE;        }    }}                   /*==============================================================================FUNCTION cm_eval_sr_resultAUTHORS                          30 Sept 1991     Jeffrey P. MurrayMODIFICATIONS       NONESUMMARY    Evaluates the S and R input states, plus the last state of    the latch, and returns the expected output value.INTERFACES           FILE                 ROUTINE CALLED         CMutil.c             void cm_toggle_bit(); RETURNED VALUE        A Digital_State_t.           GLOBAL VARIABLES        NONENON-STANDARD FEATURES    NONE==============================================================================*//*=== CM_EVAL_SR_RESULT ROUTINE ===*/static Digital_State_t cm_eval_sr_result(Digital_State_t s_input,                                         Digital_State_t r_input,                                         Digital_State_t old_output){    Digital_State_t     output = ZERO;    switch (s_input) {    case ZERO:        switch (r_input) {        case ZERO:             output = old_output;            break;        case ONE:            output = ZERO;            break;        case UNKNOWN:            output = UNKNOWN;            break;        }        break;     case ONE:        switch (r_input) {        case ZERO:             output = ONE;            break;        case ONE:            output = UNKNOWN;            break;        case UNKNOWN:            output = UNKNOWN;            break;        }        break;                 case UNKNOWN:        output = UNKNOWN;        break;     }        return output;}                   /*==============================================================================FUNCTION cm_d_srlatch()AUTHORS                          25 Jun 1991     Jeffrey P. MurrayMODIFICATIONS       13 Aug 1991     Jeffrey P. Murray    30 Sep 1991     Jeffrey P. Murray    29 Jan 1992     Jeffrey P. MurraySUMMARY    This function implements the d_srlatch code model.INTERFACES           FILE                 ROUTINE CALLED         CMutil.c             void cm_toggle_bit();     CMevt.c              void *cm_event_alloc()                         void *cm_event_get_ptr()RETURNED VALUE        Returns inputs and outputs via ARGS structure.GLOBAL VARIABLES        NONENON-STANDARD FEATURES    NONE==============================================================================*//*=== CM_D_SRLATCH ROUTINE ===*//*************************************************      The following is the model for the       **   digital sr-type latch for the               **   ATESSE Version 2.0 system.                  **                                               **   Created 6/25/91               J.P.Murray    *************************************************/void cm_d_srlatch(ARGS) {    /*int                    i;*/   /* generic loop counter index */                            Digital_State_t       *s,   /* current s-input value    */                      *s_old,   /* previous s-input value   */                          *r,   /* current r-input value    */                      *r_old,   /* previous r-input value   */                     *enable,   /* current enable value    */                 *enable_old,   /* previous enable value   */                        *set,   /* current set value for srlatch    */                    *set_old,   /* previous set value for srlatch   */                      *reset,   /* current reset value for srlatch      */                  *reset_old,   /* previous reset value for srlatch     */                        *out,   /* current output for srlatch   */                    *out_old,   /* previous output for srlatch  */                                                    temp;   /* temp storage for state values    */                                /*** Setup required state variables ***/    if(INIT) {  /* initial pass */         /* allocate storage */        s = s_old = (Digital_State_t *) cm_event_alloc(0,sizeof(Digital_State_t));        r = r_old = (Digital_State_t *) cm_event_alloc(1,sizeof(Digital_State_t));        enable = enable_old = (Digital_State_t *) cm_event_alloc(2,sizeof(Digital_State_t));        set = set_old = (Digital_State_t *) cm_event_alloc(3,sizeof(Digital_State_t));        reset = reset_old = (Digital_State_t *) cm_event_alloc(4,sizeof(Digital_State_t));        out = out_old = (Digital_State_t *) cm_event_alloc(5,sizeof(Digital_State_t));        /* declare load values */        LOAD(s) = PARAM(sr_load);        LOAD(r) = PARAM(sr_load);        LOAD(enable) = PARAM(enable_load);        if ( !PORT_NULL(set) ) {            LOAD(set) = PARAM(set_load);        }        if ( !PORT_NULL(reset) ) {        LOAD(reset) = PARAM(reset_load);        }        /* retrieve storage for the outputs */        s = s_old = (Digital_State_t *) cm_event_get_ptr(0,0);        r = r_old = (Digital_State_t *) cm_event_get_ptr(1,0);        enable = enable_old = (Digital_State_t *) cm_event_get_ptr(2,0);        set = set_old = (Digital_State_t *) cm_event_get_ptr(3,0);        reset = reset_old = (Digital_State_t *) cm_event_get_ptr(4,0);        out = out_old = (Digital_State_t *) cm_event_get_ptr(5,0);    }    else {      /* Retrieve previous values */                                                      /* retrieve storage for the outputs */        s = (Digital_State_t *) cm_event_get_ptr(0,0);        s_old = (Digital_State_t *) cm_event_get_ptr(0,1);        r = (Digital_State_t *) cm_event_get_ptr(1,0);        r_old = (Digital_State_t *) cm_event_get_ptr(1,1);        enable = (Digital_State_t *) cm_event_get_ptr(2,0);        enable_old = (Digital_State_t *) cm_event_get_ptr(2,1);        set = (Digital_State_t *) cm_event_get_ptr(3,0);        set_old = (Digital_State_t *) cm_event_get_ptr(3,1);        reset = (Digital_State_t *) cm_event_get_ptr(4,0);        reset_old = (Digital_State_t *) cm_event_get_ptr(4,1);        out = (Digital_State_t *) cm_event_get_ptr(5,0);        out_old = (Digital_State_t *) cm_event_get_ptr(5,1);    }    /******* load current input values if set or reset              are not connected, set to zero... *******/    *s = INPUT_STATE(s);    *r = INPUT_STATE(r);    *enable = INPUT_STATE(enable);    if ( PORT_NULL(set) ) {        *set = *set_old = ZERO;    }    else {        *set = INPUT_STATE(set);    }    if ( PORT_NULL(reset) ) {        *reset = *reset_old = ZERO;    }    else {        *reset = INPUT_STATE(reset);    }                                         /******* Determine analysis type and output appropriate values *******/    if (0.0 == TIME) {   /****** DC analysis...output w/o delays ******/                                                                       temp = PARAM(ic);        /** Modify output if set or reset lines are active **/        if ( (*enable==ONE) && (*s==ONE) && (*r==ZERO) ) temp = ONE;         if ( (*enable==ONE) && (*s==ZERO) && (*r==ONE) ) temp = ZERO;         if ( (*set==ONE) && (*reset==ZERO) ) temp = ONE;        if ( (*set==ZERO) && (*reset==ONE) ) temp = ZERO;        if ( (*set==ONE) && (*reset==ONE) ) temp = UNKNOWN;        *out = *out_old = temp;        if ( !PORT_NULL(out) ) {            OUTPUT_STATE(out) = temp;        }        if ( !PORT_NULL(Nout) ) {            cm_toggle_bit(&temp);            OUTPUT_STATE(Nout) = temp;        }    }    else {      /****** Transient Analysis ******/        /***** Find input that has changed... *****/        /**** Test set value for change ****/        if ( *set != *set_old ) { /* either set or set release */            switch ( *set ) {            case ONE:                if ( ONE != *reset) {                    if (*out_old != ONE) {  /* set will change output */

⌨️ 快捷键说明

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