source: vis_dev/vis-2.3/src/truesim/truesimCmd.c @ 35

Last change on this file since 35 was 14, checked in by cecile, 13 years ago

vis2.3

File size: 20.2 KB
Line 
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
63static jmp_buf timeOutEnv;
64
65/* Global variable used within truesim package */
66int createdPart;
67int truesimRptHeader;
68int truesimVerbose;
69
70/**AutomaticStart*************************************************************/
71
72/*---------------------------------------------------------------------------*/
73/* Static function prototypes                                                */
74/*---------------------------------------------------------------------------*/
75
76static int CommandTruesim(Hrc_Manager_t **hmgr, int argc, char **argv);
77static void TimeOutHandle(void);
78static 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******************************************************************************/
96void
97Truesim_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******************************************************************************/
111void
112Truesim_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 &lt;filename&gt; \] \[ -d \]
136  \[ -f &lt;filename&gt; \] \[ -g &lt;filename&gt; \] \[ -h \] 
137  \[ -n &lt;N&gt; \] \[ -p &lt;filename&gt; \] \[ -r &lt;N&gt; \]
138  \[ -t &lt;time&gt; \] \[ -v &lt;N&gt; \]]
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 &lt;filename&gt;
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 &lt;filename&gt;
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 &lt;filename&gt;
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 &lt;N&gt;
189  <dd> Number of patterns to simulate. The default is 1000. Use this
190  option ONLY with -p option.
191
192
193  <dt>-p &lt;filename&gt;
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 &lt;N&gt;
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 &lt;filename&gt;
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 &lt;time&gt;
220  <dd> Time in seconds allowed to finish the simulation.  The default
221  is no limit.
222
223
224  <dt>-v &lt;N&gt;
225  <dd>  Specify verbosity level, N.
226  </dl> <p>]
227
228  SideEffects []
229
230******************************************************************************/
231static int
232CommandTruesim(
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
533endgame:
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
551usage:
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******************************************************************************/
586static void
587TimeOutHandle(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******************************************************************************/
605static int
606TestIsNetworkMultipleValued(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}
Note: See TracBrowser for help on using the repository browser.