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) : Grégoire AVOT */
13 /*****************************************************************************/
19 char sim_run_simu( sim_model
*model
, int run
, char *outputfilename
, FILE *outputfile
)
22 int oldSPI_TRANSISTOR_AS_INSTANCE
=V_INT_TAB
[__SIM_TRANSISTOR_AS_INSTANCE
].VALUE
;
24 V_INT_TAB
[__SIM_TRANSISTOR_AS_INSTANCE
].VALUE
=model
->PARAMETER
.TRANSISTOR_AS_INSTANCE
;
26 mfe_cleanLabel(model
->LLABELS
);
31 switch( model
->PARAMETER
.TOOL
) {
33 case SIM_TOOL_NGSPICE
:
34 case SIM_TOOL_LTSPICE
:
41 r
= sim_run_simu_spice( model
, run
, outputfilename
, outputfile
);
45 sim_error( "sim_run_simu(): bad value for tool.\n" );
47 model
->OUTPUT_READ
= 0;
49 V_INT_TAB
[__SIM_TRANSISTOR_AS_INSTANCE
].VALUE
=oldSPI_TRANSISTOR_AS_INSTANCE
;
54 /*---------------------------------------------------------------------------*/
56 void print_white_space (FILE *file
, int whitespace
)
59 for (i
= 0 ; i
< whitespace
; i
++)
63 /*---------------------------------------------------------------------------*/
65 void sim_drive_plot_file (sim_model
*model
, chain_list
*sig2plot
, chain_list
*name2plot
)
69 SIM_FLOAT vddmax
,time
,step
,printstep
;
70 sim_measure
*measure
= NULL
;
71 sim_measure_detail
*measuredetail
= NULL
;
72 char datfilename
[1024];
73 char pltfilename
[1024];
75 int i
,j
,nbnode
= 0,nbval
, rcdone
;
79 spisig_list
*spisignal
;
82 sprintf (datfilename
,"%s.dat",model
->FIGNAME
);
83 if (!(file
= fopen (datfilename
,"w"))) {
84 fprintf (stderr
, "sim_drive_plot_file : can't open file %s!!!\n",
88 time
= sim_parameter_get_tran_tmax (model
);
89 step
= sim_parameter_get_tran_step (model
);
90 vddmax
= sim_parameter_get_alim (model
, 'i');
91 nbval
= (int)((time
/ step
)+0.5);
93 // Recupere tous les tableaux de valeurs des nodes
94 fprintf (file
,"#time");
95 for (chain
= name2plot
; chain
; chain
= chain
->NEXT
)
97 tab
= (double**)mbkalloc(nbnode
*sizeof (double*));
99 spisignal
= (spisig_list
*)sig2plot
->DATA
;
100 nodename
= efg_GetSpiSigLoconRc(spisignal
,'I');
101 if (!nodename
) nodename
= efg_GetSpiSigLoconRc(spisignal
,'O');
102 if (!nodename
) nodename
= sim_devect(efg_GetSpiSigName(spisignal
));
104 for (chain
= name2plot
; chain
; chain
= chain
->NEXT
) {
105 if (!spisignal
&& rcdone
) {
106 fprintf (stderr
,"sim_drive_plot_file : signal and name incoherency !!!\n");
110 if (i
== 0) print_white_space (file
,5);
111 else print_white_space (file
,9);
112 fprintf (file
,"%s",(char *)chain
->DATA
);
113 tab
[i
] = (double*)mbkalloc(nbval
*sizeof(double)) ;
115 sim_find_by_name(nodename
, sim_model_get_lofig(model
), &locon
, &losig
, NULL
);
117 measure
= sim_measure_get(model
, nodename
, SIM_MEASURE_LOCON
, SIM_MEASURE_VOLTAGE
);
119 if(!measure
&& losig
) {
120 measure
= sim_measure_get(model
, nodename
, SIM_MEASURE_SIGNAL
, SIM_MEASURE_VOLTAGE
);
123 fprintf (stderr
,"sim_drive_plot_file : no measure found on node %s !!!\n",nodename
);
128 measuredetail
= sim_measure_detail_scan(measure
,NULL
);
129 if (!measuredetail
) {
130 fprintf (stderr
,"sim_drive_plot_file : no measure detail found on node %s !!!\n",nodename
);
134 else tab
[i
] = sim_measure_detail_get_data(measuredetail
);
137 if (rcdone
|| !spisignal
->HASRCLINE
|| efg_GetSpiSigLoconRc(spisignal
,'O') == NULL
) {
139 sig2plot
= sig2plot
->NEXT
;
141 spisignal
= (spisig_list
*)sig2plot
->DATA
;
142 nodename
= efg_GetSpiSigLoconRc(spisignal
,'I');
143 if (!nodename
) nodename
= sim_devect(efg_GetSpiSigName(spisignal
));
145 else spisignal
= NULL
;
148 nodename
= efg_GetSpiSigLoconRc(spisignal
,'O');
157 fprintf (stderr
,"sim_drive_plot_file : signal and name incoherency !!!\n");
161 // Drive the file.dat
164 for (j
= 0 ; j
<= nbval
; j
++) {
165 fprintf (file
, "%.3e ",printstep
);
166 for (i
= 0 ; i
< nbnode
; i
++) fprintf (file
, "%.3e ",tab
[i
][j
]);
167 fprintf (file
, "\n");
173 if (fclose(file
) != 0) {
174 fprintf (stderr
, "sim_drive_plot_file can't close file %s\n", datfilename
);
178 // Drive the file.plt
179 sprintf (pltfilename
,"%s.plt",model
->FIGNAME
);
180 if (!(file
= fopen (pltfilename
,"w"))) {
181 fprintf (stderr
, "sim_drive_plot_file : can't open file %s!!!\n", pltfilename
);
184 fprintf (file
,"set term %s\n", V_STR_TAB
[__AVT_GNUPLOT_TERM
].VALUE
);
185 fprintf(file
,"set xlabel \"TIME (PS)\"\n");
186 fprintf(file
,"set ylabel \"VOUT (V)\"\n");
187 fprintf(file
,"plot [0:%e] [0.0:%d] ", time
,(int)vddmax
+ 1);
189 for (chain
= name2plot
; chain
->NEXT
; chain
= chain
->NEXT
) {
190 fprintf(file
,"'%s' using 1:%d title '%s' with lines, ", datfilename
,j
,(char *)chain
->DATA
);
193 fprintf(file
,"'%s' using 1:%d title '%s' with lines\n", datfilename
,j
,(char *)chain
->DATA
);
194 fprintf(file
,"pause -1 'Hit CR to finish'\n");
196 if (fclose(file
) != 0) {
197 fprintf (stderr
, "sim_drive_plot_file can't close file %s\n", pltfilename
);