From f9039ea238d60c7fcaf9fe7b57536abe6c0eb737 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Wed, 9 Nov 2022 15:09:52 +0100 Subject: [PATCH] Don't allocate memory for control array at every time step Use loc instead, setting it up once during INIT --- src/xspice/icm/digital/d_osc/cfunc.mod | 107 ++++++++++++------------ src/xspice/icm/digital/d_osc/ifspec.ifs | 8 +- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/xspice/icm/digital/d_osc/cfunc.mod b/src/xspice/icm/digital/d_osc/cfunc.mod index c893b888a..2b3b251c3 100644 --- a/src/xspice/icm/digital/d_osc/cfunc.mod +++ b/src/xspice/icm/digital/d_osc/cfunc.mod @@ -19,7 +19,7 @@ MODIFICATIONS 23 Aug 1991 Jeffrey P. Murray 30 Sep 1991 Jeffrey P. Murray - + 09 Nov 2022 Holger Vogt SUMMARY @@ -70,6 +70,10 @@ NON-STANDARD FEATURES /*=== LOCAL VARIABLES & TYPEDEFS =======*/ +typedef struct { + double *x; + double *y; +} Local_Data_t; /*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ @@ -119,6 +123,26 @@ NON-STANDARD FEATURES ==============================================================================*/ +static void cm_d_osc_callback(ARGS, + Mif_Callback_Reason_t reason) +{ + switch (reason) { + case MIF_CB_DESTROY: { + Local_Data_t *loc = STATIC_VAR(locdata); + if (loc) { + if (loc->x) + free(loc->x); + if(loc->y) + free(loc->y); + free(loc); + STATIC_VAR(locdata) = loc = NULL; + } + break; + } /* end of case MIF_CB_DESTROY */ + } /* end of switch over reason being called */ +} /* end of function cm_d_osc_callback */ + + /*=== CM_D_OSC ROUTINE ===*/ /************************************************************* @@ -182,7 +206,8 @@ void cm_d_osc(ARGS) cntl_size, /* control array size */ freq_size; /* frequency array size */ - + Local_Data_t *loc; /* Pointer to local static data, not to be included + in the state vector (save memory!) */ @@ -205,7 +230,6 @@ void cm_d_osc(ARGS) if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/ - /* Allocate storage for internal variables */ cm_analog_alloc(0, sizeof(double)); cm_analog_alloc(1, sizeof(double)); @@ -218,15 +242,35 @@ void cm_d_osc(ARGS) t3 = (double *) cm_analog_get_ptr(2,0); + /*** allocate static storage for *loc ***/ + STATIC_VAR (locdata) = calloc (1 , sizeof ( Local_Data_t )); + loc = STATIC_VAR (locdata); + CALLBACK = cm_d_osc_callback; + + x = loc->x = (double *) calloc((size_t) cntl_size, sizeof(double)); + if (!x) { + cm_message_send(d_osc_allocation_error); + return; + } + y = loc->y = (double *) calloc((size_t) cntl_size, sizeof(double)); + if (!y) { + cm_message_send(d_osc_allocation_error); + if(x) + free(x); + return; + } + /* Retrieve x and y values. */ + for (i=0; ix; + y = loc->y; /* Retrieve cntl_input value. */ cntl_input = INPUT(cntl_in); @@ -357,9 +377,7 @@ void cm_d_osc(ARGS) if(TIME < *t3) { cm_event_queue(*t3); - } - - + } } else @@ -373,7 +391,6 @@ void cm_d_osc(ARGS) if(TIME < *t1) { cm_event_queue(*t1); - } } else { @@ -388,23 +405,13 @@ void cm_d_osc(ARGS) } *t3 = T(1) + (1 - dphase)/freq; - - } - - - - if(x) free(x); - if(y) free(y); - - } break; case EVENT: /** discrete call...lots to do **/ - test_double = TIME; if ( 0.0 == TIME ) { /* DC analysis...preset values, @@ -426,21 +433,16 @@ void cm_d_osc(ARGS) *t3 = -1; } - - /* Calculate the time variables and the output value for this iteration */ /* Output is always set to STRONG */ OUTPUT_STRENGTH(out) = STRONG; - - if( *t1 == TIME ) { /* rising edge */ OUTPUT_STATE(out) = ONE; OUTPUT_DELAY(out) = PARAM(rise_delay); - } else { @@ -466,7 +468,6 @@ void cm_d_osc(ARGS) } break; - } } diff --git a/src/xspice/icm/digital/d_osc/ifspec.ifs b/src/xspice/icm/digital/d_osc/ifspec.ifs index 8d9e56164..9c65bb89a 100644 --- a/src/xspice/icm/digital/d_osc/ifspec.ifs +++ b/src/xspice/icm/digital/d_osc/ifspec.ifs @@ -9,7 +9,7 @@ Atlanta, Georgia 30332 AUTHORS 30 Sept 1991 Jeffrey P. Murray - + 09 Nov 2022 Holger Vogt SUMMARY @@ -73,3 +73,9 @@ Vector: no no Vector_Bounds: - - Null_Allowed: yes yes + +STATIC_VAR_TABLE: + +Static_Var_Name: locdata +Description: "local static data" +Data_Type: pointer