Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / api / sim / sim_API_highlevel.c
1 #include GEN_H
2 #include SIM_H
3 #include STM_H
4 #include TTV_H
5
6 #define API_USE_REAL_TYPES
7 #include "gen_API.h"
8 #include "sim_API.h"
9 #include "stm_API.h"
10 #include "sim_API_lowlevel.h"
11
12
13 //_____________________________________________________________________________
14 //
15 double sim_ComputeSetup (sim_model *sc, char *data, double tstart_d,
16 double tslope_d, char sens_d, char *cmd,
17 double t_start_min_c, double t_start_max_c, double tslope_c,
18 char sens_c, char *mem, int data_val)
19 {
20 double setup;
21 char separ = SEPAR;
22 char sens_data;
23 char sens_cmd;
24
25 if (!sc) return 0.0;
26 SEPAR = SIM_SEPAR;
27
28 sens_d=tolower(sens_d);
29 if (sens_d == 'u')
30 sens_data = SIM_RISE;
31 else if (sens_d == 'd')
32 sens_data = SIM_FALL;
33 else {
34 avt_errmsg(SIM_API_ERRMSG, "005", AVT_ERROR);
35 // avt_error("sim_api", -1, AVT_ERR, "sim_ComputeSetup: sens_d must be 'U' or 'D'\n");
36 return 0.0;
37 }
38 sens_c=tolower(sens_c);
39 if (sens_c == 'u')
40 sens_cmd = SIM_RISE;
41 else if (sens_c == 'd')
42 sens_cmd = SIM_FALL;
43 else {
44 avt_errmsg(SIM_API_ERRMSG, "005", AVT_ERROR);
45 // avt_error("sim_api", -1, AVT_ERR, "sim_ComputeSetup: sens_d must be 'U' or 'D'\n");
46 return 0.0;
47 }
48 setup = sim_get_setup_time ((sim_model*)sc,gen_sim_devect (data),
49 SIM_UNIT_X_TO_Y (tstart_d,1,SIM_UNIT_TIME),
50 SIM_UNIT_X_TO_Y (tslope_d,1,SIM_UNIT_TIME),
51 sens_data,gen_sim_devect (cmd),
52 SIM_UNIT_X_TO_Y (t_start_min_c,1,SIM_UNIT_TIME),
53 SIM_UNIT_X_TO_Y (t_start_max_c,1,SIM_UNIT_TIME),
54 SIM_UNIT_X_TO_Y (tslope_c,1,SIM_UNIT_TIME),
55 sens_c,gen_sim_devect (mem),data_val);
56 SEPAR = separ;
57 return setup;
58 }
59
60 //_____________________________________________________________________________
61
62 double sim_ComputeHold (sim_model *sc, char *data, double tstart_d,
63 double tslope_d, char sens_d, char *cmd,
64 double t_start_min_c, double t_start_max_c, double tslope_c,
65 char sens_c, char *mem, int data_val)
66 {
67 double hold;
68 char separ = SEPAR;
69 char sens_data;
70 char sens_cmd;
71
72 if (!sc) return 0.0;
73 SEPAR = SIM_SEPAR;
74
75 sens_d=tolower(sens_d);
76 if (sens_d == 'u')
77 sens_data = SIM_RISE;
78 else if (sens_d == 'd')
79 sens_data = SIM_FALL;
80 else {
81 avt_errmsg(SIM_API_ERRMSG, "006", AVT_ERROR);
82 // avt_error("sim_api", -1, AVT_ERR, "sim_ComputeHold: sens_d must be 'U' or 'D'\n");
83 return 0.0;
84 }
85 sens_c=tolower(sens_c);
86 if (sens_c == 'u')
87 sens_cmd = SIM_RISE;
88 else if (sens_c == 'd')
89 sens_cmd = SIM_FALL;
90 else {
91 avt_errmsg(SIM_API_ERRMSG, "006", AVT_ERROR);
92 // avt_error("sim_api", -1, AVT_ERR, "sim_ComputeHold: sens_d must be 'U' or 'D'\n");
93 return 0.0;
94 }
95 hold = sim_get_hold_time ((sim_model*)sc,gen_sim_devect (data),
96 SIM_UNIT_X_TO_Y (tstart_d,1,SIM_UNIT_TIME),
97 SIM_UNIT_X_TO_Y (tslope_d,1,SIM_UNIT_TIME),
98 sens_data,gen_sim_devect (cmd),
99 SIM_UNIT_X_TO_Y (t_start_min_c,1,SIM_UNIT_TIME),
100 SIM_UNIT_X_TO_Y (t_start_max_c,1,SIM_UNIT_TIME),
101 SIM_UNIT_X_TO_Y (tslope_c,1,SIM_UNIT_TIME),
102 sens_c,gen_sim_devect (mem),data_val);
103 SEPAR = separ;
104 return hold;
105 }
106
107 //_____________________________________________________________________________
108
109 double sim_ComputeAccess (sim_model *sc, char *dout, int dout_val, char *cmd, double tstart_c,
110 double tslope_c, char sens_c, char *mem, int mem_val, double *out_slope)
111 {
112 double access;
113 char separ = SEPAR;
114 char sens_cmd;
115 SEPAR = SIM_SEPAR;
116
117 if (!sc) return 0.0;
118 sens_c=tolower(sens_c);
119 if (sens_c == 'u')
120 sens_cmd = SIM_RISE;
121 else if (sens_c == 'd')
122 sens_cmd = SIM_FALL;
123 else {
124 avt_errmsg(SIM_API_ERRMSG, "007", AVT_ERROR);
125 // avt_error("sim_api", -1, AVT_ERR, "sim_ComputeAccess: sens_c must be 'U' or 'D'\n");
126 return 0.0;
127 }
128 access = sim_get_access_time ((sim_model*)sc,gen_sim_devect (dout),dout_val,gen_sim_devect (cmd),
129 SIM_UNIT_X_TO_Y (tstart_c,1,SIM_UNIT_TIME),
130 SIM_UNIT_X_TO_Y (tslope_c,1,SIM_UNIT_TIME),
131 sens_cmd,gen_sim_devect (mem),mem_val, out_slope);
132 SEPAR = separ;
133 return access;
134 }
135
136 //_____________________________________________________________________________
137
138 chain_list *sim_ComputeDelay (sim_model *sc, char *input, char sens, chain_list *list_measure)
139 {
140 char separ = SEPAR;
141 char type_node_dest;
142 char *name;
143 double slope;
144 chain_list *chain;
145
146 if (!sc) return NULL;
147 SEPAR = SIM_SEPAR;
148
149 slope = sim_parameter_get_slope( (sim_model*)sc );
150 // positionne le front d entree
151 sim_AddSlope (sc, gen_sim_devect(input),0.0,slope,sens);
152
153 // ajoute les mesures sur les points de sortie
154 for (chain = (chain_list*)list_measure ; chain ; chain = chain->NEXT) {
155 name = (char*)chain->DATA;
156 sim_AddMeasure (sc, gen_sim_devect(name));
157 }
158
159 // Launch simulation
160 sim_RunSimulation (sc, NULL);
161 sim_parse_spiceout ((sim_model*)sc);
162
163 // Recupere les delais
164 for (chain = (chain_list*)list_measure ; chain ; chain = chain->NEXT) {
165 name = (char*)chain->DATA;
166 if (!sim_find_locon (gen_sim_devect (name), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
167 type_node_dest = 's';
168 else
169 type_node_dest = 'c';
170 sim_GetTmgList ((sim_model*)sc,'c',gen_sim_devect(input),type_node_dest,gen_sim_devect(name));
171 }
172 SEPAR = separ;
173 return (chain_list*)SIM_HEAD_TMG;
174 }
175
176 //_____________________________________________________________________________
177
178 double sim_compute_delay_transition (sim_model *sc, char dtype,char *input, double input_start,double slope,char *output, char *event)
179 {
180 char separ = SEPAR;
181 char type_node_dest;
182 char in_event;
183 char out_event;
184 long in_ind;
185 char *endstr;
186 int init_output;
187 double th_in, th_out;
188
189 if (!sc) return 0.0;
190 SEPAR = SIM_SEPAR;
191
192 in_event = event[0];
193 in_ind = strtol(&event[1],&endstr,0);
194 out_event = endstr[0];
195 if (out_event == SIM_FALL)
196 init_output = 1;
197 else
198 init_output = 0;
199
200 input_start = SIM_UNIT_X_TO_Y (input_start, 1.0, SIM_UNIT_TIME);
201 // positionne le front d entree
202 sim_AddSlope (sc, gen_sim_devect(input),input_start,slope,in_event);
203
204 // ajoute les mesures sur les points de sortie
205 sim_AddMeasure (sc, gen_sim_devect(output));
206
207 // initialise la sortie
208 sim_AddInitLevel (sc, gen_sim_devect(output),init_output);
209
210 // Launch simulation
211 sim_RunSimulation (sc, NULL);
212 sim_parse_spiceout ((sim_model*)sc);
213
214 if (!sim_find_locon (gen_sim_devect (output), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
215 type_node_dest = 's';
216 else
217 type_node_dest = 'c';
218 SEPAR = separ;
219
220 sim_get_THR(sc, &th_in, &th_out, NULL, NULL);
221
222 // Retourne le delai
223 return sim_get_trans_delay ((sim_model*)sc,
224 dtype,
225 'c',
226 gen_sim_devect(input),
227 type_node_dest,
228 gen_sim_devect(output),
229 event, th_in, th_out);
230 }
231
232 //_____________________________________________________________________________
233
234 double sim_ComputeMaxDelayTransition (sim_model *sc, char *input, double input_start,double input_slope,char *output, char *event)
235 {
236 return sim_compute_delay_transition (sc, SIM_MAX,input,input_start,input_slope,output,event);
237 }
238
239 //_____________________________________________________________________________
240
241 double sim_ComputeMinDelayTransition (sim_model *sc, char *input, double input_start,double input_slope,char *output, char *event)
242 {
243 return sim_compute_delay_transition (sc, SIM_MIN,input,input_start,input_slope,output,event);
244 }
245
246 //_____________________________________________________________________________
247 void SET_CONTEXT(sim_model *sc)
248 {
249 sim_set_ctx(sc);
250 }
251
252 sim_model *GET_CONTEXT()
253 {
254 return sim_get_ctx();
255 }
256
257 void sim_DefineInclude(sim_model *sc, char *filename)
258 {
259 sim_set_filename(sc, filename);
260 }