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