7 #define API_USE_REAL_TYPES
9 #include "sim_API_extract.h"
11 //#############################################################################
12 //#############################################################################
14 //typedef SIM_FLOAT (*PWL_FUNCTION) (SIM_FLOAT, void *);
16 //_____________________________________________________________________________
18 chain_list
*FLOAT_TO_FREE
= NULL
;
19 chain_list
*SIM_MODEL
= NULL
;
20 //PWL_FUNCTION PWL_FUNC = NULL;
25 char *gen_sim_devect(char *name
)
27 return namealloc(gen_makesignalname(name
));
31 //_____________________________________________________________________________
33 void sim_DriveTransistorAsInstance(sim_model
*sc
, char mode
)
35 if (tolower(mode
)=='y')
36 sc
->PARAMETER
.TRANSISTOR_AS_INSTANCE
=SIM_YES
;
38 sc
->PARAMETER
.TRANSISTOR_AS_INSTANCE
=SIM_NO
;
42 void sim_API_Action_Initialize ()// commentaire pour desactiver l'ajout de token
51 if ((str
= V_STR_TAB
[__MBK_SEPAR
].VALUE
))
58 //_____________________________________________________________________________
60 void sim_API_Action_Terminate ()// commentaire pour desactiver l'ajout de token
64 chain_list
*to_free
, *sim
;
69 for (sim
= SIM_MODEL
; sim
; sim
= sim
->NEXT
) {
70 mdl
=(sim_model
*)sim
->DATA
;
71 figname
= mdl
->FIG
->NAME
;
72 freeflatmodel (mdl
->FIG
);
74 sim_model_clear (figname
);
76 freechain (SIM_MODEL
);
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
);
87 //#############################################################################
88 //#############################################################################
89 //_______________ UTILS _______________________________________________________
90 //#############################################################################
91 //#############################################################################
93 sim_model
*sim_new_model_if_null (lofig_list
*fig
)
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
);
105 //_____________________________________________________________________________
107 sim_model
*sim_CreateContext (lofig_list
*fig
)
109 sim_model
*mod
= sim_new_model_if_null ((lofig_list
*)fig
);
110 // SIM_MODEL = addchain (SIM_MODEL, mod);
114 void sim_FreeContext (sim_model
*model
)
116 sim_clean_netlist(model
);
117 gns_FreeNetlist(model
->FIG
);
119 sim_free_context (model
);
121 //_____________________________________________________________________________
123 void sim_read_tab_if_null (sim_model
*sc
)
127 sim_parse_spiceout (sc
);
131 //#############################################################################
132 //#############################################################################
133 //_______________ GENERAL PARAMETERS __________________________________________
134 //#############################################################################
135 //#############################################################################
137 void sim_SetSimulatorType (sim_model
*sc
, char *type
)
140 if (!strcasecmp (type
, "eldo"))
141 sim_parameter_set_tool (sc
, SIM_TOOL_ELDO
);
143 if (!strcasecmp (type
, "mspice"))
144 sim_parameter_set_tool (sc
, SIM_TOOL_MSPICE
);
146 if (!strcasecmp (type
, "hspice"))
147 sim_parameter_set_tool (sc
, SIM_TOOL_HSPICE
);
149 if (!strcasecmp (type
, "titan"))
150 sim_parameter_set_tool (sc
, SIM_TOOL_TITAN
);
152 if (!strcasecmp (type
, "titanv7"))
153 sim_parameter_set_tool (sc
, SIM_TOOL_TITAN7
);
155 if (!strcasecmp (type
, "spice"))
156 sim_parameter_set_tool (sc
, SIM_TOOL_SPICE
);
158 if (!strcasecmp (type
, "ngspice"))
159 sim_parameter_set_tool (sc
, SIM_TOOL_NGSPICE
);
161 if (!strcasecmp (type
, "ltspice"))
162 sim_parameter_set_tool (sc
, SIM_TOOL_LTSPICE
);
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);
170 //_____________________________________________________________________________
172 void sim_SetSlopeForm (sim_model
*sc
, void *f
)
174 sc
->PARAMETER
.PWL_FUNC
= (PWL_FUNCTION
)f
;
177 //_____________________________________________________________________________
179 void sim_SetSimulationTime (sim_model
*sc
, double time
) // unit: SECOND
182 sim_parameter_set_tran_tmax ((sim_model
*)sc
, SIM_UNIT_X_TO_Y (time
, 1, SIM_UNIT_TIME
));
185 //_____________________________________________________________________________
187 void sim_SetSimulationSlope (sim_model
*sc
, double slope
) // unit: SECOND
190 sim_parameter_set_slope ((sim_model
*)sc
, SIM_UNIT_X_TO_Y (slope
, 1, SIM_UNIT_TIME
));
193 //_____________________________________________________________________________
195 void sim_SetSimulationStep (sim_model
*sc
, double step
) // unit: SECOND
198 sim_parameter_set_tran_step ((sim_model
*)sc
, SIM_UNIT_X_TO_Y (step
, 1, SIM_UNIT_TIME
));
201 //_____________________________________________________________________________
203 void sim_SetSimulationSupply (sim_model
*sc
, double v_max
) // unit: VOLT
206 sim_parameter_set_alim ((sim_model
*)sc
, SIM_UNIT_X_TO_Y (v_max
, 1, SIM_UNIT_VOLTAGE
), 'i');
209 void sim_SetInputSwing (sim_model
*sc
, double v_vss
, double v_max
) // unit: VOLT
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');
216 void sim_SetOutputSwing (sim_model
*sc
, double v_vss
, double v_max
) // unit: VOLT
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');
222 //_____________________________________________________________________________
224 double sim_GetSimulationSupply () // unit: VOLT
226 return V_FLOAT_TAB
[__SIM_POWER_SUPPLY
].VALUE
;
229 //_____________________________________________________________________________
231 void sim_SetSimulationTemp (sim_model
*sc
, double temp
) // unit: CELSIUS
234 sim_parameter_set_temperature ((sim_model
*)sc
, temp
);
237 //_____________________________________________________________________________
239 void sim_SetDelayVTH (sim_model
*sc
, double vth
) // pourcentage de VDD
242 sim_parameter_set_delayVTH ((sim_model
*)sc
, vth
, vth
);
245 //_____________________________________________________________________________
247 void sim_SetSlopeVTH (sim_model
*sc
, double vth_low
, double vth_high
) // pourcentage de VDD
250 sim_parameter_set_slopeVTHH ((sim_model
*)sc
, vth_high
);
251 sim_parameter_set_slopeVTHL ((sim_model
*)sc
, vth_low
);
254 //_____________________________________________________________________________
256 void sim_AddSimulationTechnoFile (sim_model
*sc
, char *tech_file
)
259 sim_parameter_add_techno_file ((sim_model
*)sc
, tech_file
);
261 //_____________________________________________________________________________
263 void sim_SetSimulationOutputFile (sim_model
*sc
, char *output_file
)
266 MCC_SPICEOUT
= output_file
;
269 //_____________________________________________________________________________
271 void sim_SetSimulationCall (sim_model
*sc
, char *sim_call
)
275 sim_parameter_set_tool_cmd ((sim_model
*)sc
, sim_call
);
278 //_____________________________________________________________________________
280 void sim_NoiseSetAnalyseType (sim_model
*sc
, char noise_type
)
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");
287 sim_parameter_set_noise_type ((sim_model
*)sc
,noise_type
);
290 //#############################################################################
291 //#############################################################################
292 //_______________ DC values ___________________________________________________
293 //#############################################################################
294 //#############################################################################
296 void sim_AddStuckLevelVector (sim_model
*sc
, char *node
, char *level
)
298 int left
, right
, i
, j
= 0, lbin
;
305 if (level
[0] == '0' && (level
[1] == 'x' || level
[1] == 'X'))
310 if (vectorindex (node
) == -1)
311 vectorbounds (((sim_model
*)sc
)->FIG
, namealloc (node
), &left
, &right
);
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
);
317 if (!strcmp (val
, "1"))
318 sim_input_set_stuck_level ((sim_model
*)sc
, gen_sim_devect (node
), SIM_ONE
);
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);
325 if (left
!= -1 && right
!= -1) { // a vector
327 sim_hex2bin (binary
, val
);
328 lbin
= strlen (binary
);
330 if (left
<= right
) { // v (left TO right)
331 for (i
= left
; i
<= right
; i
++) {
333 if (binary
[j
] == '1')
334 sim_input_set_stuck_level ((sim_model
*)sc
, sim_vectorize (node
, i
), SIM_ONE
);
336 if (binary
[j
] == '0')
337 sim_input_set_stuck_level ((sim_model
*)sc
, sim_vectorize (node
, i
), SIM_ZERO
);
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
);
345 if (left
> right
) { // v (left DOWNTO right)
347 for (i
= right
; i
<= left
; i
++) {
349 if (binary
[j
] == '1')
350 sim_input_set_stuck_level ((sim_model
*)sc
, sim_vectorize (node
, i
), SIM_ONE
);
352 if (binary
[j
] == '0')
353 sim_input_set_stuck_level ((sim_model
*)sc
, sim_vectorize (node
, i
), SIM_ZERO
);
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
);
365 void sim_AddStuckLevel(sim_model
*sc
, char *node
, int level
)
367 int left
, right
, i
, lbin
;
372 if (level
!=0 && level
!=1)
374 avt_errmsg(SIM_API_ERRMSG
, "011", AVT_ERROR
, level
, node
);
375 // fprintf (stderr, "AddStuckLevel: bad value '%c' for node %s\n", level, node);
381 node
=gen_sim_devect (node
);
383 lbin
=vectorindex (node
);
386 vectorbounds (sc
->FIG
, node
, &left
, &right
);
390 if (left
==-1 || right
==-1)
393 sim_input_set_stuck_level (sc
, node
, SIM_ZERO
);
395 sim_input_set_stuck_level (sc
, node
, SIM_ONE
);
399 if (left
>right
) { lbin
=right
; right
=left
; left
=lbin
; }
400 node
=vectorradical(node
);
401 for (i
= left
; i
<= right
; i
++)
404 sim_input_set_stuck_level (sc
, sim_vectorize (node
, i
), SIM_ZERO
);
406 sim_input_set_stuck_level (sc
, sim_vectorize (node
, i
), SIM_ONE
);
412 //_____________________________________________________________________________
414 void sim_AddStuckVoltage (sim_model
*sc
, char *node
, double voltage
)
420 sim_input_set_stuck_voltage ((sim_model
*)sc
, gen_sim_devect (node
), voltage
);
425 //_____________________________________________________________________________
427 void sim_AddStuckLevel (sim_model *sc, char *node, int level)
435 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ZERO);
438 sim_input_set_stuck_level ((sim_model*)sc, gen_sim_devect (node), SIM_ONE);
441 fprintf (stderr, "[SIMAPI WAR] AddStuckLevel param 2: allowed values are 0 and 1\n");
447 //#############################################################################
448 //#############################################################################
449 //_______________ PWL _________________________________________________________
450 //#############################################################################
451 //#############################################################################
454 //_____________________________________________________________________________
456 void sim_AddSignalSlope (sim_model
*sc
, char *node
, double start_time
, double transition_time
, char sense
)
458 char *vnode
= gen_sim_devect (node
);
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
));
464 // FLOAT_TO_FREE = addchain (FLOAT_TO_FREE, data);
469 // sim_new_model_if_null (((sim_model*)sc)->FIG);
470 sense
=toupper(sense
);
473 if (!sc
->PARAMETER
.PWL_FUNC
)
474 sim_input_set_slope_single ((sim_model
*)sc
,
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');
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
);
490 sim_measure_set_signal ((sim_model
*)sc
, vnode
);
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
);
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');
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
);
505 sim_measure_set_signal ((sim_model
*)sc
, vnode
);
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");
514 //_____________________________________________________________________________
516 void sim_AddSlope (sim_model
*sc
, char *node
, double start_time
, double transition_time
, char sense
)
518 char *vnode
= gen_sim_devect (node
);
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
));
524 // FLOAT_TO_FREE = addchain (FLOAT_TO_FREE, data);
527 if (sim_find_locon(vnode
, sc
->FIG
, NULL
, NULL
)==NULL
)
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);
535 // sim_new_model_if_null (((sim_model*)sc)->FIG);
536 sense
=toupper(sense
);
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
);
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');
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
);
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
);
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');
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
);
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");
573 //_____________________________________________________________________________
575 void sim_AddOutLoad (sim_model
*sc
, char *node
, double load
)
577 //char *vnode = gen_sim_devect (node);
582 //TODO sim_input_set_out_load ((sim_model*)sc, vnode, load);
587 //_____________________________________________________________________________
589 void sim_AddWaveForm (sim_model
*sc
, char *node
, double trise
, double tfall
, double periode
, char *pattern
)
591 char *vnode
= gen_sim_devect (node
);
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
),
601 if ( V_BOOL_TAB
[__SIM_USE_PRINT
].VALUE
)
602 sim_measure_set_locon ((sim_model
*)sc
, vnode
);
606 //#############################################################################
607 //#############################################################################
608 //_______________ Initial IC values ___________________________________________
609 //#############################################################################
610 //#############################################################################
612 void sim_add_init_level (sim_model
*sc
, char *node
, char locate
, int level
)
620 sim_ic_set_level (sc
, gen_sim_devect (node
), locate
, SIM_ZERO
);
623 sim_ic_set_level (sc
, gen_sim_devect (node
), locate
, SIM_ONE
);
626 avt_errmsg(SIM_API_ERRMSG
, "014", AVT_ERROR
);
627 // fprintf (stderr, "[SIMAPI WAR] AddInitLevel param 2: allowed values are 0 and 1\n");
633 //_____________________________________________________________________________
635 void sim_AddInitLevel (sim_model
*sc
, char *node
, int level
)
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
);
644 sim_add_init_level ((sim_model
*)sc
, node
, SIM_IC_LOCON
, level
);
649 //_____________________________________________________________________________
651 void sim_add_init_voltage (sim_model
*sc
, char *node
, char locate
, double voltage
)
657 sim_ic_set_voltage (sc
, gen_sim_devect (node
), locate
, voltage
);
662 //_____________________________________________________________________________
664 void sim_AddInitVoltage (sim_model
*sc
, char *node
, double volt
)
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
);
673 sim_add_init_voltage ((sim_model
*)sc
, node
, SIM_IC_LOCON
, volt
);
679 //#############################################################################
680 //#############################################################################
681 //_______________ Mesure PRINT points _________________________________________
682 //#############################################################################
683 //#############################################################################
685 void sim_AddMeasure (sim_model
*sc
, char *node
)
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
));
694 sim_measure_set_locon ((sim_model
*)sc
, gen_sim_devect (node
));
698 //_____________________________________________________________________________
700 void sim_AddMeasureCurrent (sim_model
*sc
, char *node
)
706 sim_measure_current ((sim_model
*)sc
, gen_sim_devect (node
));
712 //#############################################################################
713 //#############################################################################
714 //_______________ Simulation primitives _______________________________________
715 //#############################################################################
716 //#############################################################################
718 void sim_RunSimulation (sim_model
*sc
, char *sim_call
)
726 prev_sim_call
= strdup (sim_parameter_get_tool_cmd ((sim_model
*)sc
));
728 if (sim_call
&& strcmp(sim_call
,"NULL")!=0)
729 sim_parameter_set_tool_cmd ((sim_model
*)sc
, sim_call
);
731 result
= sim_run_simu ((sim_model
*)sc
, SIM_RUN_ALL
, NULL
, NULL
);
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
);
740 //#############################################################################
741 //#############################################################################
742 //_______________ Computing primitives ________________________________________
743 //#############################################################################
744 //#############################################################################
746 double sim_ExtractMinSlope (sim_model
*sc
, char *node
)
748 double slope
, vth_low
, vth_high
;
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
))
761 slope
= sim_getslope ((sim_model
*)sc
, SIM_MIN
, type_node
, gen_sim_devect (node
));
766 //_____________________________________________________________________________
768 double sim_ExtractMaxSlope (sim_model
*sc
, char *node
)
770 double slope
, vth_low
, vth_high
;
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
))
783 slope
= sim_getslope ((sim_model
*)sc
, SIM_MAX
, type_node
, gen_sim_devect (node
));
788 //_____________________________________________________________________________
790 double sim_ExtractMinDelay (sim_model
*sc
, char *node_a
, char *node_b
)
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
))
803 if (!sim_find_locon (gen_sim_devect (node_b
), sim_model_get_lofig((sim_model
*)sc
),NULL
,NULL
))
807 delay
= sim_getdelay ((sim_model
*)sc
, SIM_MIN
, type_a
, gen_sim_devect (node_a
),
808 type_b
, gen_sim_devect (node_b
));
813 //_____________________________________________________________________________
815 double sim_ExtractMaxDelay (sim_model
*sc
, char *node_a
, char *node_b
)
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
))
828 if (!sim_find_locon (gen_sim_devect (node_b
), sim_model_get_lofig((sim_model
*)sc
),NULL
,NULL
))
832 delay
= sim_getdelay ((sim_model
*)sc
, SIM_MAX
, type_a
, gen_sim_devect (node_a
),
833 type_b
, gen_sim_devect (node_b
));
838 //_____________________________________________________________________________
840 void *sim_ExtractAllTimings (sim_model
*sc
, char *node_a
, char *node_b
)
844 sim_timing
*tmglist
= NULL
;
845 if (!sc
) return NULL
;
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
))
853 if (!sim_find_locon (gen_sim_devect (node_b
), sim_model_get_lofig((sim_model
*)sc
),NULL
,NULL
))
857 tmglist
= sim_GetTmgList ((sim_model
*)sc
, type_a
,gen_sim_devect (node_a
),
858 type_b
, gen_sim_devect (node_b
));
860 return (sim_timing
*)tmglist
;
863 //_____________________________________________________________________________
865 double sim_ExtractMinTransitionDelay (sim_model
*sc
, char *node_a
, char *node_b
, char *transition
)
867 double delay
, th_in
, th_out
;
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
))
879 if (!sim_find_locon (gen_sim_devect (node_b
), sim_model_get_lofig ((sim_model
*)sc
), NULL
, NULL
))
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
);
890 //_____________________________________________________________________________
892 double sim_ExtractMaxTransitionDelay (sim_model
*sc
, char *node_a
, char *node_b
, char *transition
)
894 double delay
, th_in
, th_out
;
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
))
906 if (!sim_find_locon (gen_sim_devect (node_b
), sim_model_get_lofig ((sim_model
*)sc
), NULL
, NULL
))
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
);
917 //_____________________________________________________________________________
919 double sim_ExtractMinTransitionSlope (sim_model
*sc
, char *node
, char *transition
)
921 double slope
, slopelow
, slopehigh
;
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
))
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
);
938 //_____________________________________________________________________________
940 double sim_ExtractMaxTransitionSlope (sim_model
*sc
, char *node
, char *transition
)
942 double slope
, slopelow
, slopehigh
;
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
))
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
);
959 //__________ Timing API ______________________________________________________
961 void *sim_GetTimingFromList (chain_list
*list
)
964 return ((chain_list
*)list
)->DATA
;
969 //_____________________________________________________________________________
971 void *sim_GetTimingNext (void *timing
)
974 return ((sim_timing
*)timing
)->NEXT
;
979 //_____________________________________________________________________________
981 void *sim_GetTiming (char *root
, char *node
)
984 return sim_timing_get (root
,node
);
989 //_____________________________________________________________________________
991 void *sim_GetTimingByEvent (char *root
, char *node
, char *nodeevent
)
994 return sim_timing_get_by_event (root
,node
,nodeevent
);
999 //_____________________________________________________________________________
1001 double sim_GetTimingDelay (void *timing
)
1004 return ((sim_timing
*)timing
)->DELAY
;
1009 //_____________________________________________________________________________
1011 double sim_GetTimingMinDelay (void *timing
)
1014 return sim_timing_getdelaytype((sim_timing
*)timing
,SIM_MIN
);
1019 //_____________________________________________________________________________
1021 double sim_GetTimingMaxDelay (void *timing
)
1024 return sim_timing_getdelaytype((sim_timing
*)timing
,SIM_MAX
);
1029 //_____________________________________________________________________________
1031 double sim_GetTimingSlope (void *timing
)
1034 return ((sim_timing
*)timing
)->SLOPE
;
1039 //_____________________________________________________________________________
1041 double sim_GetTimingMinSlope (void *timing
)
1044 return sim_timing_getslopetype((sim_timing
*)timing
,SIM_MIN
);
1049 //_____________________________________________________________________________
1051 double sim_GetTimingMaxSlope (void *timing
)
1054 return sim_timing_getslopetype((sim_timing
*)timing
,SIM_MAX
);
1059 //_____________________________________________________________________________
1061 char *sim_GetTimingRoot (void *timing
)
1064 return ((sim_timing
*)timing
)->ROOT4USR
;
1069 //_____________________________________________________________________________
1071 char *sim_GetTimingNode (void *timing
)
1074 return ((sim_timing
*)timing
)->NODE4USR
;
1079 //_____________________________________________________________________________
1081 char *sim_GetTimingRootInNetlist (void *timing
)
1084 return ((sim_timing
*)timing
)->ROOT
;
1089 //_____________________________________________________________________________
1091 char *sim_GetTimingNodeInNetlist (void *timing
)
1094 return ((sim_timing
*)timing
)->NODE
;
1099 //_____________________________________________________________________________
1101 char sim_GetTimingRootEvent (void *timing
)
1104 return ((sim_timing
*)timing
)->ROOTEVENT
;
1109 //_____________________________________________________________________________
1111 char sim_GetTimingNodeEvent (void *timing
)
1114 return ((sim_timing
*)timing
)->NODEEVENT
;
1119 //______ Noise API ____________________________________________________________
1121 void sim_NoiseExtract (sim_model
*sc
, char *node
, double vthnoise
, double tinit
, double tfinal
)
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
))
1133 sim_noise_extract ((sim_model
*)sc
, type
, gen_sim_devect (node
),vthnoise
,tinit
,tfinal
);
1137 //_____________________________________________________________________________
1139 double sim_NoiseGetVth (sim_model
*sc
, char *name
)
1142 char type
,noisetype
;
1143 double vthnoise
= 0.0;
1144 if (!sc
) return 0.0;
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
))
1152 noisetype
= sim_parameter_get_noise_type ((sim_model
*)sc
);
1153 vthnoise
= sim_noise_get_vth (sim_noise_get (gen_sim_devect (name
),noisetype
));
1159 //_____________________________________________________________________________
1161 chain_list
*sim_NoiseGetMomentList (sim_model
*sc
, char *name
)
1164 char type
,noisetype
;
1165 chain_list
*tclst
= NULL
;
1166 if (!sc
) return NULL
;
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
))
1174 noisetype
= sim_parameter_get_noise_type ((sim_model
*)sc
);
1175 tclst
= sim_noise_get_idxc (sim_noise_get (gen_sim_devect (name
),noisetype
));
1181 //_____________________________________________________________________________
1183 double sim_NoiseGetMoment (sim_model
*sc
, chain_list
*noise_tclist
)
1188 if (!sc
) return 0.0;
1192 tc
= (chain_list
*)noise_tclist
;
1193 res
= sim_noise_get_time_byindex ((sim_model
*)sc
,(int)(long)tc
->DATA
);
1200 //_____________________________________________________________________________
1202 double sim_NoiseGetPeakValue (sim_model
*sc
, char *name
,chain_list
*noise_peaklist
)
1208 if (!sc
) return 0.0;
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
);
1222 //_____________________________________________________________________________
1224 double sim_NoiseGetPeakMoment (sim_model
*sc
, chain_list
*noise_peaklist
)
1229 if (!sc
) return 0.0;
1232 if (noise_peaklist
) {
1233 peak
= (chain_list
*)noise_peaklist
;
1234 res
= sim_noise_get_time_byindex ((sim_model
*)sc
,(int)(long)peak
->DATA
);
1241 //_____________________________________________________________________________
1243 chain_list
*sim_NoiseGetPeakList (sim_model
*sc
, char *name
)
1246 char type
,noisetype
;
1247 chain_list
*peaklst
= NULL
;
1248 if (!sc
) return NULL
;
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
))
1256 noisetype
= sim_parameter_get_noise_type ((sim_model
*)sc
);
1257 peaklst
= sim_noise_get_idxpeak (sim_noise_get (gen_sim_devect (name
),noisetype
));
1263 //_____________________________________________________________________________
1265 double sim_NoiseExtractMaxPeakValue (sim_model
*sc
, char *name
)
1269 double maxpeak
= 0.0;
1270 if (!sc
) return 0.0;
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
));
1280 //_____________________________________________________________________________
1282 double sim_NoiseExtractMinPeakValue (sim_model
*sc
, char *name
)
1286 double minpeak
= 0.0;
1287 if (!sc
) return 0.0;
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
));
1297 //_____________________________________________________________________________
1299 double sim_NoiseExtractMaxPeakMoment (sim_model
*sc
, char *name
)
1303 double maxpeak_time
= 0.0;
1304 if (!sc
) return 0.0;
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
));
1311 return maxpeak_time
;
1314 //_____________________________________________________________________________
1316 double sim_NoiseExtractMinPeakMoment (sim_model
*sc
, char *name
)
1320 double minpeak_time
= 0.0;
1321 if (!sc
) return 0.0;
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
));
1328 return minpeak_time
;
1331 //_____________________________________________________________________________
1333 double sim_NoiseGetMomentBeforePeak (sim_model
*sc
, char *name
,chain_list
*peakl
)
1335 chain_list
*peak
= (chain_list
*)peakl
;
1338 double beforepeakintant
= 0.0;
1339 if (!sc
) return 0.0;
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
);
1347 return beforepeakintant
;
1350 //_____________________________________________________________________________
1352 double sim_NoiseGetMomentAfterPeak (sim_model
*sc
, char *name
,chain_list
*peakl
)
1354 chain_list
*peak
= (chain_list
*)peakl
;
1357 double afterpeakintant
= 0.0;
1358 if (!sc
) return 0.0;
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
);
1366 return afterpeakintant
;
1369 //_____________________________________________________________________________
1371 double sim_NoiseGetPeakDuration (sim_model
*sc
, char *name
,chain_list
*peakl
)
1373 chain_list
*peak
= (chain_list
*)peakl
;
1376 double peakduration
= 0.0;
1377 if (!sc
) return 0.0;
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
);
1385 return peakduration
;
1388 //_____________________________________________________________________________
1390 double sim_NoiseExtractMomentBeforeMaxPeak (sim_model
*sc
, char *name
)
1393 double instant
= 0.0;
1394 if (!sc
) return 0.0;
1397 instant
= sim_noise_get_max_ci_before_peak ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1404 //_____________________________________________________________________________
1406 double sim_NoiseExtractMomentBeforeMinPeak (sim_model
*sc
, char *name
)
1409 double instant
= 0.0;
1410 if (!sc
) return 0.0;
1413 instant
= sim_noise_get_min_ci_before_peak ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1420 //_____________________________________________________________________________
1422 double sim_NoiseExtractMomentAfterMaxPeak (sim_model
*sc
, char *name
)
1425 double instant
= 0.0;
1426 if (!sc
) return 0.0;
1429 instant
= sim_noise_get_max_ci_after_peak ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1436 //_____________________________________________________________________________
1438 double sim_NoiseExtractMomentAfterMinPeak (sim_model
*sc
, char *name
)
1441 double instant
= 0.0;
1442 if (!sc
) return 0.0;
1445 instant
= sim_noise_get_min_ci_after_peak ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1452 //_____________________________________________________________________________
1454 double sim_NoiseExtractMaxPeakDuration (sim_model
*sc
, char *name
)
1457 double duration
= 0.0;
1458 if (!sc
) return 0.0;
1461 duration
= sim_noise_get_max_peak_duration ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1468 //_____________________________________________________________________________
1470 double sim_NoiseExtractMinPeakDuration (sim_model
*sc
, char *name
)
1473 double duration
= 0.0;
1474 if (!sc
) return 0.0;
1477 duration
= sim_noise_get_min_peak_duration ((sim_model
*)sc
,sim_noise_get (gen_sim_devect(name
),
1484 //_____________________________________________________________________________
1486 void sim_DriveNodeState (sim_model
*sc
, char *filename
,char *node_ref
,char *node_state2drive
,char type
)
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
))
1499 if (!sim_find_locon (gen_sim_devect (node_state2drive
), sim_model_get_lofig((sim_model
*)sc
),NULL
,NULL
))
1504 sim_get_nodes_events ((sim_model
*)sc
,filename
,node_ref
,type_a
,node_state2drive
,type_b
,type
);
1509 //_____________________________________________________________________________
1511 /*void sim_DriveFile2Plot (sim_model *sc, chain_list *name2plot)
1515 if (!sc || !name2plot) return ;
1518 sim_read_tab_if_null (sc);
1520 sim_drive_plot_file (sc, NULL, name2plot);
1525 //_____________________________________________________________________________
1527 double sim_ExtractCommutInstant (sim_model
*sc
, char *node
,double voltage
)
1533 if (!sc
) return 0.0;
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
))
1541 instant
= sim_get_commut_instant ((sim_model
*)sc
, gen_sim_devect (node
), type_node
,voltage
);
1546 void sim_AddAlias(sim_model
*sc
, char *source
, char *destination
)
1548 sim_input_add_alias(sc
, namealloc(gen_makesignalname(source
)), namealloc(gen_makesignalname(destination
)));
1551 void sim_RenameModel(sim_model
*sc
, char *name
)
1553 sc
->FIGNAME
=namealloc(name
);
1554 sc
->FIG
->NAME
=sc
->FIGNAME
;
1557 void sim_SetExternalCapacitance(sim_model
*sc
, char *node
, double value
)
1559 sim_set_external_capa(sc
, node
, value
);
1562 sim_model
*sim_CreateNetlistContext()
1567 lf
=gns_GetNetlist();
1568 if (gns_IsBlackBox())
1573 curctx
=mbkCreateContext();
1574 lf
=gns_GetBlackboxNetlist(lf
->NAME
);
1575 transfert_needed_lofigs(lf
, curctx
);
1576 flatbb
=rduplofig(lf
);
1578 if (CUR_CORRESP_TABLE
!=NULL
)
1580 ptins
=mbk_quickly_getloinsbyname(LATEST_GNS_RUN
->GLOBAL_LOFIG
, CUR_CORRESP_TABLE
->GENIUS_INSNAME
);
1582 mbk_transfert_loins_params(ptins
, lf
, flatbb
);
1584 mbkSwitchContext(curctx
);
1585 flatbb
=flatOutsideList(flatbb
);
1586 mbkFreeAndSwitchContext(curctx
);
1590 lf
=gns_FlattenNetlist(lf
, INTERNAL_RC
|OUT_RC
);
1591 sc
=sim_CreateContext(lf
);
1595 lofig_list
*sim_GetContextNetlist(sim_model
*sc
)
1597 if (sc
==NULL
) return NULL
;