| [14] | 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 | } | 
|---|