From ce3d11f56e75a8e92d9f51662fe619fd38be5d47 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 23 Jun 2011 19:52:57 +0000 Subject: [PATCH] codemodel 'filesource' added to analog models --- ChangeLog | 6 + src/xspice/icm/analog/file_source/.cvsignore | 3 + src/xspice/icm/analog/file_source/cfunc.mod | 219 +++++++++++++++++++ src/xspice/icm/analog/file_source/ifspec.ifs | 83 +++++++ src/xspice/icm/analog/modpath.lst | 1 + 5 files changed, 312 insertions(+) create mode 100644 src/xspice/icm/analog/file_source/.cvsignore create mode 100644 src/xspice/icm/analog/file_source/cfunc.mod create mode 100644 src/xspice/icm/analog/file_source/ifspec.ifs diff --git a/ChangeLog b/ChangeLog index 473419b77..0da1e3061 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-06-23 Holger Vogt + * /xspice/icm/analog/modpath.lst, + /xspice/icm/analog/file_source/cfunc.mod, + /xspice/icm/analog/file_source/ifspec.ifs: + code model with input from file added (T. Sailer) + 2011-06-23 Robert Larice * src/frontend/options.c , * src/frontend/spiceif.c , diff --git a/src/xspice/icm/analog/file_source/.cvsignore b/src/xspice/icm/analog/file_source/.cvsignore new file mode 100644 index 000000000..fb8dabc18 --- /dev/null +++ b/src/xspice/icm/analog/file_source/.cvsignore @@ -0,0 +1,3 @@ +cfunc.c +ifspec.c +.deps diff --git a/src/xspice/icm/analog/file_source/cfunc.mod b/src/xspice/icm/analog/file_source/cfunc.mod new file mode 100644 index 000000000..0e8f7746a --- /dev/null +++ b/src/xspice/icm/analog/file_source/cfunc.mod @@ -0,0 +1,219 @@ +/* $Id$ */ +/*.......1.........2.........3.........4.........5.........6.........7.........8 +================================================================================ + +FILE filesource/cfunc.mod + +Copyright 2011 +Thomas Sailer + + + +AUTHORS + + 20 May 2011 Thomas Sailer + + +MODIFICATIONS + + +SUMMARY + + This file contains the model-specific routines used to + functionally describe the gain code model. + + +INTERFACES + + FILE ROUTINE CALLED + + N/A N/A + + +REFERENCED FILES + + Inputs from and outputs to ARGS structure. + + +NON-STANDARD FEATURES + + NONE + +===============================================================================*/ + +/*=== INCLUDE FILES ====================*/ + +#include +#include +#include + +/*=== CONSTANTS ========================*/ + + + + +/*=== MACROS ===========================*/ + + + + +/*=== LOCAL VARIABLES & TYPEDEFS =======*/ + +struct filesource_state { + FILE *fp; + long pos; + unsigned char atend; +}; + +/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ + + + + + +/*============================================================================== + +FUNCTION void cm_gain() + +AUTHORS + + 2 Oct 1991 Jeffrey P. Murray + +MODIFICATIONS + + NONE + +SUMMARY + + This function implements the gain code model. + +INTERFACES + + FILE ROUTINE CALLED + + N/A N/A + + +RETURNED VALUE + + Returns inputs and outputs via ARGS structure. + +GLOBAL VARIABLES + + NONE + +NON-STANDARD FEATURES + + NONE + +==============================================================================*/ + + +/*=== CM_FILESOURCE ROUTINE ===*/ + + +void cm_filesource(ARGS) /* structure holding parms, inputs, outputs, etc. */ +{ + int size; + int amplscalesize; + int amploffssize; + double *timeinterval; + double *amplinterval; + struct filesource_state *state; + + if(ANALYSIS == MIF_AC) { + return; + } + size = PORT_SIZE(out); + if (INIT == 1) { + /* Allocate storage for internal state */ + cm_analog_alloc(0, 2 * sizeof(double)); + cm_analog_alloc(1, 2 * size * sizeof(double)); + cm_analog_alloc(2, sizeof(struct filesource_state)); + } + timeinterval = (double *)cm_analog_get_ptr(0, 0); + amplinterval = (double *)cm_analog_get_ptr(1, 0); + state = (struct filesource_state *)cm_analog_get_ptr(2, 0); + if (INIT == 1) { + int i; + timeinterval[0] = timeinterval[1] = PARAM_NULL(timeoffset) ? 0.0 : PARAM(timeoffset); + for (i = 0; i < size; ++i) + amplinterval[2 * i] = amplinterval[2 * i + 1] = PARAM_NULL(amploffset) ? 0.0 : PARAM(amploffset[i]); + state->fp = fopen(PARAM(file), "r"); + state->pos = 0; + state->atend = 0; + if (!state->fp) { + char msg[512]; + snprintf(msg, sizeof(msg), "cannot open file %s", PARAM(file)); + cm_message_send(msg); + state->atend = 1; + } + } + amplscalesize = PARAM_NULL(amplscale) ? 0 : PARAM_SIZE(amplscale); + amploffssize = PARAM_NULL(amploffset) ? 0 : PARAM_SIZE(amploffset); + while (TIME >= timeinterval[1] && !state->atend) { + char line[512]; + char *cp; + char *cp2; + double t; + int i; + if (ftell(state->fp) != state->pos) { + clearerr(state->fp); + fseek(state->fp, state->pos, SEEK_SET); + } + if (!fgets(line, sizeof(line), state->fp)) { + state->atend = 1; + break; + } + state->pos = ftell(state->fp); + cp = line; + while (*cp && isspace(*cp)) + ++cp; + if (*cp == '#' || *cp == ';') + continue; + t = strtod(cp, &cp2); + if (cp2 == cp) + continue; + cp = cp2; + if (!PARAM_NULL(timescale)) + t *= PARAM(timescale); + if (!PARAM_NULL(timerelative) && PARAM(timerelative) == MIF_TRUE) + t += timeinterval[1]; + else if (!PARAM_NULL(timeoffset)) + t += PARAM(timeoffset); + timeinterval[0] = timeinterval[1]; + timeinterval[1] = t; + for (i = 0; i < size; ++i) + amplinterval[2 * i] = amplinterval[2 * i + 1]; + for (i = 0; i < size; ++i) { + while (*cp && (isspace(*cp) || *cp == ',')) + ++cp; + t = strtod(cp, &cp2); + if (cp2 == cp) + break; + cp = cp2; + if (i < amplscalesize) + t *= PARAM(amplscale[i]); + if (i < amploffssize) + t += PARAM(amploffset[i]); + amplinterval[2 * i + 1] = t; + } + } + if (TIME < timeinterval[1] && timeinterval[0] < timeinterval[1] && 0.0 <= timeinterval[0]) { + if (!PARAM_NULL(amplstep) && PARAM(amplstep) == MIF_TRUE) { + int i; + for (i = 0; i < size; ++i) + OUTPUT(out[i]) = amplinterval[2 * i]; + } else { + double mul0 = (timeinterval[1] - TIME) / (timeinterval[1] - timeinterval[0]); + double mul1 = 1.0 - mul0; + int i; + for (i = 0; i < size; ++i) + OUTPUT(out[i]) = mul0 * amplinterval[2 * i] + mul1 * amplinterval[2 * i + 1]; + } + } else { + int i; + for (i = 0; i < size; ++i) + OUTPUT(out[i]) = amplinterval[2 * i + 1]; + } +} diff --git a/src/xspice/icm/analog/file_source/ifspec.ifs b/src/xspice/icm/analog/file_source/ifspec.ifs new file mode 100644 index 000000000..a075817fa --- /dev/null +++ b/src/xspice/icm/analog/file_source/ifspec.ifs @@ -0,0 +1,83 @@ +/* $Id$ */ +/*.......1.........2.........3.........4.........5.........6.........7.........8 +================================================================================ +Copyright 2011 +Thomas Sailer + +AUTHORS + + 19 May 2011 Thomas Sailer + + +SUMMARY + + This file contains the interface specification file for the + filesource code model. + +===============================================================================*/ + +NAME_TABLE: + +C_Function_Name: cm_filesource +Spice_Model_Name: filesource +Description: "File Source" + + +PORT_TABLE: + +Port_Name: out +Description: "output" +Direction: out +Default_Type: v +Allowed_Types: [v,vd,i,id] +Vector: yes +Vector_Bounds: [1 -] +Null_Allowed: no + + +PARAMETER_TABLE: + +Parameter_Name: timeoffset timescale +Description: "time offset" "timescale" +Data_Type: real real +Default_Value: 0.0 1.0 +Limits: - - +Vector: no no +Vector_Bounds: - - +Null_Allowed: yes yes + + +PARAMETER_TABLE: + +Parameter_Name: timerelative amplstep +Description: "relative time" "step amplitude" +Data_Type: boolean boolean +Default_Value: FALSE FALSE +Limits: - - +Vector: no no +Vector_Bounds: - - +Null_Allowed: yes yes + + +PARAMETER_TABLE: + +Parameter_Name: amploffset amplscale +Description: "ampl offset" "amplscale" +Data_Type: real real +Default_Value: - - +Limits: - - +Vector: yes yes +Vector_Bounds: [1 -] [1 -] +Null_Allowed: yes yes + + +PARAMETER_TABLE: + +Parameter_Name: file +Description: "file name" +Data_Type: string +Default_Value: "filesource.txt" +Limits: - +Vector: no +Vector_Bounds: - +Null_Allowed: yes diff --git a/src/xspice/icm/analog/modpath.lst b/src/xspice/icm/analog/modpath.lst index 773358da9..d5555b2a4 100644 --- a/src/xspice/icm/analog/modpath.lst +++ b/src/xspice/icm/analog/modpath.lst @@ -16,3 +16,4 @@ square summer s_xfer triangle +file_source