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

📄 cfunc.mod

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 MOD
字号:
/* $Id: cfunc.mod,v 1.3 2005/08/23 08:21:01 pnenzi Exp $ *//*.......1.........2.........3.........4.........5.........6.........7.........8================================================================================FILE d_fdiv/cfunc.modCopyright 1991Georgia Tech Research Corporation, Atlanta, Ga. 30332All Rights ReservedPROJECT A-8503-405               AUTHORS                          10 Jul 1991     Jeffrey P. MurrayMODIFICATIONS       22 Aug 1991    Jeffrey P. Murray    30 Sep 1991    Jeffrey P. Murray                                   SUMMARY    This file contains the functional description of the f_div    (frequency divider) code model.INTERFACES           FILE                 ROUTINE CALLED         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 ====================*/#include <stdio.h>#include <ctype.h>#include <math.h>#include <string.h>                                      /*=== CONSTANTS ========================*//*=== MACROS ===========================*/  /*=== LOCAL VARIABLES & TYPEDEFS =======*/                                        /*=== FUNCTION PROTOTYPE DEFINITIONS ===*/                   /*==============================================================================FUNCTION cm_d_fdiv()AUTHORS                          10 Jul 1991     Jeffrey P. MurrayMODIFICATIONS       22 Aug 1991    Jeffrey P. Murray    30 Sep 1991    Jeffrey P. MurraySUMMARY    This function implements the d_fdiv code model.INTERFACES           FILE                 ROUTINE CALLED         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_FDIV ROUTINE ===*//*************************************************      The following is the model for the       **   digital frequency divider for the           **   ATESSE Version 2.0 system.                  **                                               **   Created 7/10/91               J.P.Murray    *************************************************/void cm_d_fdiv(ARGS) {    int               div_factor;       /* division factor */                            Digital_State_t     *freq_in,       /* freq_in clock value      */                    *freq_in_old,       /* previous freq_in value   */                       *freq_out,       /* current output for fdiv  */                   *freq_out_old,       /* previous output for fdiv */                                                      *count,       /* counter value    */                      *count_old;       /* previous counter value    */    /*** Setup required state variables ***/    if(INIT) {  /* initial pass */         /* allocate storage */        freq_in = freq_in_old = (Digital_State_t *) cm_event_alloc(0,sizeof(Digital_State_t));        freq_out = freq_out_old = (Digital_State_t *) cm_event_alloc(1,sizeof(Digital_State_t));        count = count_old = (Digital_State_t *) cm_event_alloc(2,sizeof(Digital_State_t));        /* declare load values */        LOAD(freq_in) = PARAM(freq_in_load);        /* retrieve storage for the outputs */        freq_in = freq_in_old = (Digital_State_t *) cm_event_get_ptr(0,0);        freq_out = freq_out_old = (Digital_State_t *) cm_event_get_ptr(1,0);        count = count_old = (Digital_State_t *) cm_event_get_ptr(2,0);    }    else {      /* Retrieve previous values */                                                      /* retrieve storage for the outputs */        freq_in = (Digital_State_t *) cm_event_get_ptr(0,0);        freq_in_old = (Digital_State_t *) cm_event_get_ptr(0,1);        freq_out = (Digital_State_t *) cm_event_get_ptr(1,0);        freq_out_old = (Digital_State_t *) cm_event_get_ptr(1,1);        count = (Digital_State_t *) cm_event_get_ptr(2,0);        count_old = (Digital_State_t *) cm_event_get_ptr(2,1);    }                                                                    /*** Output the strength of freq_out (always strong)... ***/    OUTPUT_STRENGTH(freq_out) = STRONG;                  /** Retrieve parameters */    div_factor = PARAM(div_factor);                            /******* Determine analysis type and output appropriate values *******/    if (0.0 == TIME) {   /****** DC analysis...output w/o delays ******/                                          /* read initial count value, normalize, and if it is out of            bounds, set to "zero" equivalent */        *count = PARAM(i_count);        if ( (div_factor <= *count) || (0 > *count) ) {            *count = 0;            OUTPUT_STATE(freq_out) = *freq_out = *freq_out_old = ZERO;         }        if ( (0 < *count) && (*count <= PARAM(high_cycles)) ) {            OUTPUT_STATE(freq_out) = *freq_out = *freq_out_old = ONE;         }                        }    else {      /****** Transient Analysis ******/        /*** load current input value... ***/        *freq_in = INPUT_STATE(freq_in);                                             /**** Test to see if the input has provided an edge... ****/        if ( (*freq_in != *freq_in_old)&&(*freq_in == 1) ) {             /** An edge has been provided...revise count value **/            *count = *count_old + 1;            /* If new count value is equal to the div_factor+1 value,               need to normalize count to "1", and raise output */            if ( ((div_factor+1) == *count)||(1 == *count) ) {                *count = 1;                                                     OUTPUT_STATE(freq_out) = *freq_out = ONE;                OUTPUT_DELAY(freq_out) = PARAM(rise_delay);            }            else {                /* If new count value is equal to the                    high_cycles+1 value, drop the output to ZERO   */                if ( ( PARAM(high_cycles)+1) == *count ) {                    OUTPUT_STATE(freq_out) = *freq_out = ZERO;                    OUTPUT_DELAY(freq_out) = PARAM(fall_delay);                }                else {                    OUTPUT_CHANGED(freq_out) = FALSE;                }            }        }        else { /** Output does not change!! **/            OUTPUT_CHANGED(freq_out) = FALSE;        }    }}       

⌨️ 快捷键说明

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