1 /*****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : SIM Version 2.00 */
6 /* Fichier : sim_obj.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /*****************************************************************************/
18 ht
*SIM_MODEL_LIST
=NULL
;
22 if( !SIM_MODEL_LIST
) {
23 SIM_MODEL_LIST
= addht( 10 );
27 lofig_list
* sim_model_get_lofig( sim_model
*model
)
29 if( !model
) return NULL
;
33 void sim_model_set_lofig( sim_model
*model
, lofig_list
*lofig
)
38 sim_model
* sim_model_alloc( void )
42 newmodel
= (sim_model
*)mbkalloc( sizeof( sim_model
) );
43 newmodel
->LINPUT
= NULL
;
44 newmodel
->LMEASURE
= NULL
;
45 newmodel
->TRANSLATION
= NULL
;
48 newmodel
->FIGNAME
= NULL
;
49 newmodel
->HTINPUT
= NULL
;
50 newmodel
->OUTPUT_FILE
= NULL
;
51 newmodel
->OUTPUT_READ
= 0;
52 // newmodel->CONTEXT_HT = NULL;
53 newmodel
->USER
= NULL
;
54 /* extraction fields */
55 newmodel
->LLABELS
= NULL
;
56 mfe_duprules(&(newmodel
->LRULES
),SIM_EXTRACT_RULE
);
57 newmodel
->LARGS
= NULL
;
58 newmodel
->LPRN
= NULL
;
60 strcpy(newmodel
->SUBCKTFILENAME
,"");
64 void sim_model_free( sim_model
*model
)
66 if( model
->LINPUT
|| model
->LMEASURE
|| model
->HTINPUT
||
67 model
->OUTPUT_FILE
|| model
->LIC
|| model
->TRANSLATION
||
68 model
->LLABELS
|| model
->LRULES
|| model
->LARGS
||
70 sim_error( "sim_model_free() : model %s not empty.\n", model
->FIGNAME
);
74 sim_model
* sim_model_create_new( char *name
)
80 newmodel
= sim_model_alloc();
81 newmodel
->FIGNAME
= name
;
83 sim_parameter_init( newmodel
);
84 sim_input_init( newmodel
);
89 sim_model
* sim_model_create( char *name
, int nbmc
)
95 SIM_VT_SLOPEIN
= -1.0;
97 if( sim_model_get( name
) ) {
98 sim_error( "sim_create_model() : model %d already declared.\n", name
);
101 newmodel
=sim_model_create_new(name
);
102 addhtitem( SIM_MODEL_LIST
, newmodel
->FIGNAME
, (long)newmodel
);
103 newmodel
->NBMC
= nbmc
;
108 sim_model
* sim_model_get( char *name
)
114 model
= (sim_model
*)gethtitem( SIM_MODEL_LIST
, name
);
116 if( model
== (sim_model
*)EMPTYHT
)
122 void sim_model_clear_bypointer( sim_model
*model
)
127 sim_input_clean( model
);
128 sim_measure_clean( model
);
129 sim_ic_clean( model
);
130 sim_parameter_clean( model
);
131 sim_translate_clean( model
);
133 mfe_freerules(&(model
->LRULES
));
134 if( model
->NBMC
> 0 )
135 mfe_freelabels(&(model
->LLABELS
),1);
137 mfe_freelabels(&(model
->LLABELS
),0);
138 sim_freeMeasAllArg(model
);
141 mbkfree( model
->OUTPUT_FILE
);
142 model
->OUTPUT_FILE
= NULL
;
144 sim_model_free( model
);
146 /* if (model->CONTEXT_HT!=NULL) delht(model->CONTEXT_HT);
147 model->CONTEXT_HT=NULL;*/
150 void sim_model_clear( char *name
)
156 model
= (sim_model
*)gethtitem( SIM_MODEL_LIST
, name
);
158 if( model
== (sim_model
*)EMPTYHT
)
162 freeptype (model
->USER
);
164 sim_model_clear_bypointer(model
);
166 delhtitem( SIM_MODEL_LIST
, name
);
168 /* if (model->CONTEXT_HT!=NULL) delht(model->CONTEXT_HT);
169 model->CONTEXT_HT=NULL;*/
172 void sim_set_output_file( sim_model
*model
, char *file
)
174 if (model
->OUTPUT_FILE
)
175 mbkfree (model
->OUTPUT_FILE
);
176 model
->OUTPUT_FILE
= mbkstrdup(file
);
179 char* sim_get_output_file( sim_model
*model
)
181 return model
->OUTPUT_FILE
;
184 /*****************************************************************************\
185 Fonction de modification des parametres d'un model sim
186 *******************************************************************************
188 FUNCTION : sim_update_model_interf_name
190 Fonction qui met a jour les noms des differents slope,init,measure ...du model
192 \*****************************************************************************/
193 void sim_update_model_locon_name (sim_model
*model
,
198 sim_input
*input
= NULL
;
199 sim_measure
*measure
= NULL
;
201 if ((measure
= sim_measure_get( model
,
204 SIM_MEASURE_VOLTAGE
))) {
205 sim_measure_clear (model
,oldname
,
209 sim_measure_set_locon (model
,newname
);
213 if ((ic
= sim_ic_get (model
, oldname
, SIM_IC_LOCON
)))
214 ic
->WHERE
.LOCON_NAME
= newname
;
216 // update input slope or out capa
217 if ((input
= sim_input_get (model
,oldname
)))
218 input
->LOCON_NAME
= newname
;
221 /*****************************************************************************\
223 FUNCTION : sim_update_model_signal_name
225 Prefixe tous les noms des signaux
227 \*****************************************************************************/
228 void sim_update_model_signal_name (sim_model
*model
, char *prefix
)
230 sim_measure
*measure
= NULL
;
234 while( (measure
= sim_measure_scan( model
, measure
)) ) {
235 switch( sim_measure_get_what( measure
) ) {
236 case SIM_MEASURE_VOLTAGE
:
237 switch( sim_measure_get_type( measure
) ) {
238 case SIM_MEASURE_SIGNAL
:
239 measure
->WHERE
.SIGNAL_NAME
= concatname (prefix
,
240 sim_measure_get_name (measure
));
247 while( (ic
= sim_ic_scan( model
, ic
)) ) {
248 switch( sim_ic_get_locate( ic
) ) {
250 ic
->WHERE
.SIGNAL_NAME
= concatname (prefix
,sim_ic_get_name (ic
));
256 /*****************************************************************************\
258 FUNCTION : sim_shift_input
260 Shift input start time
262 \*****************************************************************************/
263 void sim_shift_input (sim_model
*model
, SIM_FLOAT shift
)
267 sim_input
*input
= NULL
;
268 char type
,level
,subtype
;
269 SIM_FLOAT trise
, tstart
;
270 SIM_FLOAT (*func
)(SIM_FLOAT t
, void *data
);
272 SIM_FLOAT
*data
,*olddata
;
274 lofig
= sim_model_get_lofig( model
);
275 for( locon
= lofig
->LOCON
; locon
; locon
= locon
->NEXT
) {
276 input
= sim_input_get( model
, locon
->NAME
);
277 type
= sim_input_get_type( input
);
284 subtype
= sim_input_get_slope_type( input
);
286 case SIM_SLOPE_SINGLE
:
287 sim_input_get_slope_single( input
, &level
, &trise
, &tstart
);
288 if ( tstart
+shift
>= 0.0 )
289 input
->UINPUT
.INPUT_SLOPE
.MODEL
.SLOPE_SINGLE
.TSTART
= tstart
+shift
;
291 input
->UINPUT
.INPUT_SLOPE
.MODEL
.SLOPE_SINGLE
.TSTART
= 0.0;
293 case SIM_SLOPE_PATTERN
:
299 sim_input_get_func( input
, &func
, &userdata
) ;
300 data
= (SIM_FLOAT
*)(input
->UINPUT
.INPUT_FUNC
.USER_DATA
);
301 olddata
= (SIM_FLOAT
*)userdata
;
302 if ( olddata
[0]+shift
>= 0.0 )
303 data
[0] = olddata
[0]+shift
;
312 /*****************************************************************************\
314 FUNCTION : sim_model_merge_ic
316 \*****************************************************************************/
317 void sim_model_merge_ic (sim_model
*srcmodel
, sim_model
*model
)
322 while( (ic
= sim_ic_scan( model
, ic
)) ) {
323 switch( sim_ic_get_locate( ic
) ) {
325 ic_locate
= SIM_IC_LOCON
;
328 ic_locate
= SIM_IC_SIGNAL
;
331 switch (sim_ic_get_type( ic
)) {
332 case SIM_IC_VOLTAGE
: sim_ic_set_voltage (srcmodel
,
333 sim_ic_get_name (ic
),
335 sim_ic_get_voltage(ic
));
337 case SIM_IC_LEVEL
: sim_ic_set_level (srcmodel
,
338 sim_ic_get_name (ic
),
340 sim_ic_get_level(ic
));
346 /*****************************************************************************\
348 FUNCTION : sim_model_merge_measure
350 \*****************************************************************************/
351 void sim_model_merge_measure (sim_model
*srcmodel
, sim_model
*model
)
353 sim_measure
*measure
= NULL
;
355 while( (measure
= sim_measure_scan( model
, measure
)) ) {
356 switch( sim_measure_get_what( measure
) ) {
357 case SIM_MEASURE_VOLTAGE
:
358 switch( sim_measure_get_type( measure
) ) {
359 case SIM_MEASURE_LOCON
:
360 sim_measure_set_locon (srcmodel
,sim_measure_get_name (measure
));
362 case SIM_MEASURE_SIGNAL
:
363 sim_measure_set_signal (srcmodel
,sim_measure_get_name (measure
));
367 case SIM_MEASURE_CURRENT
:
373 /*****************************************************************************\
375 FUNCTION : sim_model_merge_input
377 \*****************************************************************************/
378 void sim_model_merge_input (sim_model
*srcmodel
, sim_model
*model
,char *insname
)
382 sim_input
*input
= NULL
;
383 char type
,level
,subtype
;
384 SIM_FLOAT trise
, tfall
,period
,tstart
;
386 SIM_FLOAT (*func
)(SIM_FLOAT t
, void *data
);
391 lofig
= sim_model_get_lofig( model
);
392 for( losig
= lofig
->LOSIG
; losig
; losig
= losig
->NEXT
) {
393 input
= sim_input_get( model
, getsigname (losig
) );
394 type
= sim_input_get_type( input
);
398 if (input
->LOSIG_NAME
) {
399 locate
= SIM_INPUT_SIGNAL
;
400 newinputname
= concatname (insname
,sim_input_get_name (input
));
403 locate
= SIM_INPUT_LOCON
;
404 newinputname
= sim_input_get_name (input
);
406 if (sim_input_get(srcmodel
,newinputname
)) {
407 sim_input_clear ( srcmodel
,newinputname
);
413 subtype
= sim_input_get_stuck_type( input
);
415 case SIM_STUCK_LEVEL
:
416 sim_input_set_stuck_level( srcmodel
, sim_input_get_name (input
),
417 sim_input_get_stuck_level( input
));
419 case SIM_STUCK_VALUE
:
420 sim_input_set_stuck_voltage ( srcmodel
, sim_input_get_name(input
),
421 sim_input_get_stuck_voltage( input
));
426 subtype
= sim_input_get_slope_type( input
);
428 case SIM_SLOPE_SINGLE
:
429 sim_input_get_slope_single( input
, &level
, &trise
, &tstart
);
430 sim_input_set_slope_single( srcmodel
,
438 case SIM_SLOPE_PATTERN
:
439 sim_input_get_slope_pattern( input
, &trise
, &tfall
,
441 sim_input_set_slope_pattern( srcmodel
, sim_input_get_name (input
),
442 trise
, tfall
,period
,pattern
);
448 sim_input_get_func( input
, &func
, &userdata
) ;
449 sim_input_set_func (srcmodel
, newinputname
, func
, userdata
,locate
,NULL
);
456 /*****************************************************************************\
458 FUNCTION : sim_model_merge
460 Merge deux modeles sim : - measure
464 Le modele merge est srcmodel
466 \*****************************************************************************/
467 void sim_model_merge (sim_model
*srcmodel
, sim_model
*model
, char *insname
)
470 sim_model_merge_ic (srcmodel
,model
);
473 sim_model_merge_measure (srcmodel
,model
);
476 sim_model_merge_input (srcmodel
,model
,insname
);
479 void sim_clean_netlist(sim_model
*model
)
483 if (model
->FIG
!=NULL
)
485 for (lc
=model
->FIG
->LOCON
; lc
!=NULL
; lc
=lc
->NEXT
)
486 if ((pt
=getptype(lc
->USER
, SIM_EXT_CAPA
))!=NULL
) mbkfree(pt
->DATA
);
490 void sim_free_context (sim_model
*model
)
492 if (model
->FIG
!=NULL
)
494 sim_clean_netlist(model
);
495 freeflatmodel (model
->FIG
);
498 sim_model_clear_bypointer( model
);
501 void sim_set_filename(sim_model
*model
, char *filename
)
503 strcpy(model
->SUBCKTFILENAME
, filename
);
506 void sim_set_external_capa(sim_model
*model
, char *con
, SIM_FLOAT value
)
512 if (model
==NULL
) return;
514 for (lc
=model
->FIG
->LOCON
; lc
!=NULL
&& lc
->NAME
!=con
; lc
=lc
->NEXT
) ;
518 if ((pt
=getptype(lc
->USER
, SIM_EXT_CAPA
))==NULL
)
519 pt
=lc
->USER
=addptype(lc
->USER
, SIM_EXT_CAPA
, mbkalloc(sizeof(SIM_FLOAT
)));
520 *(SIM_FLOAT
*)pt
->DATA
=value
;
523 sim_error( "could not find connector '%s' in netlist %s\n", con
, model
->FIGNAME
);
526 SIM_FLOAT
sim_get_external_capa(sim_model
*model
, locon_list
*lc
)
529 if ((pt
=getptype(lc
->USER
, SIM_EXT_CAPA
))==NULL
) return 0;
531 return *(SIM_FLOAT
*)pt
->DATA
;
534 void sim_resetmeasures(sim_model
*model
)
536 if( model
->NBMC
> 0 )
537 mfe_freelabels(&(model
->LLABELS
),1);
539 mfe_freelabels(&(model
->LLABELS
),0);
540 sim_freeMeasAllArg(model
);