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

📄 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 d_tff/cfunc.modCopyright 1991Georgia Tech Research Corporation, Atlanta, Ga. 30332All Rights ReservedPROJECT A-8503-405               AUTHORS                         24 June 1991     Jeffrey P. MurrayMODIFICATIONS       12 Aug 1991    Jeffrey P. Murray     2 Oct 1991    Jeffrey P. Murray    29 Jan 1992    Jeffrey P. Murray                                   SUMMARY    This file contains the model-specific routines used to    functionally describe the d_tff 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 ===*/                   /*=============================================================================*//*=== CM<model_name> ROUTINE ===*//*==============================================================================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_d_tff()AUTHORS                          24 Jun 1991     Jeffrey P. MurrayMODIFICATIONS       29 Jan 1992     Jeffrey P. MurraySUMMARY    This function implements the d_tff 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_TFF ROUTINE ===*//*************************************************      The following is the model for the       **   digital t-type flip flop for the            **   ATESSE Version 2.0 system.                  **                                               **   Created 6/24/91               J.P.Murray    *************************************************/void cm_d_tff(ARGS) {    /*int                    i;*/   /* generic loop counter index */                            Digital_State_t     *clk,   /* current clk value    */                    *clk_old,   /* previous clk value   */                        *set,   /* current set value for dff    */                    *set_old,   /* previous set value for dff   */                      *reset,   /* current reset value for dff      */                  *reset_old,   /* previous reset value for dff     */                        *out,   /* current output for dff   */                    *out_old,   /* previous output for dff  */                                            toggle_input,   /* current toggle input value    */                                                    temp;   /* temp storage for state values    */                                /*** Setup required state variables ***/    if(INIT) {  /* initial pass */         /* allocate storage */        clk = clk_old = (Digital_State_t *) cm_event_alloc(0,sizeof(Digital_State_t));        set = set_old = (Digital_State_t *) cm_event_alloc(1,sizeof(Digital_State_t));        reset = reset_old = (Digital_State_t *) cm_event_alloc(2,sizeof(Digital_State_t));        out = out_old = (Digital_State_t *) cm_event_alloc(3,sizeof(Digital_State_t));        /* declare load values */        LOAD(t) = PARAM(t_load);        LOAD(clk) = PARAM(clk_load);        if ( !PORT_NULL(set) ) {            LOAD(set) = PARAM(set_load);        }        if ( !PORT_NULL(reset) ) {        LOAD(reset) = PARAM(reset_load);        }        /* retrieve storage for the outputs */        clk = clk_old = (Digital_State_t *) cm_event_get_ptr(0,0);        set = set_old = (Digital_State_t *) cm_event_get_ptr(1,0);        reset = reset_old = (Digital_State_t *) cm_event_get_ptr(2,0);        out = out_old = (Digital_State_t *) cm_event_get_ptr(3,0);    }    else {      /* Retrieve previous values */                                                      /* retrieve storage for the outputs */        clk = (Digital_State_t *) cm_event_get_ptr(0,0);        clk_old = (Digital_State_t *) cm_event_get_ptr(0,1);        set = (Digital_State_t *) cm_event_get_ptr(1,0);        set_old = (Digital_State_t *) cm_event_get_ptr(1,1);        reset = (Digital_State_t *) cm_event_get_ptr(2,0);        reset_old = (Digital_State_t *) cm_event_get_ptr(2,1);        out = (Digital_State_t *) cm_event_get_ptr(3,0);        out_old = (Digital_State_t *) cm_event_get_ptr(3,1);    }    /******** load current input values if set or reset               are not connected, set to zero... ********/    *clk = INPUT_STATE(clk);    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 ( (*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;        }        cm_toggle_bit(&temp);        if ( !PORT_NULL(Nout) ) {            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 */                        /* output goes to ONE */                        *out = ONE;                        if ( !PORT_NULL(out) ) {                            OUTPUT_STATE(out) = ONE;                            OUTPUT_DELAY(out) = PARAM(set_delay);                        }                        if ( !PORT_NULL(Nout) ) {                            OUTPUT_STATE(Nout) = ZERO;                            OUTPUT_DELAY(Nout) = PARAM(set_delay);                        }                    }                    else {                        *out = *out_old;     /* output already set */                        if ( !PORT_NULL(out) ) {                            OUTPUT_CHANGED(out) = FALSE;                        }                        if ( !PORT_NULL(Nout) ) {                            OUTPUT_CHANGED(Nout) = FALSE;                        }                    }

⌨️ 快捷键说明

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