1 | /**CFile*********************************************************************** |
---|
2 | |
---|
3 | FileName [truesimCmd.c] |
---|
4 | |
---|
5 | PackageName [truesim] |
---|
6 | |
---|
7 | Synopsis [Command interface for the truesim package.] |
---|
8 | |
---|
9 | Description [Command interface for the truesim package. This package |
---|
10 | implements delay-based simulation of a combinational circuit in addition |
---|
11 | to zero-delay simulation. The 'sim' package does zero-delay simulation, |
---|
12 | but handles both combinational and sequential circuits. This package |
---|
13 | can take as input circuits described in BLIF format only. |
---|
14 | |
---|
15 | In delay-based simulation each node of the network has a certain |
---|
16 | amount of propagation delay through it. The delay and load for each node |
---|
17 | of the circuit can be specified by the user. In the absence of delay |
---|
18 | values, the fanout count of the node is assumed to be the delay. In |
---|
19 | this implementation the delay values do not have units. For example, |
---|
20 | a node with 2 fanouts has a delay of 2, an node with fanout 4 has |
---|
21 | delay of 4, etc. Primary outputs are assumed to have a delay of 1, |
---|
22 | unlesss specfied otherwise. Load values are used by other |
---|
23 | applications to compute power dissipation (by using the node switching |
---|
24 | information via simulation.) |
---|
25 | |
---|
26 | Boolean vectors can be specified for the primary inputs of the circuit. |
---|
27 | Alternatively, bit vectors can also be generated randomly. The bit |
---|
28 | vectors are applied to the circuit one at a time. The effects of one |
---|
29 | pattern (a bit-vector for the primary inputs) are propagated through |
---|
30 | the circuit and subsequent patterns are applied only after all the |
---|
31 | signals in the circuit have settled.] |
---|
32 | |
---|
33 | Author [Balakrishna Kumthekar <kumtheka@colorado.edu>] |
---|
34 | |
---|
35 | Copyright [This file was created at the University of Colorado at |
---|
36 | Boulder. The University of Colorado at Boulder makes no warranty about |
---|
37 | the suitability of this software for any purpose. It is presented on |
---|
38 | an AS IS basis.] |
---|
39 | |
---|
40 | ******************************************************************************/ |
---|
41 | |
---|
42 | #include "truesimInt.h" |
---|
43 | |
---|
44 | /*---------------------------------------------------------------------------*/ |
---|
45 | /* Constant declarations */ |
---|
46 | /*---------------------------------------------------------------------------*/ |
---|
47 | |
---|
48 | #define DEFAULT_NUM_PATTERNS 1000 |
---|
49 | /*---------------------------------------------------------------------------*/ |
---|
50 | /* Type declarations */ |
---|
51 | /*---------------------------------------------------------------------------*/ |
---|
52 | |
---|
53 | |
---|
54 | /*---------------------------------------------------------------------------*/ |
---|
55 | /* Structure declarations */ |
---|
56 | /*---------------------------------------------------------------------------*/ |
---|
57 | |
---|
58 | |
---|
59 | /*---------------------------------------------------------------------------*/ |
---|
60 | /* Variable declarations */ |
---|
61 | /*---------------------------------------------------------------------------*/ |
---|
62 | |
---|
63 | static jmp_buf timeOutEnv; |
---|
64 | |
---|
65 | /* Global variable used within truesim package */ |
---|
66 | int createdPart; |
---|
67 | int truesimRptHeader; |
---|
68 | int truesimVerbose; |
---|
69 | |
---|
70 | /**AutomaticStart*************************************************************/ |
---|
71 | |
---|
72 | /*---------------------------------------------------------------------------*/ |
---|
73 | /* Static function prototypes */ |
---|
74 | /*---------------------------------------------------------------------------*/ |
---|
75 | |
---|
76 | static int CommandTruesim(Hrc_Manager_t **hmgr, int argc, char **argv); |
---|
77 | static void TimeOutHandle(void); |
---|
78 | static int TestIsNetworkMultipleValued(Ntk_Network_t *network); |
---|
79 | |
---|
80 | /**AutomaticEnd***************************************************************/ |
---|
81 | |
---|
82 | |
---|
83 | /*---------------------------------------------------------------------------*/ |
---|
84 | /* Definition of exported functions */ |
---|
85 | /*---------------------------------------------------------------------------*/ |
---|
86 | |
---|
87 | /**Function******************************************************************** |
---|
88 | |
---|
89 | Synopsis [This function initializes the truesim package.] |
---|
90 | |
---|
91 | SideEffects [None] |
---|
92 | |
---|
93 | SeeAlso [Truesim_End] |
---|
94 | |
---|
95 | ******************************************************************************/ |
---|
96 | void |
---|
97 | Truesim_Init(void) |
---|
98 | { |
---|
99 | Cmd_CommandAdd("truesim", CommandTruesim, 0); |
---|
100 | } |
---|
101 | |
---|
102 | /**Function******************************************************************** |
---|
103 | |
---|
104 | Synopsis [This function ends the truesim package.] |
---|
105 | |
---|
106 | SideEffects [None] |
---|
107 | |
---|
108 | SeeAlso [Truesim_Init] |
---|
109 | |
---|
110 | ******************************************************************************/ |
---|
111 | void |
---|
112 | Truesim_End(void) |
---|
113 | { |
---|
114 | |
---|
115 | } /* End of Truesim_End */ |
---|
116 | |
---|
117 | |
---|
118 | /*---------------------------------------------------------------------------*/ |
---|
119 | /* Definition of internal functions */ |
---|
120 | /*---------------------------------------------------------------------------*/ |
---|
121 | |
---|
122 | |
---|
123 | /*---------------------------------------------------------------------------*/ |
---|
124 | /* Definition of static functions */ |
---|
125 | /*---------------------------------------------------------------------------*/ |
---|
126 | |
---|
127 | /**Function******************************************************************** |
---|
128 | |
---|
129 | Synopsis [Implements the truesim command.] |
---|
130 | |
---|
131 | CommandName [truesim] |
---|
132 | |
---|
133 | CommandSynopsis [Simulate the flattened network] |
---|
134 | |
---|
135 | CommandArguments [\[ -D <filename> \] \[ -d \] |
---|
136 | \[ -f <filename> \] \[ -g <filename> \] \[ -h \] |
---|
137 | \[ -n <N> \] \[ -p <filename> \] \[ -r <N> \] |
---|
138 | \[ -t <time> \] \[ -v <N> \]] |
---|
139 | |
---|
140 | CommandDescription [Simulates a network with a set of input |
---|
141 | vectors. Before calling this command, the user should create a partition |
---|
142 | (using the command <tt>build_partition_mdds</tt>). The simulation |
---|
143 | vectors can be provided by the user (using -f vectors_file), or |
---|
144 | generated randomly. <p> |
---|
145 | |
---|
146 | Command options:<p> |
---|
147 | |
---|
148 | <dl> |
---|
149 | <dt>-D <filename> |
---|
150 | <dd> File to dump randomly generated vectors. Primary input |
---|
151 | probability file SHOULD be specified with -p option. |
---|
152 | |
---|
153 | |
---|
154 | <dt>-d |
---|
155 | <dd>Perform event-driven true delay simulation. The fanout count of |
---|
156 | the nodes is used as an estimate for the node delay. Primary inputs |
---|
157 | are assumed to have arrival times of zero. |
---|
158 | |
---|
159 | |
---|
160 | <dt>-f <filename> |
---|
161 | <dd> File containing simulation vectors. The format is simple but |
---|
162 | strict and hence, few checks are made. The file format is as below: |
---|
163 | |
---|
164 | <p>.i <code>c n d o e p f q g r h s i t j u k a l b m</code><br> |
---|
165 | .s <br> |
---|
166 | 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 ; <br> |
---|
167 | 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 0 0 0 1 ; <br> |
---|
168 | 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 ; <br> |
---|
169 | 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 ; <br> |
---|
170 | |
---|
171 | <p> The .i statement specifies the primary inputs of the network. The |
---|
172 | patterns start after .s key word. Each vector is a space separated list |
---|
173 | of bits and ends in a semi-colon. The length of any vector should be |
---|
174 | equal to the number of signals specified in the .i statement. A line |
---|
175 | starting with # is a comment. <p> |
---|
176 | |
---|
177 | |
---|
178 | <dt>-g <filename> |
---|
179 | <dd> File to output random probabilities for primary inputs. Use this |
---|
180 | option ONLY to produce a vector of signal probabilities for primary |
---|
181 | inputs. This option does not proceed with simulation. |
---|
182 | |
---|
183 | |
---|
184 | <dt>-h |
---|
185 | <dd>Print a help message that details all options. |
---|
186 | |
---|
187 | |
---|
188 | <dt> -n <N> |
---|
189 | <dd> Number of patterns to simulate. The default is 1000. Use this |
---|
190 | option ONLY with -p option. |
---|
191 | |
---|
192 | |
---|
193 | <dt>-p <filename> |
---|
194 | <dd> File containing primary input probabilities. The format is as |
---|
195 | shown below: |
---|
196 | |
---|
197 | <p> |
---|
198 | PI_Name1 0.67 <br> |
---|
199 | PI_Name2 0.45 <br> |
---|
200 | |
---|
201 | |
---|
202 | <dt>-r <N> |
---|
203 | <dd> Print PI/PO names after every N patterns simulated, for better |
---|
204 | readability of simulation output. This option is effective only when |
---|
205 | the verbosity flag is on. |
---|
206 | |
---|
207 | <dt>-T <filename> |
---|
208 | <dd> File containing node delay and load values. The file format is |
---|
209 | as shown below: |
---|
210 | |
---|
211 | <p> |
---|
212 | node1 delay1 load1 <br> |
---|
213 | node2 delay2 load2 <br> |
---|
214 | |
---|
215 | <p> The delay vaues are assumed as specified in a common unit. The same |
---|
216 | is true for load values too. |
---|
217 | |
---|
218 | |
---|
219 | <dt>-t <time> |
---|
220 | <dd> Time in seconds allowed to finish the simulation. The default |
---|
221 | is no limit. |
---|
222 | |
---|
223 | |
---|
224 | <dt>-v <N> |
---|
225 | <dd> Specify verbosity level, N. |
---|
226 | </dl> <p>] |
---|
227 | |
---|
228 | SideEffects [] |
---|
229 | |
---|
230 | ******************************************************************************/ |
---|
231 | static int |
---|
232 | CommandTruesim( |
---|
233 | Hrc_Manager_t **hmgr, |
---|
234 | int argc, |
---|
235 | char **argv) |
---|
236 | { |
---|
237 | Ntk_Network_t *network = NIL(Ntk_Network_t); |
---|
238 | graph_t *partition; |
---|
239 | boolean trueDelay; |
---|
240 | int genVectors,N,status; |
---|
241 | int c; /* For scanning command line arguments */ |
---|
242 | long timeOutPeriod,initialTime,finalTime; |
---|
243 | char *probFile,*simFile,*probGenFile,*dumpFile; |
---|
244 | char *delayFile; |
---|
245 | FILE *fp = NIL(FILE);; |
---|
246 | |
---|
247 | /* These are the default values. */ |
---|
248 | createdPart = 0; /* =1 when partiton is created by the command */ |
---|
249 | trueDelay = FALSE; /* Use zero-delay simulation by default */ |
---|
250 | timeOutPeriod = 0; /* Unlimited time */ |
---|
251 | genVectors = -1; /* Do not generate bit-vectors for simulation */ |
---|
252 | N = -1; /* Number of patterns to simulate */ |
---|
253 | probFile = NIL(char); /* File with probability values for PI */ |
---|
254 | simFile = NIL(char); /* Simulation bit-vector file */ |
---|
255 | probGenFile = NIL(char); /* File with prob. values for PI; used during |
---|
256 | * bit-vector generation */ |
---|
257 | dumpFile = NIL(char); /* File to dump generated bit-vectors */ |
---|
258 | delayFile = NIL(char); /* File with delay vaules for nodes of the |
---|
259 | * circuit */ |
---|
260 | truesimVerbose = 0; /* Verbosity level */ |
---|
261 | truesimRptHeader = -1; /* Print PI/PO names while printing simulation |
---|
262 | * results */ |
---|
263 | |
---|
264 | if (bdd_get_package_name() != CUDD) { |
---|
265 | (void) fprintf(vis_stderr, |
---|
266 | "** truesim error: The truesim package can be used only with CUDD package\n"); |
---|
267 | (void) fprintf(vis_stderr, |
---|
268 | "** truesim error: Please link with CUDD package\n"); |
---|
269 | return 0; |
---|
270 | } |
---|
271 | |
---|
272 | util_getopt_reset(); |
---|
273 | |
---|
274 | while((c = util_getopt(argc, argv, "D:df:g:hn:p:r:T:t:v:")) != EOF) { |
---|
275 | switch(c) { |
---|
276 | case 'D': |
---|
277 | if (!util_optarg) { |
---|
278 | (void) fprintf(vis_stderr, |
---|
279 | "** truesim error: File to output pattern vectors not specified.\n"); |
---|
280 | goto usage; |
---|
281 | } |
---|
282 | dumpFile = util_strsav(util_optarg); |
---|
283 | break; |
---|
284 | case 'd': |
---|
285 | trueDelay = TRUE; |
---|
286 | break; |
---|
287 | case 'f': |
---|
288 | if (!util_optarg) { |
---|
289 | (void) fprintf(vis_stderr, |
---|
290 | "** truesim error: Simulation file not specified.\n"); |
---|
291 | goto usage; |
---|
292 | } else { |
---|
293 | simFile = util_strsav(util_optarg); |
---|
294 | if ((fp = Cmd_FileOpen(simFile,"r",NIL(char *),1)) == NIL(FILE)) { |
---|
295 | (void) fprintf(vis_stderr, |
---|
296 | "** truesim error: Could not open %s for reading.\n", |
---|
297 | simFile); |
---|
298 | goto endgame; |
---|
299 | } else { |
---|
300 | fclose(fp); |
---|
301 | } |
---|
302 | /* Stop generation of vectors, in case -p is also used with -f */ |
---|
303 | N = -1; |
---|
304 | genVectors = 0; |
---|
305 | if (probFile) { |
---|
306 | FREE(probFile); |
---|
307 | probFile = NIL(char); |
---|
308 | } |
---|
309 | } |
---|
310 | break; |
---|
311 | case 'g': |
---|
312 | if (!util_optarg) { |
---|
313 | (void) fprintf(vis_stderr, |
---|
314 | "** truesim error: File to output input probs. not specified.\n"); |
---|
315 | goto usage; |
---|
316 | } |
---|
317 | probGenFile = util_strsav(util_optarg); |
---|
318 | break; |
---|
319 | case 'h': |
---|
320 | goto usage; |
---|
321 | case 'n': |
---|
322 | if (genVectors != 0) { |
---|
323 | N = atoi(util_optarg); |
---|
324 | genVectors = 1; |
---|
325 | } else { |
---|
326 | (void) fprintf(vis_stderr, |
---|
327 | "** truesim warning: Simulation file already specified.\n"); |
---|
328 | (void) fprintf(vis_stderr, |
---|
329 | "** truesim warning: Ignoring -n option.\n"); |
---|
330 | } |
---|
331 | break; |
---|
332 | case 'p': |
---|
333 | if (genVectors != 0) { |
---|
334 | if (!util_optarg) { |
---|
335 | (void) fprintf(vis_stderr, |
---|
336 | "** truesim error: Probability file not specified.\n"); |
---|
337 | goto usage; |
---|
338 | } else { |
---|
339 | probFile = util_strsav(util_optarg); |
---|
340 | if ((fp = Cmd_FileOpen(probFile,"r",NIL(char *),1)) == NIL(FILE)) { |
---|
341 | (void) fprintf(vis_stderr, |
---|
342 | "** truesim error: Could not open %s for reading.\n", |
---|
343 | probFile); |
---|
344 | goto endgame; |
---|
345 | } else { |
---|
346 | fclose(fp); |
---|
347 | } |
---|
348 | } |
---|
349 | genVectors = 1; |
---|
350 | } else { |
---|
351 | (void) fprintf(vis_stderr, |
---|
352 | "** truesim warning: Simulation file already specified.\n"); |
---|
353 | (void) fprintf(vis_stderr, |
---|
354 | "** truesim warning: Ignoring -p option.\n"); |
---|
355 | } |
---|
356 | break; |
---|
357 | case 'r': |
---|
358 | truesimRptHeader = atoi(util_optarg); |
---|
359 | break; |
---|
360 | case 'T': |
---|
361 | if (!util_optarg) { |
---|
362 | (void) fprintf(vis_stderr, |
---|
363 | "** truesim error: Delay file not specified.\n"); |
---|
364 | goto usage; |
---|
365 | } else { |
---|
366 | delayFile = util_strsav(util_optarg); |
---|
367 | if ((fp = Cmd_FileOpen(delayFile,"r",NIL(char *),1)) == NIL(FILE)) { |
---|
368 | (void) fprintf(vis_stderr, |
---|
369 | "** truesim error: Could not open %s for reading.\n", |
---|
370 | delayFile); |
---|
371 | goto endgame; |
---|
372 | } else { |
---|
373 | fclose(fp); |
---|
374 | } |
---|
375 | } |
---|
376 | break; |
---|
377 | case 't': |
---|
378 | timeOutPeriod = atoi(util_optarg); |
---|
379 | break; |
---|
380 | case 'v': |
---|
381 | truesimVerbose = atoi(util_optarg); |
---|
382 | break; |
---|
383 | default: |
---|
384 | goto usage; |
---|
385 | } |
---|
386 | } |
---|
387 | |
---|
388 | if(Hrc_ManagerReadCurrentNode(*hmgr) == NIL(Hrc_Node_t)) { |
---|
389 | (void) fprintf(vis_stderr,"** truesim error: The hierarchy manager is empty."); |
---|
390 | (void) fprintf(vis_stderr," Read in design.\n"); |
---|
391 | goto endgame; |
---|
392 | } |
---|
393 | |
---|
394 | network = (Ntk_Network_t *) |
---|
395 | Hrc_NodeReadApplInfo(Hrc_ManagerReadCurrentNode(*hmgr), |
---|
396 | NTK_HRC_NODE_APPL_KEY); |
---|
397 | |
---|
398 | if(network == NIL(Ntk_Network_t)) { |
---|
399 | (void) fprintf(vis_stderr,"** truesim error: There is no network. "); |
---|
400 | (void) fprintf(vis_stderr,"Use flatten_hierarchy.\n"); |
---|
401 | goto endgame; |
---|
402 | } |
---|
403 | |
---|
404 | /* Check if the current network has signals with multiple values. */ |
---|
405 | if (TestIsNetworkMultipleValued(network)) { |
---|
406 | (void) fprintf(vis_stderr,"** truesim error: Circuit has multiple valued variables.\n"); |
---|
407 | (void) fprintf(vis_stderr,"** truesim error: This algorithm applies to boolean signals only.\n"); |
---|
408 | goto endgame; |
---|
409 | } |
---|
410 | |
---|
411 | if(Ntk_NetworkReadNumPrimaryInputs(network) != |
---|
412 | Ntk_NetworkReadNumInputs(network)) { |
---|
413 | (void) fprintf(vis_stderr,"** truesim error: This algorithm applies only for circuits descrbied in BLIF format.\n"); |
---|
414 | goto endgame; |
---|
415 | } |
---|
416 | |
---|
417 | /* Generate a file with random values for primary inputs and return. No |
---|
418 | simulation is performed. */ |
---|
419 | if (probGenFile) { |
---|
420 | Truesim_GeneratePrimaryInputProbs(network,probGenFile); |
---|
421 | FREE(probGenFile); |
---|
422 | if (probFile) |
---|
423 | FREE(probFile); |
---|
424 | if (simFile) |
---|
425 | FREE(simFile); |
---|
426 | if (dumpFile) |
---|
427 | FREE(dumpFile); |
---|
428 | if (delayFile) |
---|
429 | FREE(delayFile); |
---|
430 | return 0; |
---|
431 | } |
---|
432 | |
---|
433 | /* Make sure that we either generate random vectors or we are |
---|
434 | supplied with simulation vectors */ |
---|
435 | if (genVectors == -1) { |
---|
436 | (void) fprintf(vis_stderr, |
---|
437 | "** truesim error: Neither simulation vector file nor "); |
---|
438 | (void) fprintf(vis_stderr, |
---|
439 | "PI probabilities provided.\n"); |
---|
440 | (void) fprintf(vis_stderr, |
---|
441 | "** truesim error: No simulation will be performed.\n"); |
---|
442 | goto endgame; |
---|
443 | } |
---|
444 | |
---|
445 | if (dumpFile && !genVectors) { |
---|
446 | if (!simFile) { |
---|
447 | (void) fprintf(vis_stderr, |
---|
448 | "** truesim error: PI probability file not specified.\n"); |
---|
449 | (void) fprintf(vis_stderr, |
---|
450 | "** truesim error: Use -p option.\n"); |
---|
451 | (void) fprintf(vis_stderr, |
---|
452 | "** truesim error: No simulation will be performed.\n"); |
---|
453 | goto endgame; |
---|
454 | } else { |
---|
455 | (void) fprintf(vis_stderr, |
---|
456 | "** truesim warning: Simulation file %s specified.\n", |
---|
457 | simFile); |
---|
458 | (void) fprintf(vis_stderr, |
---|
459 | "** truesim warning: Ignoring dump file %s\n",dumpFile); |
---|
460 | } |
---|
461 | } |
---|
462 | |
---|
463 | /* Make sure N is specified or a default value is used */ |
---|
464 | if (N == -1 && genVectors == 1) { |
---|
465 | (void) fprintf(vis_stderr, |
---|
466 | "** truesim warning: Number of patterns to be simulated is not specified.\n"); |
---|
467 | (void) fprintf(vis_stderr, |
---|
468 | "Assuming N = 1000 patterns to be simulated.\n"); |
---|
469 | N = DEFAULT_NUM_PATTERNS; |
---|
470 | } |
---|
471 | |
---|
472 | /* Access a 'total' partition */ |
---|
473 | partition = (graph_t *) Ntk_NetworkReadApplInfo(network, |
---|
474 | PART_NETWORK_APPL_KEY); |
---|
475 | createdPart = 0; /* Using partition of the network. */ |
---|
476 | if (partition == NIL(graph_t) || |
---|
477 | (Part_PartitionReadMethod(partition) != Part_Total_c)) { |
---|
478 | partition = Part_NetworkCreatePartition(network, |
---|
479 | NIL(Hrc_Node_t), |
---|
480 | "dummy", (lsList) 0, |
---|
481 | (lsList) 0, NIL(mdd_t), |
---|
482 | Part_Total_c, |
---|
483 | (lsList) 0, |
---|
484 | FALSE, FALSE, TRUE); |
---|
485 | if (partition == NIL(graph_t)) { |
---|
486 | (void) fprintf(vis_stderr,"** truesim error: Could not create a partition.\n"); |
---|
487 | goto endgame; |
---|
488 | } |
---|
489 | Ntk_NetworkAddApplInfo(network,PART_NETWORK_APPL_KEY, |
---|
490 | (Ntk_ApplInfoFreeFn)Part_PartitionFreeCallback, |
---|
491 | (void *)partition); |
---|
492 | createdPart = 1; /* Using new partition */ |
---|
493 | } |
---|
494 | |
---|
495 | /* Start the timer.*/ |
---|
496 | if (timeOutPeriod > 0){ |
---|
497 | (void) signal(SIGALRM, (void(*)(int))TimeOutHandle); |
---|
498 | (void) alarm(timeOutPeriod); |
---|
499 | if (setjmp(timeOutEnv) > 0) { |
---|
500 | (void) fprintf(vis_stderr, "** truesim warning: Timeout occurred after "); |
---|
501 | (void) fprintf(vis_stderr, "%ld seconds.\n", timeOutPeriod); |
---|
502 | alarm(0); |
---|
503 | goto endgame; |
---|
504 | } |
---|
505 | } |
---|
506 | |
---|
507 | initialTime = util_cpu_time(); |
---|
508 | status = TruesimSimulateNetwork(network,simFile,probFile,delayFile, |
---|
509 | dumpFile,trueDelay,genVectors,N); |
---|
510 | finalTime = util_cpu_time(); |
---|
511 | if(status) { |
---|
512 | (void) fprintf(vis_stdout, "%-20s%10ld\n", "** truesim info: analysis time =", |
---|
513 | (finalTime-initialTime)/1000); |
---|
514 | } |
---|
515 | else { |
---|
516 | (void) fprintf(vis_stdout, "** truesim error: Simulation was not successful.\n"); |
---|
517 | } |
---|
518 | |
---|
519 | alarm(0); |
---|
520 | /* Clean up */ |
---|
521 | if (probGenFile) |
---|
522 | FREE(probGenFile); |
---|
523 | if (probFile) |
---|
524 | FREE(probFile); |
---|
525 | if (simFile) |
---|
526 | FREE(simFile); |
---|
527 | if (dumpFile) |
---|
528 | FREE(dumpFile); |
---|
529 | if (delayFile) |
---|
530 | FREE(delayFile); |
---|
531 | return 0; /* normal exit */ |
---|
532 | |
---|
533 | endgame: |
---|
534 | /* Clean up */ |
---|
535 | if (probGenFile) |
---|
536 | FREE(probGenFile); |
---|
537 | if (probFile) |
---|
538 | FREE(probFile); |
---|
539 | if (simFile) |
---|
540 | FREE(simFile); |
---|
541 | if (dumpFile) |
---|
542 | FREE(dumpFile); |
---|
543 | if (delayFile) |
---|
544 | FREE(delayFile); |
---|
545 | |
---|
546 | if (createdPart) |
---|
547 | Ntk_NetworkFreeApplInfo(network,PART_NETWORK_APPL_KEY); |
---|
548 | |
---|
549 | return 1; /* Error exit */ |
---|
550 | |
---|
551 | usage: |
---|
552 | |
---|
553 | (void) fprintf(vis_stderr, "\nusage: Also see 'help truesim' for more details.\n\n"); |
---|
554 | (void) fprintf(vis_stderr, " -D <filename>\tFile to dump randomly generated pattern vectors.\n"); |
---|
555 | (void) fprintf(vis_stderr, " \t\tPrimary input probability file SHOULD be specified with \n"); |
---|
556 | (void) fprintf(vis_stderr, " \t\t-p option.\n\n"); |
---|
557 | (void) fprintf(vis_stderr, " -d \t\tPerform true delay simulation.\n\n"); |
---|
558 | (void) fprintf(vis_stderr, " -f <filename>\tFile containing simulation vectors.\n\n"); |
---|
559 | (void) fprintf(vis_stderr, " -g <filename>\tFile to output random probabilities for PI \n"); |
---|
560 | (void) fprintf(vis_stderr, " \t\tUse this option ONLY to produce a vector of \n"); |
---|
561 | (void) fprintf(vis_stderr, " \t\tprobability values for PI. No simulation is performed. \n\n"); |
---|
562 | (void) fprintf(vis_stderr, " -h \t\tCommand usage.\n\n"); |
---|
563 | (void) fprintf(vis_stderr, " -n <N> \t\tNumber of patterns to simulate. Default is 1000.\n"); |
---|
564 | (void) fprintf(vis_stderr, " \t\tShould ONLY be used with -p option.\n\n"); |
---|
565 | (void) fprintf(vis_stderr, " -p <filename>\tFile containing PI probabilities.\n"); |
---|
566 | (void) fprintf(vis_stderr, " \t\tSee help for file format.\n\n"); |
---|
567 | (void) fprintf(vis_stderr, " -r <N> \t\tPrint the node name header ever N iterations.\n"); |
---|
568 | (void) fprintf(vis_stderr, " \t\tThis is effective only when verbosity flag is on.\n\n"); |
---|
569 | (void) fprintf(vis_stderr, " -T <filename>\tFile containing node delay and load values.\n"); |
---|
570 | (void) fprintf(vis_stderr, " \t\tSee help for file format.\n\n"); |
---|
571 | (void) fprintf(vis_stderr, " -t <time> \t\tTime in seconds allowed to finish the simulation.\n\n"); |
---|
572 | (void) fprintf(vis_stderr, " -v <N> \t\tVerbosity level.\n"); |
---|
573 | |
---|
574 | return 1; /* error exit */ |
---|
575 | } |
---|
576 | |
---|
577 | /**Function******************************************************************** |
---|
578 | |
---|
579 | Synopsis [Handle function for timeout.] |
---|
580 | |
---|
581 | Description [This function is called when the time out occurs.] |
---|
582 | |
---|
583 | SideEffects [] |
---|
584 | |
---|
585 | ******************************************************************************/ |
---|
586 | static void |
---|
587 | TimeOutHandle(void) |
---|
588 | { |
---|
589 | longjmp(timeOutEnv, 1); |
---|
590 | } |
---|
591 | |
---|
592 | |
---|
593 | /**Function******************************************************************** |
---|
594 | |
---|
595 | Synopsis [Checks whether the network has multiple valued signals.] |
---|
596 | |
---|
597 | Description [Checks whether the network has multiple valued |
---|
598 | signals. Returns 1 if true, else 0.] |
---|
599 | |
---|
600 | SideEffects [None] |
---|
601 | |
---|
602 | SeeAlso [] |
---|
603 | |
---|
604 | ******************************************************************************/ |
---|
605 | static int |
---|
606 | TestIsNetworkMultipleValued(Ntk_Network_t *network) |
---|
607 | { |
---|
608 | Ntk_Node_t *node; |
---|
609 | lsGen gen; |
---|
610 | Var_Variable_t *var; |
---|
611 | int numValues; |
---|
612 | |
---|
613 | Ntk_NetworkForEachNode(network,gen,node) { |
---|
614 | var = Ntk_NodeReadVariable(node); |
---|
615 | numValues = Var_VariableReadNumValues(var); |
---|
616 | if (numValues > 2) |
---|
617 | return 1; |
---|
618 | } |
---|
619 | return 0; |
---|
620 | } |
---|