Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / sim / sim_drive.c
1 /*****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Produit : SIM Version 2.00 */
6 /* Fichier : sim_obj.c */
7 /* */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Grégoire AVOT */
12 /* */
13 /*****************************************************************************/
14
15 #include SIM_H
16 #include "sim.h"
17
18
19 char sim_run_simu( sim_model *model, int run, char *outputfilename, FILE *outputfile)
20 {
21 char r=0;
22 int oldSPI_TRANSISTOR_AS_INSTANCE=V_INT_TAB[__SIM_TRANSISTOR_AS_INSTANCE].VALUE;
23
24 V_INT_TAB[__SIM_TRANSISTOR_AS_INSTANCE].VALUE=model->PARAMETER.TRANSISTOR_AS_INSTANCE;
25
26 mfe_cleanLabel(model->LLABELS);
27
28
29
30
31 switch( model->PARAMETER.TOOL ) {
32
33 case SIM_TOOL_NGSPICE :
34 case SIM_TOOL_LTSPICE :
35 case SIM_TOOL_ELDO:
36 case SIM_TOOL_TITAN:
37 case SIM_TOOL_TITAN7:
38 case SIM_TOOL_HSPICE:
39 case SIM_TOOL_MSPICE:
40 case SIM_TOOL_SPICE:
41 r = sim_run_simu_spice( model, run, outputfilename, outputfile);
42 break;
43
44 default :
45 sim_error( "sim_run_simu(): bad value for tool.\n" );
46 }
47 model->OUTPUT_READ = 0;
48
49 V_INT_TAB[__SIM_TRANSISTOR_AS_INSTANCE].VALUE=oldSPI_TRANSISTOR_AS_INSTANCE;
50 return r;
51 }
52
53
54 /*---------------------------------------------------------------------------*/
55
56 void print_white_space (FILE *file, int whitespace)
57 {
58 int i;
59 for (i = 0 ; i < whitespace ; i++)
60 fprintf (file," ");
61 }
62
63 /*---------------------------------------------------------------------------*/
64
65 void sim_drive_plot_file (sim_model *model, chain_list *sig2plot, chain_list *name2plot)
66 {
67 chain_list *chain;
68 SIM_FLOAT **tab;
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];
74 char *nodename;
75 int i,j,nbnode = 0,nbval, rcdone;
76 FILE *file;
77 locon_list *locon;
78 losig_list *losig;
79 spisig_list *spisignal;
80
81
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",
85 datfilename);
86 return;
87 }
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);
92
93 // Recupere tous les tableaux de valeurs des nodes
94 fprintf (file,"#time");
95 for (chain = name2plot ; chain ; chain = chain->NEXT)
96 nbnode++;
97 tab = (double**)mbkalloc(nbnode*sizeof (double*));
98 i = 0;
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));
103 rcdone = 0;
104 for (chain = name2plot ; chain ; chain = chain->NEXT) {
105 if (!spisignal && rcdone) {
106 fprintf (stderr,"sim_drive_plot_file : signal and name incoherency !!!\n");
107 fclose (file);
108 return;
109 }
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)) ;
114 measure = NULL;
115 sim_find_by_name(nodename, sim_model_get_lofig(model), &locon, &losig, NULL);
116 if (locon) {
117 measure = sim_measure_get(model, nodename, SIM_MEASURE_LOCON, SIM_MEASURE_VOLTAGE);
118 }
119 if(!measure && losig) {
120 measure = sim_measure_get(model, nodename, SIM_MEASURE_SIGNAL, SIM_MEASURE_VOLTAGE);
121 }
122 if (!measure) {
123 fprintf (stderr,"sim_drive_plot_file : no measure found on node %s !!!\n",nodename);
124 fclose (file);
125 return;
126 }
127 else {
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);
131 fclose (file);
132 return;
133 }
134 else tab[i] = sim_measure_detail_get_data(measuredetail);
135 }
136 if (spisignal) {
137 if (rcdone || !spisignal->HASRCLINE || efg_GetSpiSigLoconRc(spisignal,'O') == NULL) {
138 rcdone = 0;
139 sig2plot = sig2plot->NEXT;
140 if (sig2plot) {
141 spisignal = (spisig_list *)sig2plot->DATA;
142 nodename = efg_GetSpiSigLoconRc(spisignal,'I');
143 if (!nodename) nodename = sim_devect(efg_GetSpiSigName(spisignal));
144 }
145 else spisignal = NULL;
146 }
147 else {
148 nodename = efg_GetSpiSigLoconRc(spisignal,'O');
149 rcdone = 1;
150 }
151 }
152 else rcdone = 1;
153 i++;
154 }
155
156 if (sig2plot) {
157 fprintf (stderr,"sim_drive_plot_file : signal and name incoherency !!!\n");
158 fclose (file);
159 return;
160 }
161 // Drive the file.dat
162 fprintf (file,"\n");
163 printstep = 0.0;
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");
168 printstep += step ;
169 }
170 fprintf (file,"\n");
171
172 mbkfree (tab);
173 if (fclose(file) != 0) {
174 fprintf (stderr, "sim_drive_plot_file can't close file %s\n", datfilename);
175 return;
176 }
177
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);
182 return;
183 }
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);
188 j = 2 ;
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);
191 j++;
192 }
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");
195
196 if (fclose(file) != 0) {
197 fprintf (stderr, "sim_drive_plot_file can't close file %s\n", pltfilename);
198 return;
199 }
200 }