Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / api / sim / sim_API_lowlevel.c
1 #include MUT_H
2 #include SIM_H
3 #include MCC_H
4 #include MSL_H
5 #include GEN_H
6
7 #define API_USE_REAL_TYPES
8 #include "gen_API.h"
9 #include "sim_API_extract.h"
10
11 //#############################################################################
12 //#############################################################################
13
14 //typedef SIM_FLOAT (*PWL_FUNCTION) (SIM_FLOAT, void *);
15
16 //_____________________________________________________________________________
17
18 chain_list *FLOAT_TO_FREE = NULL;
19 chain_list *SIM_MODEL = NULL;
20 //PWL_FUNCTION PWL_FUNC = NULL;
21 int READ_RESULT = 0;
22 char SIM_SEPAR = '.';
23
24
25 char *gen_sim_devect(char *name)
26 {
27 return namealloc(gen_makesignalname(name));
28 }
29
30
31 //_____________________________________________________________________________
32
33 void sim_DriveTransistorAsInstance(sim_model *sc, char mode)
34 {
35 if (tolower(mode)=='y')
36 sc->PARAMETER.TRANSISTOR_AS_INSTANCE=SIM_YES;
37 else
38 sc->PARAMETER.TRANSISTOR_AS_INSTANCE=SIM_NO;
39 }
40
41
42 void sim_API_Action_Initialize ()// commentaire pour desactiver l'ajout de token
43 {
44 char *str;
45 READ_RESULT = 0;
46 // PWL_FUNC = NULL;
47
48 FLOAT_TO_FREE = NULL;
49 SIM_MODEL = NULL;
50
51 if ((str = V_STR_TAB[__MBK_SEPAR].VALUE))
52 SIM_SEPAR = str[0];
53 else
54 SIM_SEPAR = '.';
55
56 }
57
58 //_____________________________________________________________________________
59
60 void sim_API_Action_Terminate ()// commentaire pour desactiver l'ajout de token
61 {
62 char *figname;
63 char separ = SEPAR;
64 chain_list *to_free, *sim;
65 sim_model *mdl;
66
67 SEPAR = SIM_SEPAR;
68
69 for (sim = SIM_MODEL; sim; sim = sim->NEXT) {
70 mdl=(sim_model*)sim->DATA;
71 figname = mdl->FIG->NAME;
72 freeflatmodel (mdl->FIG);
73 mdl->FIG = NULL;
74 sim_model_clear (figname);
75 }
76 freechain (SIM_MODEL);
77 SIM_MODEL = NULL;
78
79 for (to_free = FLOAT_TO_FREE; to_free; to_free = to_free->NEXT)
80 free ((SIM_FLOAT*)to_free->DATA);
81 freechain (FLOAT_TO_FREE);
82 FLOAT_TO_FREE = NULL;
83
84 SEPAR = separ;
85 }
86
87 //#############################################################################
88 //#############################################################################
89 //_______________ UTILS _______________________________________________________
90 //#############################################################################
91 //#############################################################################
92
93 sim_model *sim_new_model_if_null (lofig_list *fig)
94 {
95 sim_model *sc;
96
97 if (!fig) return NULL;
98 sc = sim_model_create_new (fig->NAME);
99 sim_parameter_set_tool (sc,V_INT_TAB[__SIM_TOOL].VALUE);
100 sim_model_set_lofig (sc, fig);
101 sim_parameter_set_drive_netlist (sc, SIM_YES);
102 return sc;
103 }
104
105 //_____________________________________________________________________________
106
107 sim_model *sim_CreateContext (lofig_list *fig)
108 {
109 sim_model *mod = sim_new_model_if_null ((lofig_list*)fig);
110 // SIM_MODEL = addchain (SIM_MODEL, mod);
111 return mod;
112 }
113
114 void sim_FreeContext (sim_model *model)
115 {
116 sim_clean_netlist(model);
117 gns_FreeNetlist(model->FIG);
118 model->FIG=NULL;
119 sim_free_context (model);
120 }
121 //_____________________________________________________________________________
122
123 void sim_read_tab_if_null (sim_model *sc)
124 {
125 if (!READ_RESULT) {
126 READ_RESULT = 1;
127 sim_parse_spiceout (sc);
128 }
129 }
130
131 //#############################################################################
132 //#############################################################################
133 //_______________ GENERAL PARAMETERS __________________________________________
134 //#############################################################################
135 //#############################################################################
136
137 void sim_SetSimulatorType (sim_model *sc, char *type)
138 {
139 if (!sc) return;
140 if (!strcasecmp (type, "eldo"))
141 sim_parameter_set_tool (sc, SIM_TOOL_ELDO);
142 else
143 if (!strcasecmp (type, "mspice"))
144 sim_parameter_set_tool (sc, SIM_TOOL_MSPICE);
145 else
146 if (!strcasecmp (type, "hspice"))
147 sim_parameter_set_tool (sc, SIM_TOOL_HSPICE);
148 else
149 if (!strcasecmp (type, "titan"))
150 sim_parameter_set_tool (sc, SIM_TOOL_TITAN);
151 else
152 if (!strcasecmp (type, "titanv7"))
153 sim_parameter_set_tool (sc, SIM_TOOL_TITAN7);
154 else
155 if (!strcasecmp (type, "spice"))
156 sim_parameter_set_tool (sc, SIM_TOOL_SPICE);
157 else
158 if (!strcasecmp (type, "ngspice"))
159 sim_parameter_set_tool (sc, SIM_TOOL_NGSPICE);
160 else
161 if (!strcasecmp (type, "ltspice"))
162 sim_parameter_set_tool (sc, SIM_TOOL_LTSPICE);
163 else {
164 V_INT_TAB[__SIM_TOOL].VALUE = SIM_TOOL_HSPICE;
165 avt_errmsg(SIM_API_ERRMSG, "015", AVT_WARNING, type);
166 // fprintf (stderr, "'%s' command file is generated with default wrapper\n", type);
167 }
168 }
169
170 //_____________________________________________________________________________
171
172 void sim_SetSlopeForm (sim_model *sc, void *f)
173 {
174 sc->PARAMETER.PWL_FUNC = (PWL_FUNCTION)f;
175 }
176
177 //_____________________________________________________________________________
178
179 void sim_SetSimulationTime (sim_model *sc, double time) // unit: SECOND
180 {
181 if (!sc) return;
182 sim_parameter_set_tran_tmax ((sim_model*)sc, SIM_UNIT_X_TO_Y (time, 1, SIM_UNIT_TIME));
183 }
184
185 //_____________________________________________________________________________
186
187 void sim_SetSimulationSlope (sim_model *sc, double slope) // unit: SECOND
188 {
189 if (!sc) return;
190 sim_parameter_set_slope ((sim_model*)sc, SIM_UNIT_X_TO_Y (slope, 1, SIM_UNIT_TIME));
191 }
192
193 //_____________________________________________________________________________
194
195 void sim_SetSimulationStep (sim_model *sc, double step) // unit: SECOND
196 {
197 if (!sc) return;
198 sim_parameter_set_tran_step ((sim_model*)sc, SIM_UNIT_X_TO_Y (step, 1, SIM_UNIT_TIME));
199 }
200
201 //_____________________________________________________________________________
202
203 void sim_SetSimulationSupply (sim_model *sc, double v_max) // unit: VOLT
204 {
205 if (!sc) return;
206 sim_parameter_set_alim ((sim_model*)sc, SIM_UNIT_X_TO_Y (v_max, 1, SIM_UNIT_VOLTAGE), 'i');
207 }
208
209 void sim_SetInputSwing (sim_model *sc, double v_vss, double v_max) // unit: VOLT
210 {
211 if (!sc) return;
212 sim_parameter_set_alim ((sim_model*)sc, SIM_UNIT_X_TO_Y (v_max, 1, SIM_UNIT_VOLTAGE), 'i');
213 sim_parameter_set_vss ((sim_model*)sc, SIM_UNIT_X_TO_Y (v_vss, 1, SIM_UNIT_VOLTAGE), 'i');
214 }
215
216 void sim_SetOutputSwing (sim_model *sc, double v_vss, double v_max) // unit: VOLT
217 {
218 if (!sc) return;
219 sim_parameter_set_alim ((sim_model*)sc, SIM_UNIT_X_TO_Y (v_max, 1, SIM_UNIT_VOLTAGE), 'o');
220 sim_parameter_set_vss ((sim_model*)sc, SIM_UNIT_X_TO_Y (v_vss, 1, SIM_UNIT_VOLTAGE), 'o');
221 }
222 //_____________________________________________________________________________
223
224 double sim_GetSimulationSupply () // unit: VOLT
225 {
226 return V_FLOAT_TAB[__SIM_POWER_SUPPLY].VALUE;
227 }
228
229 //_____________________________________________________________________________
230
231 void sim_SetSimulationTemp (sim_model *sc, double temp) // unit: CELSIUS
232 {
233 if (!sc) return;
234 sim_parameter_set_temperature ((sim_model*)sc, temp);
235 }
236
237 //_____________________________________________________________________________
238
239 void sim_SetDelayVTH (sim_model *sc, double vth) // pourcentage de VDD
240 {
241 if (!sc) return;
242 sim_parameter_set_delayVTH ((sim_model*)sc, vth, vth);
243 }
244
245 //_____________________________________________________________________________
246
247 void sim_SetSlopeVTH (sim_model *sc, double vth_low, double vth_high) // pourcentage de VDD
248 {
249 if (!sc) return;
250 sim_parameter_set_slopeVTHH ((sim_model*)sc, vth_high);
251 sim_parameter_set_slopeVTHL ((sim_model*)sc, vth_low);
252 }
253
254 //_____________________________________________________________________________
255
256 void sim_AddSimulationTechnoFile (sim_model *sc, char *tech_file)
257 {
258 if (!sc) return;
259 sim_parameter_add_techno_file ((sim_model*)sc, tech_file);
260 }
261 //_____________________________________________________________________________
262
263 void sim_SetSimulationOutputFile (sim_model *sc, char *output_file)
264 {
265 if (!sc) return;
266 MCC_SPICEOUT = output_file;
267 }
268
269 //_____________________________________________________________________________
270
271 void sim_SetSimulationCall (sim_model *sc, char *sim_call)
272 {
273 if (!sc) return;
274 if (sim_call)
275 sim_parameter_set_tool_cmd ((sim_model*)sc, sim_call);
276 }
277
278 //_____________________________________________________________________________
279
280 void sim_NoiseSetAnalyseType (sim_model *sc, char noise_type)
281 {
282 if (!sc) return;
283 if ((noise_type != SIM_MIN) && (noise_type != SIM_MAX))
284 avt_errmsg(SIM_API_ERRMSG, "010", AVT_ERROR);
285 // fprintf (stderr,"\n[SIMAPI ERR] sim_SetNoiseAnanlyseType : noise_type must be SIM_MIN or SIM_MAX\n");
286 else
287 sim_parameter_set_noise_type ((sim_model*)sc,noise_type);
288 }
289
290 //#############################################################################
291 //#############################################################################
292 //_______________ DC values ___________________________________________________
293 //#############################################################################
294 //#############################################################################
295
296 void sim_AddStuckLevelVector (sim_model *sc, char *node, char *level)
297 {
298 int left, right, i, j = 0, lbin;
299 char binary[1024];
300 char *val;
301 char separ = SEPAR;
302 if (!sc) return;
303 SEPAR = SIM_SEPAR;
304
305 if (level[0] == '0' && (level[1] == 'x' || level[1] == 'X'))
306 val = level + 2;
307 else
308 val = level;
309
310 if (vectorindex (node) == -1)
311 vectorbounds (((sim_model*)sc)->FIG, namealloc (node), &left, &right);
312
313 if ((vectorindex (node) != -1) || (left == -1 && right == -1)) { //vector element || not a vector
314 if (!strcmp (val, "0"))
315 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ZERO);
316 else
317 if (!strcmp (val, "1"))
318 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ONE);
319 else
320 avt_errmsg(SIM_API_ERRMSG, "011", AVT_ERROR, val, node);
321 // fprintf (stderr, "AddStuckLevelVector: bad value 0x%s for node %s\n", val, node);
322 return;
323 }
324
325 if (left != -1 && right != -1) { // a vector
326
327 sim_hex2bin (binary, val);
328 lbin = strlen (binary);
329
330 if (left <= right) { // v (left TO right)
331 for (i = left; i <= right; i++) {
332 if (j < lbin) {
333 if (binary[j] == '1')
334 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ONE);
335 else
336 if (binary[j] == '0')
337 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ZERO);
338 j++;
339 }
340 else // Fill the remaining LSB (right) bits with '0'
341 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ZERO);
342 }
343 }
344
345 if (left > right) { // v (left DOWNTO right)
346 j = lbin - 1;
347 for (i = right; i <= left; i++) {
348 if (j >= 0) {
349 if (binary[j] == '1')
350 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ONE);
351 else
352 if (binary[j] == '0')
353 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ZERO);
354 j--;
355 }
356 else // Fill the remaining LSB (left) bits with '0'
357 sim_input_set_stuck_level ((sim_model*)sc, sim_vectorize (node, i), SIM_ZERO);
358 }
359 }
360 }
361
362 SEPAR = separ;
363 }
364
365 void sim_AddStuckLevel(sim_model *sc, char *node, int level)
366 {
367 int left, right, i, lbin;
368 char separ = SEPAR;
369
370 if (!sc) return;
371
372 if (level!=0 && level!=1)
373 {
374 avt_errmsg(SIM_API_ERRMSG, "011", AVT_ERROR, level, node);
375 // fprintf (stderr, "AddStuckLevel: bad value '%c' for node %s\n", level, node);
376 return;
377 }
378
379 SEPAR = SIM_SEPAR;
380
381 node=gen_sim_devect (node);
382
383 lbin=vectorindex (node);
384
385 if (lbin == -1)
386 vectorbounds (sc->FIG, node, &left, &right);
387 else
388 left=right=lbin;
389
390 if (left==-1 || right==-1)
391 {
392 if (level==0)
393 sim_input_set_stuck_level (sc, node, SIM_ZERO);
394 else
395 sim_input_set_stuck_level (sc, node, SIM_ONE);
396 }
397 else
398 {
399 if (left>right) { lbin=right; right=left; left=lbin; }
400 node=vectorradical(node);
401 for (i = left; i <= right; i++)
402 {
403 if (level==0)
404 sim_input_set_stuck_level (sc, sim_vectorize (node, i), SIM_ZERO);
405 else
406 sim_input_set_stuck_level (sc, sim_vectorize (node, i), SIM_ONE);
407 }
408 }
409
410 SEPAR = separ;
411 }
412 //_____________________________________________________________________________
413
414 void sim_AddStuckVoltage (sim_model *sc, char *node, double voltage)
415 {
416 char separ = SEPAR;
417 if (!sc) return;
418 SEPAR = SIM_SEPAR;
419
420 sim_input_set_stuck_voltage ((sim_model*)sc, gen_sim_devect (node), voltage);
421
422 SEPAR = separ;
423 }
424
425 //_____________________________________________________________________________
426 /*
427 void sim_AddStuckLevel (sim_model *sc, char *node, int level)
428 {
429 char separ = SEPAR;
430 if (!sc) return;
431 SEPAR = SIM_SEPAR;
432
433 switch (level) {
434 case 0:
435 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ZERO);
436 break;
437 case 1:
438 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ONE);
439 break;
440 default:
441 fprintf (stderr, "[SIMAPI WAR] AddStuckLevel param 2: allowed values are 0 and 1\n");
442 }
443
444 SEPAR = separ;
445 }
446 */
447 //#############################################################################
448 //#############################################################################
449 //_______________ PWL _________________________________________________________
450 //#############################################################################
451 //#############################################################################
452 //
453
454 //_____________________________________________________________________________
455
456 void sim_AddSignalSlope (sim_model *sc, char *node, double start_time, double transition_time, char sense)
457 {
458 char *vnode = gen_sim_devect (node);
459 char separ = SEPAR;
460 SIM_FLOAT t_time = SIM_UNIT_X_TO_Y (transition_time, 1.0, SIM_UNIT_TIME);
461 SIM_FLOAT s_time = SIM_UNIT_X_TO_Y (start_time, 1.0, SIM_UNIT_TIME);
462 SIM_FLOAT *data = (SIM_FLOAT*)malloc (7 * sizeof (SIM_FLOAT));
463
464 // FLOAT_TO_FREE = addchain (FLOAT_TO_FREE, data);
465
466 if (!sc) return;
467 SEPAR = SIM_SEPAR;
468
469 // sim_new_model_if_null (((sim_model*)sc)->FIG);
470 sense=toupper(sense);
471 switch (sense) {
472 case SIM_RISE:
473 if (!sc->PARAMETER.PWL_FUNC)
474 sim_input_set_slope_single ((sim_model*)sc,
475 vnode,
476 SIM_RISE,
477 t_time,
478 s_time,
479 SIM_INPUT_SIGNAL);
480 else {
481 data[0] = s_time;
482 data[1] = t_time;
483 data[2] = sim_parameter_get_slopeVTHH ((sim_model*)sc);
484 data[3] = sim_parameter_get_slopeVTHL ((sim_model*)sc);
485 data[4] = sim_parameter_get_alim ((sim_model*)sc, 'i');
486 data[5] = 1.0;
487 data[6] = sim_parameter_get_vss ((sim_model*)sc, 'i');
488 sim_input_set_func ((sim_model*)sc, vnode, sc->PARAMETER.PWL_FUNC, data,SIM_INPUT_SIGNAL, NULL);
489 }
490 sim_measure_set_signal ((sim_model*)sc, vnode);
491 break;
492 case SIM_FALL:
493 if (!sc->PARAMETER.PWL_FUNC)
494 sim_input_set_slope_single ((sim_model*)sc, vnode, SIM_FALL, t_time, s_time,SIM_INPUT_SIGNAL);
495 else {
496 data[0] = s_time;
497 data[1] = t_time;
498 data[2] = sim_parameter_get_slopeVTHH ((sim_model*)sc);
499 data[3] = sim_parameter_get_slopeVTHL ((sim_model*)sc);
500 data[4] = sim_parameter_get_alim ((sim_model*)sc, 'i');
501 data[5] = -1.0;
502 data[6] = sim_parameter_get_vss ((sim_model*)sc, 'i');
503 sim_input_set_func ((sim_model*)sc, vnode, sc->PARAMETER.PWL_FUNC, data,SIM_INPUT_SIGNAL, NULL);
504 }
505 sim_measure_set_signal ((sim_model*)sc, vnode);
506 break;
507 default:
508 avt_errmsg(SIM_API_ERRMSG, "013", AVT_ERROR);
509 // fprintf (stderr, "[SIMAPI WAR] AddInputSlope param 4: allowed values are SIM_RISE and SIM_FALL\n");
510 }
511 SEPAR = separ;
512 }
513
514 //_____________________________________________________________________________
515
516 void sim_AddSlope (sim_model *sc, char *node, double start_time, double transition_time, char sense)
517 {
518 char *vnode = gen_sim_devect (node);
519 char separ = SEPAR;
520 SIM_FLOAT t_time = SIM_UNIT_X_TO_Y (transition_time, 1.0, SIM_UNIT_TIME);
521 SIM_FLOAT s_time = SIM_UNIT_X_TO_Y (start_time, 1.0, SIM_UNIT_TIME);
522 SIM_FLOAT *data = (SIM_FLOAT*)malloc (7 * sizeof (SIM_FLOAT));
523
524 // FLOAT_TO_FREE = addchain (FLOAT_TO_FREE, data);
525
526 if (!sc) return;
527 if (sim_find_locon(vnode, sc->FIG, NULL, NULL)==NULL)
528 {
529 avt_errmsg(SIM_API_ERRMSG, "008", AVT_ERROR, node);
530 //avt_error("sim_api", 0, AVT_ERR, "Connector '%s' could not be found in netlist.\n", node);
531 return;
532 }
533 SEPAR = SIM_SEPAR;
534
535 // sim_new_model_if_null (((sim_model*)sc)->FIG);
536 sense=toupper(sense);
537 switch (sense) {
538 case SIM_RISE:
539 if (!sc->PARAMETER.PWL_FUNC)
540 sim_input_set_slope_single ((sim_model*)sc, vnode, SIM_RISE, t_time, s_time,SIM_INPUT_LOCON);
541 else {
542 data[0] = s_time;
543 data[1] = t_time;
544 data[2] = sim_parameter_get_slopeVTHH ((sim_model*)sc);
545 data[3] = sim_parameter_get_slopeVTHL ((sim_model*)sc);
546 data[4] = sim_parameter_get_alim ((sim_model*)sc, 'i');
547 data[5] = 1.0;
548 data[6] = sim_parameter_get_vss ((sim_model*)sc, 'i');
549 sim_input_set_func ((sim_model*)sc, vnode, sc->PARAMETER.PWL_FUNC, data,SIM_INPUT_LOCON, NULL);
550 }
551 break;
552 case SIM_FALL:
553 if (!sc->PARAMETER.PWL_FUNC)
554 sim_input_set_slope_single ((sim_model*)sc, vnode, SIM_FALL, t_time, s_time,SIM_INPUT_LOCON);
555 else {
556 data[0] = s_time;
557 data[1] = t_time;
558 data[2] = sim_parameter_get_slopeVTHH ((sim_model*)sc);
559 data[3] = sim_parameter_get_slopeVTHL ((sim_model*)sc);
560 data[4] = sim_parameter_get_alim ((sim_model*)sc, 'i');
561 data[5] = -1.0;
562 data[6] = sim_parameter_get_vss ((sim_model*)sc, 'i');
563 sim_input_set_func ((sim_model*)sc, vnode, sc->PARAMETER.PWL_FUNC, data,SIM_INPUT_LOCON, NULL);
564 }
565 break;
566 default:
567 avt_errmsg(SIM_API_ERRMSG, "013", AVT_ERROR);
568 // fprintf (stderr, "[SIMAPI WAR] AddInputSlope param 4: allowed values are SIM_RISE and SIM_FALL\n");
569 }
570 SEPAR = separ;
571 }
572
573 //_____________________________________________________________________________
574
575 void sim_AddOutLoad (sim_model *sc, char *node, double load)
576 {
577 //char *vnode = gen_sim_devect (node);
578 char separ = SEPAR;
579 if (!sc) return;
580 SEPAR = SIM_SEPAR;
581
582 //TODO sim_input_set_out_load ((sim_model*)sc, vnode, load);
583
584 SEPAR = separ;
585 }
586
587 //_____________________________________________________________________________
588
589 void sim_AddWaveForm (sim_model *sc, char *node, double trise, double tfall, double periode, char *pattern)
590 {
591 char *vnode = gen_sim_devect (node);
592 char separ = SEPAR;
593 if (!sc) return;
594 SEPAR = SIM_SEPAR;
595
596 sim_input_set_slope_pattern ((sim_model*)sc, vnode,
597 SIM_UNIT_X_TO_Y (trise, 1.0, SIM_UNIT_TIME),
598 SIM_UNIT_X_TO_Y (tfall, 1.0, SIM_UNIT_TIME),
599 SIM_UNIT_X_TO_Y (periode, 1.0, SIM_UNIT_TIME),
600 pattern);
601 if ( V_BOOL_TAB[__SIM_USE_PRINT].VALUE )
602 sim_measure_set_locon ((sim_model*)sc, vnode);
603 SEPAR = separ;
604 }
605
606 //#############################################################################
607 //#############################################################################
608 //_______________ Initial IC values ___________________________________________
609 //#############################################################################
610 //#############################################################################
611
612 void sim_add_init_level (sim_model *sc, char *node, char locate, int level)
613 {
614 char separ = SEPAR;
615 if (!sc) return;
616 SEPAR = SIM_SEPAR;
617
618 switch (level) {
619 case 0:
620 sim_ic_set_level (sc, gen_sim_devect (node), locate, SIM_ZERO);
621 break;
622 case 1:
623 sim_ic_set_level (sc, gen_sim_devect (node), locate, SIM_ONE);
624 break;
625 default:
626 avt_errmsg(SIM_API_ERRMSG, "014", AVT_ERROR);
627 // fprintf (stderr, "[SIMAPI WAR] AddInitLevel param 2: allowed values are 0 and 1\n");
628 }
629
630 SEPAR = separ;
631 }
632
633 //_____________________________________________________________________________
634
635 void sim_AddInitLevel (sim_model *sc, char *node, int level)
636 {
637 char separ = SEPAR;
638 if (!sc) return;
639 SEPAR = SIM_SEPAR;
640
641 if (!sim_find_locon (gen_sim_devect (node), ((sim_model*)sc)->FIG,NULL,NULL))
642 sim_add_init_level ((sim_model*)sc, node, SIM_IC_SIGNAL, level);
643 else
644 sim_add_init_level ((sim_model*)sc, node, SIM_IC_LOCON, level);
645
646 SEPAR = separ;
647 }
648
649 //_____________________________________________________________________________
650
651 void sim_add_init_voltage (sim_model *sc, char *node, char locate, double voltage)
652 {
653 char separ = SEPAR;
654 if (!sc) return;
655 SEPAR = SIM_SEPAR;
656
657 sim_ic_set_voltage (sc, gen_sim_devect (node), locate, voltage);
658
659 SEPAR = separ;
660 }
661
662 //_____________________________________________________________________________
663
664 void sim_AddInitVoltage (sim_model *sc, char *node, double volt)
665 {
666 char separ = SEPAR;
667 if (!sc) return;
668 SEPAR = SIM_SEPAR;
669
670 if (!sim_find_locon (gen_sim_devect (node), ((sim_model*)sc)->FIG,NULL,NULL))
671 sim_add_init_voltage ((sim_model*)sc, node, SIM_IC_SIGNAL, volt);
672 else
673 sim_add_init_voltage ((sim_model*)sc, node, SIM_IC_LOCON, volt);
674
675 SEPAR = separ;
676 }
677
678
679 //#############################################################################
680 //#############################################################################
681 //_______________ Mesure PRINT points _________________________________________
682 //#############################################################################
683 //#############################################################################
684
685 void sim_AddMeasure (sim_model *sc, char *node)
686 {
687 char separ = SEPAR;
688 if (!sc) return;
689 SEPAR = SIM_SEPAR;
690
691 if (!sim_find_locon (gen_sim_devect (node), ((sim_model*)sc)->FIG,NULL,NULL))
692 sim_measure_set_signal ((sim_model*)sc, gen_sim_devect (node));
693 else
694 sim_measure_set_locon ((sim_model*)sc, gen_sim_devect (node));
695 SEPAR = separ;
696 }
697
698 //_____________________________________________________________________________
699
700 void sim_AddMeasureCurrent (sim_model *sc, char *node)
701 {
702 char separ = SEPAR;
703 if (!sc) return;
704 SEPAR = SIM_SEPAR;
705
706 sim_measure_current ((sim_model*)sc, gen_sim_devect (node));
707
708 SEPAR = separ;
709 }
710
711
712 //#############################################################################
713 //#############################################################################
714 //_______________ Simulation primitives _______________________________________
715 //#############################################################################
716 //#############################################################################
717
718 void sim_RunSimulation (sim_model *sc, char *sim_call)
719 {
720 char result;
721 char separ = SEPAR;
722 char *prev_sim_call;
723 if (!sc) return;
724 SEPAR = SIM_SEPAR;
725
726 prev_sim_call = strdup (sim_parameter_get_tool_cmd ((sim_model*)sc));
727
728 if (sim_call && strcmp(sim_call,"NULL")!=0)
729 sim_parameter_set_tool_cmd ((sim_model*)sc, sim_call);
730
731 result = sim_run_simu ((sim_model*)sc, SIM_RUN_ALL, NULL, NULL);
732 READ_RESULT = 0;
733 SEPAR = separ;
734 sim_parameter_set_tool_cmd ((sim_model*)sc, prev_sim_call);
735 free (prev_sim_call);
736 sim_GetAllMeasure(sc);
737 sim_freeMeasAllArg(sc);
738 }
739
740 //#############################################################################
741 //#############################################################################
742 //_______________ Computing primitives ________________________________________
743 //#############################################################################
744 //#############################################################################
745
746 double sim_ExtractMinSlope (sim_model *sc, char *node)
747 {
748 double slope, vth_low, vth_high;
749 char separ = SEPAR;
750 char type_node;
751 if (!sc) return 0.0;
752 SEPAR = SIM_SEPAR;
753
754 sim_read_tab_if_null ((sim_model*)sc);
755 vth_high = sim_parameter_get_slopeVTHH ((sim_model*)sc);
756 vth_low = sim_parameter_get_slopeVTHL ((sim_model*)sc);
757 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
758 type_node = 's';
759 else
760 type_node = 'c';
761 slope = sim_getslope ((sim_model*)sc, SIM_MIN, type_node, gen_sim_devect (node));
762 SEPAR = separ;
763 return slope;
764 }
765
766 //_____________________________________________________________________________
767 //
768 double sim_ExtractMaxSlope (sim_model *sc, char *node)
769 {
770 double slope, vth_low, vth_high;
771 char separ = SEPAR;
772 char type_node;
773 if (!sc) return 0.0;
774 SEPAR = SIM_SEPAR;
775
776 sim_read_tab_if_null ((sim_model*)sc);
777 vth_high = sim_parameter_get_slopeVTHH ((sim_model*)sc);
778 vth_low = sim_parameter_get_slopeVTHL ((sim_model*)sc);
779 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
780 type_node = 's';
781 else
782 type_node = 'c';
783 slope = sim_getslope ((sim_model*)sc, SIM_MAX, type_node, gen_sim_devect (node));
784 SEPAR = separ;
785 return slope;
786 }
787
788 //_____________________________________________________________________________
789
790 double sim_ExtractMinDelay (sim_model *sc, char *node_a, char *node_b)
791 {
792 double delay;
793 char separ = SEPAR;
794 char type_a,type_b;
795 if (!sc) return 0.0;
796 SEPAR = SIM_SEPAR;
797
798 sim_read_tab_if_null ((sim_model*)sc);
799 if (!sim_find_locon (gen_sim_devect (node_a), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
800 type_a = 's';
801 else
802 type_a = 'c';
803 if (!sim_find_locon (gen_sim_devect (node_b), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
804 type_b = 's';
805 else
806 type_b = 'c';
807 delay = sim_getdelay ((sim_model*)sc, SIM_MIN, type_a, gen_sim_devect (node_a),
808 type_b, gen_sim_devect (node_b));
809 SEPAR = separ;
810 return delay;
811 }
812
813 //_____________________________________________________________________________
814
815 double sim_ExtractMaxDelay (sim_model *sc, char *node_a, char *node_b)
816 {
817 double delay;
818 char separ = SEPAR;
819 char type_a,type_b;
820 if (!sc) return 0.0;
821 SEPAR = SIM_SEPAR;
822
823 sim_read_tab_if_null ((sim_model*)sc);
824 if (!sim_find_locon (gen_sim_devect (node_a), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
825 type_a = 's';
826 else
827 type_a = 'c';
828 if (!sim_find_locon (gen_sim_devect (node_b), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
829 type_b = 's';
830 else
831 type_b = 'c';
832 delay = sim_getdelay ((sim_model*)sc, SIM_MAX, type_a, gen_sim_devect (node_a),
833 type_b, gen_sim_devect (node_b));
834 SEPAR = separ;
835 return delay;
836 }
837
838 //_____________________________________________________________________________
839
840 void *sim_ExtractAllTimings (sim_model *sc, char *node_a, char *node_b)
841 {
842 char separ = SEPAR;
843 char type_a,type_b;
844 sim_timing *tmglist = NULL;
845 if (!sc) return NULL;
846 SEPAR = SIM_SEPAR;
847
848 sim_read_tab_if_null ((sim_model*)sc);
849 if (!sim_find_locon (gen_sim_devect (node_a), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
850 type_a = 's';
851 else
852 type_a = 'c';
853 if (!sim_find_locon (gen_sim_devect (node_b), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
854 type_b = 's';
855 else
856 type_b = 'c';
857 tmglist = sim_GetTmgList ((sim_model*)sc, type_a,gen_sim_devect (node_a),
858 type_b, gen_sim_devect (node_b));
859 SEPAR = separ;
860 return (sim_timing*)tmglist;
861 }
862
863 //_____________________________________________________________________________
864
865 double sim_ExtractMinTransitionDelay (sim_model *sc, char *node_a, char *node_b, char *transition)
866 {
867 double delay, th_in, th_out;
868 char separ = SEPAR;
869 char type_a;
870 char type_b;
871 if (!sc) return 0.0;
872 SEPAR = SIM_SEPAR;
873
874 sim_read_tab_if_null ((sim_model*)sc);
875 if (!sim_find_locon (gen_sim_devect (node_a), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
876 type_a = 's';
877 else
878 type_a = 'c';
879 if (!sim_find_locon (gen_sim_devect (node_b), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
880 type_b = 's';
881 else
882 type_b = 'c';
883 sim_get_THR(sc, &th_in, &th_out, NULL, NULL);
884 delay = sim_get_trans_delay ((sim_model*)sc, SIM_MIN, type_a, gen_sim_devect (node_a),
885 type_b, gen_sim_devect (node_b), transition, th_in, th_out);
886 SEPAR = separ;
887 return delay;
888 }
889
890 //_____________________________________________________________________________
891
892 double sim_ExtractMaxTransitionDelay (sim_model *sc, char *node_a, char *node_b, char *transition)
893 {
894 double delay, th_in, th_out;
895 char separ = SEPAR;
896 char type_a;
897 char type_b;
898 if (!sc) return 0.0;
899 SEPAR = SIM_SEPAR;
900
901 sim_read_tab_if_null ((sim_model*)sc);
902 if (!sim_find_locon (gen_sim_devect (node_a), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
903 type_a = 's';
904 else
905 type_a = 'c';
906 if (!sim_find_locon (gen_sim_devect (node_b), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
907 type_b = 's';
908 else
909 type_b = 'c';
910 sim_get_THR(sc, &th_in, &th_out, NULL, NULL);
911 delay = sim_get_trans_delay ((sim_model*)sc, SIM_MAX, type_a, gen_sim_devect (node_a),
912 type_b, gen_sim_devect (node_b), transition, th_in, th_out);
913 SEPAR = separ;
914 return delay;
915 }
916
917 //_____________________________________________________________________________
918
919 double sim_ExtractMinTransitionSlope (sim_model *sc, char *node, char *transition)
920 {
921 double slope, slopelow, slopehigh;
922 char separ = SEPAR;
923 char type;
924 if (!sc) return 0.0;
925 SEPAR = SIM_SEPAR;
926
927 sim_read_tab_if_null ((sim_model*)sc);
928 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
929 type = 's';
930 else
931 type = 'c';
932 sim_get_THR(sc, NULL, NULL, &slopelow, &slopehigh);
933 slope = sim_get_trans_slope ((sim_model*)sc, SIM_MIN, type, gen_sim_devect (node),transition, slopelow, slopehigh);
934 SEPAR = separ;
935 return slope;
936 }
937
938 //_____________________________________________________________________________
939
940 double sim_ExtractMaxTransitionSlope (sim_model *sc, char *node, char *transition)
941 {
942 double slope, slopelow, slopehigh;
943 char separ = SEPAR;
944 char type;
945 if (!sc) return 0.0;
946 SEPAR = SIM_SEPAR;
947
948 sim_read_tab_if_null ((sim_model*)sc);
949 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
950 type = 's';
951 else
952 type = 'c';
953 sim_get_THR(sc, NULL, NULL, &slopelow, &slopehigh);
954 slope = sim_get_trans_slope ((sim_model*)sc, SIM_MAX, type, gen_sim_devect (node),transition, slopelow, slopehigh);
955 SEPAR = separ;
956 return slope;
957 }
958
959 //__________ Timing API ______________________________________________________
960
961 void *sim_GetTimingFromList (chain_list *list)
962 {
963 if (list)
964 return ((chain_list*)list)->DATA;
965 else
966 return NULL;
967 }
968
969 //_____________________________________________________________________________
970
971 void *sim_GetTimingNext (void *timing)
972 {
973 if (timing)
974 return ((sim_timing*)timing)->NEXT;
975 else
976 return NULL;
977 }
978
979 //_____________________________________________________________________________
980
981 void *sim_GetTiming (char *root, char *node)
982 {
983 if (root && node)
984 return sim_timing_get (root,node);
985 else
986 return NULL;
987 }
988
989 //_____________________________________________________________________________
990
991 void *sim_GetTimingByEvent (char *root, char *node, char *nodeevent)
992 {
993 if (root && node)
994 return sim_timing_get_by_event (root,node,nodeevent);
995 else
996 return NULL;
997 }
998
999 //_____________________________________________________________________________
1000
1001 double sim_GetTimingDelay (void *timing)
1002 {
1003 if (timing)
1004 return ((sim_timing*)timing)->DELAY;
1005 else
1006 return 0.0;
1007 }
1008
1009 //_____________________________________________________________________________
1010
1011 double sim_GetTimingMinDelay (void *timing)
1012 {
1013 if (timing)
1014 return sim_timing_getdelaytype((sim_timing*)timing,SIM_MIN);
1015 else
1016 return 0.0;
1017 }
1018
1019 //_____________________________________________________________________________
1020
1021 double sim_GetTimingMaxDelay (void *timing)
1022 {
1023 if (timing)
1024 return sim_timing_getdelaytype((sim_timing*)timing,SIM_MAX);
1025 else
1026 return 0.0;
1027 }
1028
1029 //_____________________________________________________________________________
1030
1031 double sim_GetTimingSlope (void *timing)
1032 {
1033 if (timing)
1034 return ((sim_timing*)timing)->SLOPE;
1035 else
1036 return 0.0;
1037 }
1038
1039 //_____________________________________________________________________________
1040
1041 double sim_GetTimingMinSlope (void *timing)
1042 {
1043 if (timing)
1044 return sim_timing_getslopetype((sim_timing*)timing,SIM_MIN);
1045 else
1046 return 0.0;
1047 }
1048
1049 //_____________________________________________________________________________
1050
1051 double sim_GetTimingMaxSlope (void *timing)
1052 {
1053 if (timing)
1054 return sim_timing_getslopetype((sim_timing*)timing,SIM_MAX);
1055 else
1056 return 0.0;
1057 }
1058
1059 //_____________________________________________________________________________
1060
1061 char *sim_GetTimingRoot (void *timing)
1062 {
1063 if (timing)
1064 return ((sim_timing*)timing)->ROOT4USR;
1065 else
1066 return NULL;
1067 }
1068
1069 //_____________________________________________________________________________
1070
1071 char *sim_GetTimingNode (void *timing)
1072 {
1073 if (timing)
1074 return ((sim_timing*)timing)->NODE4USR;
1075 else
1076 return NULL;
1077 }
1078
1079 //_____________________________________________________________________________
1080
1081 char *sim_GetTimingRootInNetlist (void *timing)
1082 {
1083 if (timing)
1084 return ((sim_timing*)timing)->ROOT;
1085 else
1086 return NULL;
1087 }
1088
1089 //_____________________________________________________________________________
1090
1091 char *sim_GetTimingNodeInNetlist (void *timing)
1092 {
1093 if (timing)
1094 return ((sim_timing*)timing)->NODE;
1095 else
1096 return NULL;
1097 }
1098
1099 //_____________________________________________________________________________
1100
1101 char sim_GetTimingRootEvent (void *timing)
1102 {
1103 if (timing)
1104 return ((sim_timing*)timing)->ROOTEVENT;
1105 else
1106 return 0;
1107 }
1108
1109 //_____________________________________________________________________________
1110
1111 char sim_GetTimingNodeEvent (void *timing)
1112 {
1113 if (timing)
1114 return ((sim_timing*)timing)->NODEEVENT;
1115 else
1116 return 0;
1117 }
1118
1119 //______ Noise API ____________________________________________________________
1120
1121 void sim_NoiseExtract (sim_model *sc, char *node, double vthnoise, double tinit, double tfinal)
1122 {
1123 char separ = SEPAR;
1124 char type;
1125 if (!sc) return;
1126 SEPAR = SIM_SEPAR;
1127
1128 sim_read_tab_if_null ((sim_model*)sc);
1129 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
1130 type = 's';
1131 else
1132 type = 'c';
1133 sim_noise_extract ((sim_model*)sc, type, gen_sim_devect (node),vthnoise,tinit,tfinal);
1134 SEPAR = separ;
1135 }
1136
1137 //_____________________________________________________________________________
1138
1139 double sim_NoiseGetVth (sim_model *sc, char *name)
1140 {
1141 char separ = SEPAR;
1142 char type,noisetype;
1143 double vthnoise = 0.0;
1144 if (!sc) return 0.0;
1145 SEPAR = SIM_SEPAR;
1146
1147 sim_read_tab_if_null ((sim_model*)sc);
1148 if (!sim_find_locon (gen_sim_devect (name), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
1149 type = 's';
1150 else
1151 type = 'c';
1152 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1153 vthnoise = sim_noise_get_vth (sim_noise_get (gen_sim_devect (name),noisetype));
1154 SEPAR = separ;
1155
1156 return vthnoise;
1157 }
1158
1159 //_____________________________________________________________________________
1160
1161 chain_list *sim_NoiseGetMomentList (sim_model *sc, char *name)
1162 {
1163 char separ = SEPAR;
1164 char type,noisetype;
1165 chain_list *tclst = NULL;
1166 if (!sc) return NULL;
1167 SEPAR = SIM_SEPAR;
1168
1169 sim_read_tab_if_null ((sim_model*)sc);
1170 if (!sim_find_locon (gen_sim_devect (name), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
1171 type = 's';
1172 else
1173 type = 'c';
1174 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1175 tclst = sim_noise_get_idxc (sim_noise_get (gen_sim_devect (name),noisetype));
1176 SEPAR = separ;
1177
1178 return tclst;
1179 }
1180
1181 //_____________________________________________________________________________
1182
1183 double sim_NoiseGetMoment (sim_model *sc, chain_list *noise_tclist)
1184 {
1185 char separ = SEPAR;
1186 double res = 0.0;
1187 chain_list *tc;
1188 if (!sc) return 0.0;
1189 SEPAR = SIM_SEPAR;
1190
1191 if (noise_tclist) {
1192 tc = (chain_list*)noise_tclist;
1193 res = sim_noise_get_time_byindex ((sim_model*)sc,(int)(long)tc->DATA);
1194 }
1195 SEPAR = separ;
1196
1197 return res;
1198 }
1199
1200 //_____________________________________________________________________________
1201
1202 double sim_NoiseGetPeakValue (sim_model *sc, char *name,chain_list *noise_peaklist)
1203 {
1204 char separ = SEPAR;
1205 char noisetype;
1206 double res = 0.0;
1207 chain_list *peak;
1208 if (!sc) return 0.0;
1209 SEPAR = SIM_SEPAR;
1210
1211 if (noise_peaklist) {
1212 peak = (chain_list*)noise_peaklist;
1213 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1214 res = sim_noise_get_volt_byindex (sim_noise_get(gen_sim_devect(name),noisetype),
1215 (int)(long)peak->DATA);
1216 }
1217 SEPAR = separ;
1218
1219 return res;
1220 }
1221
1222 //_____________________________________________________________________________
1223
1224 double sim_NoiseGetPeakMoment (sim_model *sc, chain_list *noise_peaklist)
1225 {
1226 char separ = SEPAR;
1227 double res = 0.0;
1228 chain_list *peak;
1229 if (!sc) return 0.0;
1230 SEPAR = SIM_SEPAR;
1231
1232 if (noise_peaklist) {
1233 peak = (chain_list*)noise_peaklist;
1234 res = sim_noise_get_time_byindex ((sim_model*)sc,(int)(long)peak->DATA);
1235 }
1236 SEPAR = separ;
1237
1238 return res;
1239 }
1240
1241 //_____________________________________________________________________________
1242
1243 chain_list *sim_NoiseGetPeakList (sim_model *sc, char *name)
1244 {
1245 char separ = SEPAR;
1246 char type,noisetype;
1247 chain_list *peaklst = NULL;
1248 if (!sc) return NULL;
1249 SEPAR = SIM_SEPAR;
1250
1251 sim_read_tab_if_null ((sim_model*)sc);
1252 if (!sim_find_locon (gen_sim_devect (name), sim_model_get_lofig ((sim_model*)sc), NULL, NULL))
1253 type = 's';
1254 else
1255 type = 'c';
1256 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1257 peaklst = sim_noise_get_idxpeak (sim_noise_get (gen_sim_devect (name),noisetype));
1258 SEPAR = separ;
1259
1260 return peaklst;
1261 }
1262
1263 //_____________________________________________________________________________
1264
1265 double sim_NoiseExtractMaxPeakValue (sim_model *sc, char *name)
1266 {
1267 char noisetype;
1268 char separ = SEPAR;
1269 double maxpeak = 0.0;
1270 if (!sc) return 0.0;
1271 SEPAR = SIM_SEPAR;
1272
1273 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1274 maxpeak = sim_noise_get_max_peak_value (sim_noise_get (gen_sim_devect(name),noisetype));
1275 SEPAR = separ;
1276
1277 return maxpeak;
1278 }
1279
1280 //_____________________________________________________________________________
1281
1282 double sim_NoiseExtractMinPeakValue (sim_model *sc, char *name)
1283 {
1284 char noisetype;
1285 char separ = SEPAR;
1286 double minpeak = 0.0;
1287 if (!sc) return 0.0;
1288 SEPAR = SIM_SEPAR;
1289
1290 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1291 minpeak = sim_noise_get_min_peak_value (sim_noise_get (gen_sim_devect(name),noisetype));
1292 SEPAR = separ;
1293
1294 return minpeak;
1295 }
1296
1297 //_____________________________________________________________________________
1298
1299 double sim_NoiseExtractMaxPeakMoment (sim_model *sc, char *name)
1300 {
1301 char noisetype;
1302 char separ = SEPAR;
1303 double maxpeak_time = 0.0;
1304 if (!sc) return 0.0;
1305 SEPAR = SIM_SEPAR;
1306
1307 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1308 maxpeak_time = sim_noise_get_max_peak_time ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),noisetype));
1309 SEPAR = separ;
1310
1311 return maxpeak_time;
1312 }
1313
1314 //_____________________________________________________________________________
1315
1316 double sim_NoiseExtractMinPeakMoment (sim_model *sc, char *name)
1317 {
1318 char noisetype;
1319 char separ = SEPAR;
1320 double minpeak_time = 0.0;
1321 if (!sc) return 0.0;
1322 SEPAR = SIM_SEPAR;
1323
1324 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1325 minpeak_time = sim_noise_get_min_peak_time ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),noisetype));
1326 SEPAR = separ;
1327
1328 return minpeak_time;
1329 }
1330
1331 //_____________________________________________________________________________
1332
1333 double sim_NoiseGetMomentBeforePeak (sim_model *sc, char *name,chain_list *peakl)
1334 {
1335 chain_list *peak = (chain_list*)peakl;
1336 char noisetype;
1337 char separ = SEPAR;
1338 double beforepeakintant = 0.0;
1339 if (!sc) return 0.0;
1340 SEPAR = SIM_SEPAR;
1341
1342 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1343 beforepeakintant = sim_noise_get_time_before_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1344 noisetype),(int)(long)peak->DATA);
1345 SEPAR = separ;
1346
1347 return beforepeakintant;
1348 }
1349
1350 //_____________________________________________________________________________
1351
1352 double sim_NoiseGetMomentAfterPeak (sim_model *sc, char *name,chain_list *peakl)
1353 {
1354 chain_list *peak = (chain_list*)peakl;
1355 char noisetype;
1356 char separ = SEPAR;
1357 double afterpeakintant = 0.0;
1358 if (!sc) return 0.0;
1359 SEPAR = SIM_SEPAR;
1360
1361 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1362 afterpeakintant = sim_noise_get_time_after_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1363 noisetype),(int)(long)peak->DATA);
1364 SEPAR = separ;
1365
1366 return afterpeakintant;
1367 }
1368
1369 //_____________________________________________________________________________
1370
1371 double sim_NoiseGetPeakDuration (sim_model *sc, char *name,chain_list *peakl)
1372 {
1373 chain_list *peak = (chain_list*)peakl;
1374 char noisetype;
1375 char separ = SEPAR;
1376 double peakduration = 0.0;
1377 if (!sc) return 0.0;
1378 SEPAR = SIM_SEPAR;
1379
1380 noisetype = sim_parameter_get_noise_type ((sim_model*)sc);
1381 peakduration = sim_noise_get_peak_duration ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1382 noisetype),(int)(long)peak->DATA);
1383 SEPAR = separ;
1384
1385 return peakduration;
1386 }
1387
1388 //_____________________________________________________________________________
1389
1390 double sim_NoiseExtractMomentBeforeMaxPeak (sim_model *sc, char *name)
1391 {
1392 char separ = SEPAR;
1393 double instant = 0.0;
1394 if (!sc) return 0.0;
1395 SEPAR = SIM_SEPAR;
1396
1397 instant = sim_noise_get_max_ci_before_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1398 SIM_MAX));
1399 SEPAR = separ;
1400
1401 return instant;
1402 }
1403
1404 //_____________________________________________________________________________
1405
1406 double sim_NoiseExtractMomentBeforeMinPeak (sim_model *sc, char *name)
1407 {
1408 char separ = SEPAR;
1409 double instant = 0.0;
1410 if (!sc) return 0.0;
1411 SEPAR = SIM_SEPAR;
1412
1413 instant = sim_noise_get_min_ci_before_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1414 SIM_MIN));
1415 SEPAR = separ;
1416
1417 return instant;
1418 }
1419
1420 //_____________________________________________________________________________
1421
1422 double sim_NoiseExtractMomentAfterMaxPeak (sim_model *sc, char *name)
1423 {
1424 char separ = SEPAR;
1425 double instant = 0.0;
1426 if (!sc) return 0.0;
1427 SEPAR = SIM_SEPAR;
1428
1429 instant = sim_noise_get_max_ci_after_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1430 SIM_MAX));
1431 SEPAR = separ;
1432
1433 return instant;
1434 }
1435
1436 //_____________________________________________________________________________
1437
1438 double sim_NoiseExtractMomentAfterMinPeak (sim_model *sc, char *name)
1439 {
1440 char separ = SEPAR;
1441 double instant = 0.0;
1442 if (!sc) return 0.0;
1443 SEPAR = SIM_SEPAR;
1444
1445 instant = sim_noise_get_min_ci_after_peak ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1446 SIM_MIN));
1447 SEPAR = separ;
1448
1449 return instant;
1450 }
1451
1452 //_____________________________________________________________________________
1453
1454 double sim_NoiseExtractMaxPeakDuration (sim_model *sc, char *name)
1455 {
1456 char separ = SEPAR;
1457 double duration = 0.0;
1458 if (!sc) return 0.0;
1459 SEPAR = SIM_SEPAR;
1460
1461 duration = sim_noise_get_max_peak_duration ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1462 SIM_MAX));
1463 SEPAR = separ;
1464
1465 return duration;
1466 }
1467
1468 //_____________________________________________________________________________
1469
1470 double sim_NoiseExtractMinPeakDuration (sim_model *sc, char *name)
1471 {
1472 char separ = SEPAR;
1473 double duration = 0.0;
1474 if (!sc) return 0.0;
1475 SEPAR = SIM_SEPAR;
1476
1477 duration = sim_noise_get_min_peak_duration ((sim_model*)sc,sim_noise_get (gen_sim_devect(name),
1478 SIM_MIN));
1479 SEPAR = separ;
1480
1481 return duration;
1482 }
1483
1484 //_____________________________________________________________________________
1485
1486 void sim_DriveNodeState (sim_model *sc, char *filename,char *node_ref,char *node_state2drive,char type)
1487 {
1488 char type_a,type_b;
1489 char separ = SEPAR;
1490
1491 if (!sc) return ;
1492 SEPAR = SIM_SEPAR;
1493
1494 sim_read_tab_if_null ((sim_model*)sc);
1495 if (!sim_find_locon (gen_sim_devect (node_ref), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
1496 type_a = 'S';
1497 else
1498 type_a = 'C';
1499 if (!sim_find_locon (gen_sim_devect (node_state2drive), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
1500 type_b = 'S';
1501 else
1502 type_b = 'C';
1503
1504 sim_get_nodes_events ((sim_model*)sc,filename,node_ref,type_a,node_state2drive,type_b,type);
1505
1506 SEPAR = separ;
1507 }
1508
1509 //_____________________________________________________________________________
1510
1511 /*void sim_DriveFile2Plot (sim_model *sc, chain_list *name2plot)
1512 {
1513 char separ = SEPAR;
1514
1515 if (!sc || !name2plot) return ;
1516 SEPAR = SIM_SEPAR;
1517
1518 sim_read_tab_if_null (sc);
1519
1520 sim_drive_plot_file (sc, NULL, name2plot);
1521
1522 SEPAR = separ;
1523 }*/
1524
1525 //_____________________________________________________________________________
1526 //
1527 double sim_ExtractCommutInstant (sim_model *sc, char *node,double voltage)
1528 {
1529 double instant;
1530 char separ = SEPAR;
1531 char type_node;
1532
1533 if (!sc) return 0.0;
1534 SEPAR = SIM_SEPAR;
1535
1536 sim_read_tab_if_null ((sim_model*)sc);
1537 if (!sim_find_locon (gen_sim_devect (node), sim_model_get_lofig((sim_model*)sc),NULL,NULL))
1538 type_node = 's';
1539 else
1540 type_node = 'c';
1541 instant = sim_get_commut_instant ((sim_model*)sc, gen_sim_devect (node), type_node,voltage);
1542 SEPAR = separ;
1543 return instant;
1544 }
1545
1546 void sim_AddAlias(sim_model *sc, char *source, char *destination)
1547 {
1548 sim_input_add_alias(sc, namealloc(gen_makesignalname(source)), namealloc(gen_makesignalname(destination)));
1549 }
1550
1551 void sim_RenameModel(sim_model *sc, char *name)
1552 {
1553 sc->FIGNAME=namealloc(name);
1554 sc->FIG->NAME=sc->FIGNAME;
1555 }
1556
1557 void sim_SetExternalCapacitance(sim_model *sc, char *node, double value)
1558 {
1559 sim_set_external_capa(sc, node, value);
1560 }
1561
1562 sim_model *sim_CreateNetlistContext()
1563 {
1564 sim_model *sc;
1565 lofig_list *lf;
1566
1567 lf=gns_GetNetlist();
1568 if (gns_IsBlackBox())
1569 {
1570 mbkContext *curctx;
1571 lofig_list *flatbb;
1572 loins_list *ptins;
1573 curctx=mbkCreateContext();
1574 lf=gns_GetBlackboxNetlist(lf->NAME);
1575 transfert_needed_lofigs(lf, curctx);
1576 flatbb=rduplofig(lf);
1577 lofigchain(flatbb);
1578 if (CUR_CORRESP_TABLE!=NULL)
1579 {
1580 ptins=mbk_quickly_getloinsbyname(LATEST_GNS_RUN->GLOBAL_LOFIG, CUR_CORRESP_TABLE->GENIUS_INSNAME);
1581 if (ptins!=NULL)
1582 mbk_transfert_loins_params(ptins, lf, flatbb);
1583 }
1584 mbkSwitchContext(curctx);
1585 flatbb=flatOutsideList(flatbb);
1586 mbkFreeAndSwitchContext(curctx);
1587 lf=flatbb;
1588 }
1589 else
1590 lf=gns_FlattenNetlist(lf, INTERNAL_RC|OUT_RC);
1591 sc=sim_CreateContext(lf);
1592 return sc;
1593 }
1594
1595 lofig_list *sim_GetContextNetlist(sim_model *sc)
1596 {
1597 if (sc==NULL) return NULL;
1598 return sc->FIG;
1599 }