diff --git a/src/xspice/icm/digital/d_source/cfunc.mod b/src/xspice/icm/digital/d_source/cfunc.mod index 643983a60..85243b8d1 100644 --- a/src/xspice/icm/digital/d_source/cfunc.mod +++ b/src/xspice/icm/digital/d_source/cfunc.mod @@ -8,17 +8,16 @@ Georgia Tech Research Corporation, Atlanta, Ga. 30332 All Rights Reserved PROJECT A-8503-405 - -AUTHORS + +AUTHORS 6 June 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 30 Sept 1991 Jeffrey P. Murray - SUMMARY @@ -26,22 +25,22 @@ SUMMARY functionally describe the code model. -INTERFACES +INTERFACES - FILE ROUTINE CALLED + FILE ROUTINE CALLED - CMmacros.h cm_message_send(); + CMmacros.h cm_message_send(); CMevt.c void *cm_event_alloc() void *cm_event_get_ptr() int cm_event_queue() - + REFERENCED FILES Inputs from and outputs to ARGS structure. - + NON-STANDARD FEATURES @@ -54,55 +53,50 @@ NON-STANDARD FEATURES #include "d_source.h" /* ...contains macros & type defns. for this model. 6/13/90 - JPM */ - /*=== CONSTANTS ========================*/ #define MAX_STRING_SIZE 200 - /*=== MACROS ===========================*/ - -/*=== LOCAL VARIABLES & TYPEDEFS =======*/ +/*=== LOCAL VARIABLES & TYPEDEFS =======*/ -typedef struct { +typedef struct { int index, /* current index into source tables */ width, /* width of table...equal to size of out port */ - depth; /* depth of table...equal to size of - "timepoints" array, and to the total - number of vectors retrieved from the + depth; /* depth of table...equal to size of + "timepoints" array, and to the total + number of vectors retrieved from the source.in file. */ } Source_Table_Info_t; - - /* Type definition for each possible token returned. */ typedef enum token_type_s {CNV_NO_TOK,CNV_STRING_TOK} Cnv_Token_Type_t; - - + + /*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - + /*============================================================================== FUNCTION *CNVgettok() -AUTHORS +AUTHORS 13 Jun 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 8 Aug 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -111,18 +105,18 @@ SUMMARY This function obtains the next token from an input stream. -INTERFACES +INTERFACES - FILE ROUTINE CALLED + FILE ROUTINE CALLED N/A N/A RETURNED VALUE - + Returns a string value representing the next token. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -175,9 +169,9 @@ static char *CNVgettok(char **s) /* or a mess o' characters. */ i = 0; while( (**s != '\0') && - (! ( isspace(**s) || (**s == '=') || - (**s == '(') || (**s == ')') || - (**s == ',') + (! ( isspace(**s) || (**s == '=') || + (**s == '(') || (**s == ')') || + (**s == ',') ) ) ) { buf[i] = **s; i++; @@ -209,11 +203,11 @@ static char *CNVgettok(char **s) FUNCTION *CNVget_token() -AUTHORS +AUTHORS 13 Jun 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 8 Aug 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -222,19 +216,19 @@ SUMMARY This function obtains the next token from an input stream. -INTERFACES +INTERFACES - FILE ROUTINE CALLED + FILE ROUTINE CALLED N/A N/A RETURNED VALUE - - Returns a string value representing the next token. Uses + + Returns a string value representing the next token. Uses *CNVget_tok. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -290,11 +284,11 @@ static char *CNVget_token(char **s, Cnv_Token_Type_t *type) FUNCTION cnv_get_spice_value() -AUTHORS +AUTHORS ??? Bill Kuhn -MODIFICATIONS +MODIFICATIONS 30 Sep 1991 Jeffrey P. Murray @@ -303,19 +297,19 @@ SUMMARY This function takes as input a string token from a SPICE deck and returns a floating point equivalent value. -INTERFACES +INTERFACES - FILE ROUTINE CALLED + FILE ROUTINE CALLED N/A N/A RETURNED VALUE - + Returns the floating point value in pointer *p_value. Also returns an integer representing successful completion. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -454,17 +448,17 @@ double *p_value ) /* OUT - The numerical value */ - + /*============================================================================== FUNCTION cm_source_mask_and_retrieve() -AUTHORS +AUTHORS 15 Jul 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 16 Jul 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -472,23 +466,23 @@ MODIFICATIONS SUMMARY Masks off and retrieves a two-bit value from a short - integer word passed to the function, using an offset value. - This effectively handles retrieval of eight two-bit values + integer word passed to the function, using an offset value. + This effectively handles retrieval of eight two-bit values from a single short integer space in order to conserve memory. -INTERFACES +INTERFACES + + FILE ROUTINE CALLED - FILE ROUTINE CALLED - N/A N/A RETURNED VALUE - + Returns a Digital_t value. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -511,7 +505,7 @@ NON-STANDARD FEATURES static void cm_source_mask_and_retrieve(short base,int bit_offset,Digital_t *out) { - + int value; /* the hexadecimal value of the masked bit */ @@ -575,11 +569,11 @@ static void cm_source_mask_and_retrieve(short base,int bit_offset,Digital_t *out FUNCTION cm_source_mask_and_store() -AUTHORS +AUTHORS 15 Jul 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 16 Jul 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -587,23 +581,23 @@ MODIFICATIONS SUMMARY Masks off and stores a two-bit value to a short - integer word passed to the function, using an offset value. - This effectively handles storage of eight two-bit values + integer word passed to the function, using an offset value. + This effectively handles storage of eight two-bit values to a single short integer space in order to conserve memory. -INTERFACES +INTERFACES + + FILE ROUTINE CALLED - FILE ROUTINE CALLED - N/A N/A RETURNED VALUE - + Returns updated *base value. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -637,11 +631,11 @@ static void cm_source_mask_and_store(short *base,int bit_offset,int bit_value) FUNCTION cm_get_source_value() -AUTHORS +AUTHORS 15 Jul 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 16 Jul 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -650,19 +644,19 @@ SUMMARY Retrieves four-bit data from short integer array "source". -INTERFACES +INTERFACES + + FILE ROUTINE CALLED - FILE ROUTINE CALLED - N/A N/A RETURNED VALUE - + Returns data via *out pointer. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -670,7 +664,7 @@ NON-STANDARD FEATURES NONE ==============================================================================*/ - + /*=== Static CM_GET_SOURCE_VALUE ROUTINE ===*/ /************************************************ @@ -693,10 +687,10 @@ static void cm_get_source_value(int word_width,int bit_number,int index, be found */ bit_offset; /* offset from ram base address at which bit[0] of the required word can be found */ - + short base; /* variable to hold current base integer for comparison purposes. */ - + /* obtain offset value from index, word_width & bit_number */ @@ -707,7 +701,7 @@ static void cm_get_source_value(int word_width,int bit_number,int index, /* retrieve entire base_address bits integer... */ base = bits[bit_index]; - + /* for each offset, mask off the bits and determine values */ cm_source_mask_and_retrieve(base,bit_offset,out); @@ -720,11 +714,11 @@ static void cm_get_source_value(int word_width,int bit_number,int index, FUNCTION cm_read_source() -AUTHORS +AUTHORS 15 Jul 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 19 Jul 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -734,19 +728,19 @@ SUMMARY This function reads the source file and stores the results for later output by the model. -INTERFACES +INTERFACES + + FILE ROUTINE CALLED - FILE ROUTINE CALLED - N/A N/A RETURNED VALUE - + Returns output bits stored in "bits" array. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -756,7 +750,7 @@ NON-STANDARD FEATURES ==============================================================================*/ /*=== Static CM_READ_SOURCE ROUTINE ===*/ - + /************************************************** * The following routine reads the file * @@ -774,43 +768,41 @@ static int cm_read_source(FILE *source,short *bits,double *timepoints, j, /* indexing variable */ num_tokens, /* number of tokens in a given string */ bit_index, /* index to which bits[] integer we are accessing */ - bit_offset, /* index to which bit within the current bits[] + bit_offset, /* index to which bit within the current bits[] integer we are accessing */ int1; /* temporary holding variable */ - Cnv_Token_Type_t type; /* variable for testing token type returned. */ - char temp[MAX_STRING_SIZE], /* holding string variable for testing input from source.in */ *s, /* main string variable */ *base_address, /* storage location for base address - of string. */ + of string. */ *token; /* a particular token from the string */ - - double number; /* holding variable for timepoint values */ - + + double number; /* holding variable for timepoint values */ + short bit_value, /* holding variable for value read from source file which needs to be stored */ - base; /* holding variable for existing + base; /* holding variable for existing non-masked bits[] integer */ - i = 0; + i = 0; s = temp; while ( fgets(s,MAX_STRING_SIZE,source) != NULL) { /* Test this string to see if it is whitespace... */ base_address = s; - while(isspace(*s) || (*s == '*')) + while(isspace(*s) || (*s == '*')) (s)++; if ( *s != '\0' ) { /* This is not a blank line, so process... */ s = base_address; if ( '*' != s[0] ) { - + /* Count up total number of tokens including \0... */ j = 0; type = CNV_STRING_TOK; @@ -819,47 +811,47 @@ static int cm_read_source(FILE *source,short *bits,double *timepoints, j++; } num_tokens = j; - + /* If this number is incorrect, return with an error */ if ( (info->width + 2) != num_tokens) { return 1; } - - /* reset s to beginning... */ + + /* reset s to beginning... */ s = base_address; - + /** Retrieve each token, analyze, and **/ /** store the timepoint and bit information **/ for (j=0; j<(info->width + 1); j++) { - + token = CNVget_token(&s, &type); - + if ( 0 == j ) { /* obtain timepoint value... */ - + /* convert to a floating point number... */ cnv_get_spice_value(token,&number); - + timepoints[i] = number; - - + + /* provided this is not the first timepoint to be written... */ if ( 0 != i ) { - + /* if current timepoint value is not greater - than the previous value, then return with + than the previous value, then return with an error message... */ if ( timepoints[i] <= timepoints[i-1] ) { return 1; } - } - + } + } else { /* obtain each bit value & set bits entry */ - + /* preset this bit location */ bit_value = 12; - + if (0 == strcmp(token,"0s")) bit_value = 0; if (0 == strcmp(token,"1s")) bit_value = 1; if (0 == strcmp(token,"Us")) bit_value = 2; @@ -872,29 +864,29 @@ static int cm_read_source(FILE *source,short *bits,double *timepoints, if (0 == strcmp(token,"0u")) bit_value = 9; if (0 == strcmp(token,"1u")) bit_value = 10; if (0 == strcmp(token,"Uu")) bit_value = 11; - + /* if this bit was not recognized, return with an error */ if (12 == bit_value) { - return 1; + return 1; } else { /* need to store this value in the bits[] array */ - - /* obtain offset value from word_number, word_width & + + /* obtain offset value from word_number, word_width & bit_number */ int1 = i * info->width + (j-1); bit_index = int1 >> 2; bit_offset = int1 & 3; - + /* retrieve entire base_address bits integer... */ base = bits[bit_index]; - + /* for each offset, mask off the bits and store values */ cm_source_mask_and_store(&base,bit_offset,bit_value); - + /* store modified base value */ - bits[bit_index] = base; + bits[bit_index] = base; } - } + } } i++; } @@ -903,20 +895,20 @@ static int cm_read_source(FILE *source,short *bits,double *timepoints, } return 0; } - - + + /*============================================================================== FUNCTION cm_d_source() -AUTHORS +AUTHORS 13 Jun 1991 Jeffrey P. Murray -MODIFICATIONS +MODIFICATIONS 8 Aug 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray @@ -925,11 +917,11 @@ SUMMARY This function implements the d_source code model. -INTERFACES +INTERFACES - FILE ROUTINE CALLED - - CMmacros.h cm_message_send(); + FILE ROUTINE CALLED + + CMmacros.h cm_message_send(); CMevt.c void *cm_event_alloc() void *cm_event_get_ptr() @@ -937,11 +929,11 @@ INTERFACES RETURNED VALUE - + Returns inputs and outputs via ARGS structure. GLOBAL VARIABLES - + NONE NON-STANDARD FEATURES @@ -961,25 +953,24 @@ NON-STANDARD FEATURES ************************************************/ -void cm_d_source(ARGS) +void cm_d_source(ARGS) { int i, /* generic loop counter index */ err, /* integer for storage of error status */ - test, /* testing integer */ - dummy; /* temp holding variable */ + test, /* testing integer */ + dummy; /* temp holding variable */ - - short *bits, /* the storage array for the + short *bits, /* the storage array for the output bit representations... this will have size equal to (width * depth)/4, since one short will hold four 12-state bit descriptions. */ - *bits_old; /* the storage array for old bit values */ + *bits_old; /* the storage array for old bit values */ - double *timepoints, /* the storage array for the - timepoints...this will have size equal + double *timepoints, /* the storage array for the + timepoints...this will have size equal to "depth" */ *timepoints_old; /* the storage array for the old timepoints */ volatile double /* enforce 64 bit precision, (equality comparison) */ @@ -995,27 +986,22 @@ void cm_d_source(ARGS) index and depth info. */ *info_old; /* storage location for old info */ - + Digital_t out; /* storage for each output bit */ - + char temp[MAX_STRING_SIZE], /* holding string variable for testing input from source.in */ - *s; /* main string variable */ + *s; /* main string variable */ char *loading_error = "\n***ERROR***\nD_SOURCE: source.in file was not read successfully. \n"; - - - /**** Setup required state variables ****/ - if(INIT) { /* initial pass */ - - + if(INIT) { /* initial pass */ /*** open file and count the number of vectors in it ***/ source = fopen_with_path( PARAM(input_file), "r"); @@ -1026,7 +1012,7 @@ void cm_d_source(ARGS) s = temp; while ( fgets(s,MAX_STRING_SIZE,source) != NULL) { if ( '*' != s[0] ) { - while(isspace(*s) || (*s == '*')) + while(isspace(*s) || (*s == '*')) (s)++; if ( *s != '\0' ) i++; } @@ -1037,43 +1023,32 @@ void cm_d_source(ARGS) /*** allocate storage for *index, *bits & *timepoints ***/ cm_event_alloc(0,sizeof(Source_Table_Info_t)); - - + dummy = (PORT_SIZE(out) * i + 3) >> 2; cm_event_alloc(1, dummy * (int) sizeof(short)); - + cm_event_alloc(2, i * (int) sizeof(double)); - /**** Get all pointers again (to avoid realloc problems) ****/ info = info_old = (Source_Table_Info_t *) cm_event_get_ptr(0,0); bits = bits_old = (short *) cm_event_get_ptr(1,0); timepoints = timepoints_old = (double *) cm_event_get_ptr(2,0); - - - /* Initialize info values... */ - info->index = 0; info->depth = i; /* Retrieve width of the source */ info->width = PORT_SIZE(out); - /* Initialize *bits & *timepoints to zero */ + for (i=0; idepth; i++) timepoints[i] = 0; - - - - - + for (i=0; idepth; i++) + timepoints[i] = 0; /* Send file pointer and the two array storage pointers */ /* to "cm_read_source()". This will return after */ @@ -1089,11 +1064,7 @@ void cm_d_source(ARGS) err=1; } - - - if (err) { /* problem occurred in load...send error msg. */ - cm_message_send(loading_error); /* Reset *bits & *timepoints to zero */ @@ -1104,7 +1075,6 @@ void cm_d_source(ARGS) /* close source file */ if (source) fclose(source); - } else { /*** Retrieve previous values ***/ @@ -1117,8 +1087,6 @@ void cm_d_source(ARGS) info->depth = info_old->depth; info->width = info_old->width; - - /** Retrieve bits... **/ bits = (short *) cm_event_get_ptr(1,0); bits_old = (short *) cm_event_get_ptr(1,1); @@ -1129,45 +1097,43 @@ void cm_d_source(ARGS) for (i=0; idepth; i++) + for (i=0; idepth; i++) timepoints[i] = timepoints_old[i]; - - } /*** For the case of TIME==0.0, set special breakpoint ***/ if ( 0.0 == TIME ) { - + test_double = timepoints[info->index]; if ( 0.0 == test_double && info->depth > 0 ) { /* Set DC value */ /* reset current breakpoint */ test_double = timepoints[info->index]; cm_event_queue( test_double ); - + /* Output new values... */ for (i=0; iwidth; i++) { - + /* retrieve output value */ cm_get_source_value(info->width,i,info->index,bits,&out); - + OUTPUT_STATE(out[i]) = out.state; OUTPUT_STRENGTH(out[i]) = out.strength; } - + /* increment breakpoint */ (info->index)++; - - - /* set next breakpoint as long as depth + + + /* set next breakpoint as long as depth has not been exceeded */ if ( info->index < info->depth ) { test_double = timepoints[info->index] - 1.0e-10; @@ -1176,8 +1142,8 @@ void cm_d_source(ARGS) } else { /* Set breakpoint for first time index */ - - /* set next breakpoint as long as depth + + /* set next breakpoint as long as depth has not been exceeded */ if ( info->index < info->depth ) { test_double = timepoints[info->index] - 1.0e-10; @@ -1194,66 +1160,60 @@ void cm_d_source(ARGS) /*** Retrieve last index value and branch to appropriate *** *** routine based on the last breakpoint's relationship *** *** to the current time value. ***/ - + test_double = timepoints[info->index] - 1.0e-10; if ( TIME < test_double ) { /* Breakpoint has not occurred */ - + /** Output hasn't changed...do nothing this time. **/ for (i=0; iwidth; i++) { OUTPUT_CHANGED(out[i]) = FALSE; - } - + } + if ( info->index < info->depth ) { test_double = timepoints[info->index] - 1.0e-10; cm_event_queue( test_double ); } - + } else /* Breakpoint has been reached or exceeded */ - + if ( TIME == test_double ) { /* Breakpoint reached */ - + /* reset current breakpoint */ test_double = timepoints[info->index] - 1.0e-10; cm_event_queue( test_double ); - + /* Output new values... */ for (i=0; iwidth; i++) { - + /* retrieve output value */ cm_get_source_value(info->width,i,info->index,bits,&out); - + OUTPUT_STATE(out[i]) = out.state; OUTPUT_DELAY(out[i]) = 1.0e-10; OUTPUT_STRENGTH(out[i]) = out.strength; } - - - + /* increment breakpoint */ (info->index)++; - - - /* set next breakpoint as long as depth + + /* set next breakpoint as long as depth has not been exceeded */ if ( info->index < info->depth ) { test_double = timepoints[info->index] - 1.0e-10; cm_event_queue( test_double ); } - - - } - + else { /* Last source file breakpoint has been exceeded... do not change the value of the output */ - + for (i=0; iwidth; i++) { OUTPUT_CHANGED(out[i]) = FALSE; - } + } } - } + } }