1 /*============================================================================
2 FILE    real/udnfunc.c
3 
4 MEMBER OF process XSPICE
5 
6 Public Domain
7 
8 Georgia Tech Research Corporation
9 Atlanta, Georgia 30332
10 PROJECT A-8503
11 
12 AUTHORS
13 
14     9/12/91  Bill Kuhn
15 
16 MODIFICATIONS
17 
18     <date> <person name> <nature of modifications>
19 
20 SUMMARY
21 
22     This file contains the definition of the 'real' node type
23     used by event-driven models that simulate with real type data.
24     These functions are called exclusively through function
25     pointers in an Evt_Udn_Info_t data structure.
26 
27 INTERFACES
28 
29     Evt_Udn_Info_t udn_real_info
30 
31 REFERENCED FILES
32 
33     None.
34 
35 NON-STANDARD FEATURES
36 
37     None.
38 
39 ============================================================================*/
40 
41 #include <stdio.h>
42 #include "ngspice/cm.h"
43 
44 #include "ngspice/evtudn.h"
45 #include "ngspice/memory.h"
46 
47 
48 
49 /* macro to ignore unused variables and parameters */
50 #define NG_IGNORE(x)  (void)x
51 
52 /* ************************************************************************ */
53 
udn_real_create(CREATE_ARGS)54 static void udn_real_create(CREATE_ARGS)
55 {
56     /* Malloc space for a real struct */
57     MALLOCED_PTR = TMALLOC(double, 1);
58 }
59 
60 
61 /* ************************************************************************ */
62 
udn_real_dismantle(DISMANTLE_ARGS)63 static void udn_real_dismantle(DISMANTLE_ARGS)
64 {
65     NG_IGNORE(STRUCT_PTR);
66 
67     /* Do nothing.  There are no internally malloc'ed things to dismantle */
68 }
69 
70 
71 /* ************************************************************************ */
72 
udn_real_initialize(INITIALIZE_ARGS)73 static void udn_real_initialize(INITIALIZE_ARGS)
74 {
75     double  *real_struct = (double *) STRUCT_PTR;
76 
77 
78     /* Initialize to zero */
79     *real_struct = 0.0;
80 }
81 
82 
83 /* ************************************************************************ */
84 
udn_real_invert(INVERT_ARGS)85 static void udn_real_invert(INVERT_ARGS)
86 {
87     double      *real_struct = (double *) STRUCT_PTR;
88 
89 
90     /* Invert the state */
91     *real_struct = -(*real_struct);
92 }
93 
94 
95 /* ************************************************************************ */
96 
udn_real_resolve(RESOLVE_ARGS)97 static void udn_real_resolve(RESOLVE_ARGS)
98 {
99     double **array    = (double**)INPUT_STRUCT_PTR_ARRAY;
100     double *out       = (double *) OUTPUT_STRUCT_PTR;
101     int    num_struct = INPUT_STRUCT_PTR_ARRAY_SIZE;
102 
103     double      sum;
104     int         i;
105 
106     /* Sum the values */
107     for(i = 0, sum = 0.0; i < num_struct; i++)
108         sum += *(array[i]);
109 
110     /* Assign the result */
111     *out = sum;
112 }
113 
114 /* ************************************************************************ */
115 
udn_real_copy(COPY_ARGS)116 static void udn_real_copy(COPY_ARGS)
117 {
118     double  *real_from_struct = (double *) INPUT_STRUCT_PTR;
119     double  *real_to_struct   = (double *) OUTPUT_STRUCT_PTR;
120 
121     /* Copy the structure */
122     *real_to_struct = *real_from_struct;
123 }
124 
125 
126 /* ************************************************************************ */
127 
udn_real_compare(COMPARE_ARGS)128 static void udn_real_compare(COMPARE_ARGS)
129 {
130     double  *real_struct1 = (double *) STRUCT_PTR_1;
131     double  *real_struct2 = (double *) STRUCT_PTR_2;
132 
133     /* Compare the structures */
134     if((*real_struct1) == (*real_struct2))
135         EQUAL = TRUE;
136     else
137         EQUAL = FALSE;
138 }
139 
140 
141 /* ************************************************************************ */
142 
udn_real_plot_val(PLOT_VAL_ARGS)143 static void udn_real_plot_val(PLOT_VAL_ARGS)
144 {
145     double   *real_struct = (double *) STRUCT_PTR;
146 
147     NG_IGNORE(STRUCT_MEMBER_ID);
148 
149     /* Output a value for the real struct */
150     PLOT_VAL = *real_struct;
151 }
152 
153 
154 /* ************************************************************************ */
155 
udn_real_print_val(PRINT_VAL_ARGS)156 static void udn_real_print_val(PRINT_VAL_ARGS)
157 {
158     double   *real_struct = (double *) STRUCT_PTR;
159 
160     NG_IGNORE(STRUCT_MEMBER_ID);
161 
162     /* Allocate space for the printed value */
163     PRINT_VAL = TMALLOC(char, 30);
164 
165     /* Print the value into the string */
166     sprintf(PRINT_VAL, "%15.6e", *real_struct);
167 }
168 
169 
170 
171 /* ************************************************************************ */
172 
udn_real_ipc_val(IPC_VAL_ARGS)173 static void udn_real_ipc_val(IPC_VAL_ARGS)
174 {
175     /* Simply return the structure and its size */
176     IPC_VAL = STRUCT_PTR;
177     IPC_VAL_SIZE = sizeof(double);
178 }
179 
180 
181 
182 Evt_Udn_Info_t udn_real_info = {
183 
184     "real",
185     "real valued data",
186 
187     udn_real_create,
188     udn_real_dismantle,
189     udn_real_initialize,
190     udn_real_invert,
191     udn_real_copy,
192     udn_real_resolve,
193     udn_real_compare,
194     udn_real_plot_val,
195     udn_real_print_val,
196     udn_real_ipc_val
197 
198 };
199 
200