| 1 | /**CFile***********************************************************************
|
|---|
| 2 |
|
|---|
| 3 | FileName [cmdMisc.c]
|
|---|
| 4 |
|
|---|
| 5 | PackageName [cmd]
|
|---|
| 6 |
|
|---|
| 7 | Synopsis [Variable table; miscellaneous commands related to the general
|
|---|
| 8 | system.]
|
|---|
| 9 |
|
|---|
| 10 | Author [SIS]
|
|---|
| 11 |
|
|---|
| 12 | Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California.
|
|---|
| 13 | All rights reserved.
|
|---|
| 14 |
|
|---|
| 15 | Permission is hereby granted, without written agreement and without license
|
|---|
| 16 | or royalty fees, to use, copy, modify, and distribute this software and its
|
|---|
| 17 | documentation for any purpose, provided that the above copyright notice and
|
|---|
| 18 | the following two paragraphs appear in all copies of this software.
|
|---|
| 19 |
|
|---|
| 20 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
|---|
| 21 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
|---|
| 22 | OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
|---|
| 23 | CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|---|
| 24 |
|
|---|
| 25 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
|---|
| 26 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|---|
| 27 | FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
|
|---|
| 28 | "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE
|
|---|
| 29 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]
|
|---|
| 30 |
|
|---|
| 31 | ******************************************************************************/
|
|---|
| 32 |
|
|---|
| 33 | #include "cmdInt.h"
|
|---|
| 34 | #include <errno.h>
|
|---|
| 35 |
|
|---|
| 36 | static char rcsid[] UNUSED = "$Id: cmdMisc.c,v 1.59 2009/04/11 18:25:50 fabio Exp $";
|
|---|
| 37 |
|
|---|
| 38 | /*---------------------------------------------------------------------------*/
|
|---|
| 39 | /* Constant declarations */
|
|---|
| 40 | /*---------------------------------------------------------------------------*/
|
|---|
| 41 | /* The maximum length of an input line */
|
|---|
| 42 | #define MAX_STR 32768
|
|---|
| 43 |
|
|---|
| 44 |
|
|---|
| 45 | /*---------------------------------------------------------------------------*/
|
|---|
| 46 | /* Variable declarations */
|
|---|
| 47 | /*---------------------------------------------------------------------------*/
|
|---|
| 48 | avl_tree *cmdAliasTable;
|
|---|
| 49 | avl_tree *cmdFlagTable;
|
|---|
| 50 |
|
|---|
| 51 | static boolean fileCreated;
|
|---|
| 52 |
|
|---|
| 53 |
|
|---|
| 54 | /**AutomaticStart*************************************************************/
|
|---|
| 55 |
|
|---|
| 56 | /*---------------------------------------------------------------------------*/
|
|---|
| 57 | /* Static function prototypes */
|
|---|
| 58 | /*---------------------------------------------------------------------------*/
|
|---|
| 59 |
|
|---|
| 60 | static int CommandTime(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 61 | static int CommandEcho(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 62 | static int CommandSetBddParameters(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 63 | static int CommandMemoryProfile(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 64 | static int CommandQuit(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 65 | static int CommandUsage(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 66 | static int CommandWhich(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 67 | static int CommandHistory(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 68 | static int CommandAlias(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 69 | static int CommandUnalias(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 70 | static int CommandSetVariable(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 71 | static int CommandUnsetVariable(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 72 | static int CommandHelp(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 73 | static int CommandSource(Hrc_Manager_t ** hmgr, int argc, char ** argv);
|
|---|
| 74 | static void print_alias(char * value);
|
|---|
| 75 | static char * command_alias_help(char * command);
|
|---|
| 76 | static void FlushBuffers(int sigtype);
|
|---|
| 77 |
|
|---|
| 78 | /**AutomaticEnd***************************************************************/
|
|---|
| 79 |
|
|---|
| 80 |
|
|---|
| 81 | /*---------------------------------------------------------------------------*/
|
|---|
| 82 | /* Definition of exported functions */
|
|---|
| 83 | /*---------------------------------------------------------------------------*/
|
|---|
| 84 |
|
|---|
| 85 |
|
|---|
| 86 | /**Function********************************************************************
|
|---|
| 87 |
|
|---|
| 88 | Synopsis [Looks up value of flag in table of named values.]
|
|---|
| 89 |
|
|---|
| 90 | Description [The command parser maintains a table of named values. These
|
|---|
| 91 | are manipulated using the 'set' and 'unset' commands. The value of the
|
|---|
| 92 | named flag is returned, or NIL(char) is returned if the flag has not been
|
|---|
| 93 | set.]
|
|---|
| 94 |
|
|---|
| 95 | SideEffects []
|
|---|
| 96 |
|
|---|
| 97 | ******************************************************************************/
|
|---|
| 98 | char *
|
|---|
| 99 | Cmd_FlagReadByName(
|
|---|
| 100 | char * flag)
|
|---|
| 101 | {
|
|---|
| 102 | char *value;
|
|---|
| 103 |
|
|---|
| 104 | if (avl_lookup(cmdFlagTable, flag, &value)) {
|
|---|
| 105 | return value;
|
|---|
| 106 | }
|
|---|
| 107 | else {
|
|---|
| 108 | return NIL(char);
|
|---|
| 109 | }
|
|---|
| 110 | }
|
|---|
| 111 |
|
|---|
| 112 |
|
|---|
| 113 | /**Function********************************************************************
|
|---|
| 114 |
|
|---|
| 115 | Synopsis [Updates a set value by calling instead of set command.]
|
|---|
| 116 |
|
|---|
| 117 | Description [Updates a set value by calling instead of set command.]
|
|---|
| 118 |
|
|---|
| 119 | SideEffects []
|
|---|
| 120 |
|
|---|
| 121 | ******************************************************************************/
|
|---|
| 122 | void
|
|---|
| 123 | Cmd_FlagUpdateValue(
|
|---|
| 124 | char * key, char * value)
|
|---|
| 125 | {
|
|---|
| 126 | char *oldValue, *newValue;
|
|---|
| 127 |
|
|---|
| 128 | if (!key)
|
|---|
| 129 | return;
|
|---|
| 130 | if (value)
|
|---|
| 131 | newValue = util_strsav(value);
|
|---|
| 132 | else
|
|---|
| 133 | newValue = util_strsav("");
|
|---|
| 134 |
|
|---|
| 135 | if (avl_delete(cmdFlagTable, &key, &oldValue))
|
|---|
| 136 | FREE(oldValue);
|
|---|
| 137 |
|
|---|
| 138 | (void) avl_insert(cmdFlagTable, key, newValue);
|
|---|
| 139 | }
|
|---|
| 140 |
|
|---|
| 141 |
|
|---|
| 142 | /**Function********************************************************************
|
|---|
| 143 |
|
|---|
| 144 | Synopsis [Deletes a set value by calling instead of unset command.]
|
|---|
| 145 |
|
|---|
| 146 | Description [Deletes a set value by calling instead of unset command.]
|
|---|
| 147 |
|
|---|
| 148 | SideEffects []
|
|---|
| 149 |
|
|---|
| 150 | ******************************************************************************/
|
|---|
| 151 | void
|
|---|
| 152 | Cmd_FlagDeleteByName(
|
|---|
| 153 | char * key)
|
|---|
| 154 | {
|
|---|
| 155 | char *value;
|
|---|
| 156 |
|
|---|
| 157 | if (!key)
|
|---|
| 158 | return;
|
|---|
| 159 |
|
|---|
| 160 | if (avl_delete(cmdFlagTable, &key, &value)) {
|
|---|
| 161 | FREE(key);
|
|---|
| 162 | FREE(value);
|
|---|
| 163 | }
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 |
|
|---|
| 167 | /**Function********************************************************************
|
|---|
| 168 |
|
|---|
| 169 | Synopsis [Initializes the command package.]
|
|---|
| 170 |
|
|---|
| 171 | SideEffects [Commands are added to the command table.]
|
|---|
| 172 |
|
|---|
| 173 | SeeAlso [Cmd_End]
|
|---|
| 174 |
|
|---|
| 175 | ******************************************************************************/
|
|---|
| 176 | void
|
|---|
| 177 | Cmd_Init(void)
|
|---|
| 178 | {
|
|---|
| 179 | char *path;
|
|---|
| 180 | char *lib_name;
|
|---|
| 181 |
|
|---|
| 182 |
|
|---|
| 183 | cmdCommandTable = avl_init_table((int(*)(const void *, const void *))strcmp);
|
|---|
| 184 | cmdFlagTable = avl_init_table((int(*)(const void *, const void *))strcmp);
|
|---|
| 185 | cmdAliasTable = avl_init_table((int(*)(const void *, const void *))strcmp);
|
|---|
| 186 |
|
|---|
| 187 | Cmd_CommandAdd("alias", CommandAlias, 0);
|
|---|
| 188 | Cmd_CommandAdd("echo", CommandEcho, 0);
|
|---|
| 189 | Cmd_CommandAdd("help", CommandHelp, 0);
|
|---|
| 190 | Cmd_CommandAdd("quit", CommandQuit, 0);
|
|---|
| 191 | Cmd_CommandAdd("source", CommandSource, 0);
|
|---|
| 192 | /* Cmd_CommandAdd("undo", CommandUndo, 0); */
|
|---|
| 193 | Cmd_CommandAdd("set", CommandSetVariable, 0);
|
|---|
| 194 | Cmd_CommandAdd("unalias", CommandUnalias, 0);
|
|---|
| 195 | Cmd_CommandAdd("unset", CommandUnsetVariable, 0);
|
|---|
| 196 | Cmd_CommandAdd("time", CommandTime, 0);
|
|---|
| 197 | Cmd_CommandAdd("usage", CommandUsage, 0);
|
|---|
| 198 | Cmd_CommandAdd("history", CommandHistory, 0);
|
|---|
| 199 | Cmd_CommandAdd("which", CommandWhich, 0);
|
|---|
| 200 | Cmd_CommandAdd("set_bdd_parameters" , CommandSetBddParameters, 0);
|
|---|
| 201 | Cmd_CommandAdd("_memory_profile", CommandMemoryProfile, 0);
|
|---|
| 202 | fileCreated = FALSE;
|
|---|
| 203 |
|
|---|
| 204 | /* Program the signal of type USR1 to flush vis_stdout and vis_stderr */
|
|---|
| 205 | #ifdef SIGUSR1
|
|---|
| 206 | (void) signal(SIGUSR1, FlushBuffers);
|
|---|
| 207 | #endif
|
|---|
| 208 |
|
|---|
| 209 | /* set the default open_path */
|
|---|
| 210 | lib_name = Vm_VisObtainLibrary();
|
|---|
| 211 | path = ALLOC(char, strlen(lib_name) + 20);
|
|---|
| 212 | sprintf(path, "set open_path .:%s", lib_name);
|
|---|
| 213 | Cmd_CommandExecute(NULL, path);
|
|---|
| 214 | FREE(lib_name);
|
|---|
| 215 | FREE(path);
|
|---|
| 216 | }
|
|---|
| 217 |
|
|---|
| 218 |
|
|---|
| 219 | /**Function********************************************************************
|
|---|
| 220 |
|
|---|
| 221 | Synopsis [Ends the command package.]
|
|---|
| 222 |
|
|---|
| 223 | Description [Ends the command package. Tables are freed, and the global
|
|---|
| 224 | error string is freed.]
|
|---|
| 225 |
|
|---|
| 226 | SideEffects []
|
|---|
| 227 |
|
|---|
| 228 | SeeAlso [Cmd_Init]
|
|---|
| 229 |
|
|---|
| 230 | ******************************************************************************/
|
|---|
| 231 | void
|
|---|
| 232 | Cmd_End(void)
|
|---|
| 233 | {
|
|---|
| 234 | avl_free_table(cmdFlagTable, (void (*)(char *))free, (void (*)(char *))free);
|
|---|
| 235 | avl_free_table(cmdCommandTable, (void (*)(char *)) 0, CmdCommandFree);
|
|---|
| 236 | avl_free_table(cmdAliasTable, (void (*)(char *)) 0, CmdAliasFree);
|
|---|
| 237 | if (cmdBackupHmgr != NIL(Hrc_Manager_t)) {
|
|---|
| 238 | Hrc_ManagerFree(cmdBackupHmgr);
|
|---|
| 239 | }
|
|---|
| 240 | error_cleanup();
|
|---|
| 241 |
|
|---|
| 242 | if (fileCreated == TRUE) {
|
|---|
| 243 | (void) fprintf(vis_stdout, "Purify has created a temporary file. The file");
|
|---|
| 244 | (void) fprintf(vis_stdout, " must be deleted.\n");
|
|---|
| 245 | }
|
|---|
| 246 | }
|
|---|
| 247 |
|
|---|
| 248 |
|
|---|
| 249 | /**Function********************************************************************
|
|---|
| 250 |
|
|---|
| 251 | Synopsis [Test that the given string is an integer. Returns 0 if string is
|
|---|
| 252 | not an integer, 1 if the integer is too big for int, and 2 if integer fits
|
|---|
| 253 | in int.]
|
|---|
| 254 |
|
|---|
| 255 | SideEffects [Sets the pointer value if the string is an integer small enough
|
|---|
| 256 | for int.]
|
|---|
| 257 |
|
|---|
| 258 | ******************************************************************************/
|
|---|
| 259 | int
|
|---|
| 260 | Cmd_StringCheckIsInteger(
|
|---|
| 261 | char *string,
|
|---|
| 262 | int *value)
|
|---|
| 263 | {
|
|---|
| 264 | char *ptr;
|
|---|
| 265 | long l;
|
|---|
| 266 |
|
|---|
| 267 | errno = 0 ;
|
|---|
| 268 | l = strtol (string, &ptr, 0) ;
|
|---|
| 269 | if(*ptr != '\0')
|
|---|
| 270 | return 0;
|
|---|
| 271 | if (errno != 0)
|
|---|
| 272 | return 1;
|
|---|
| 273 | if ((l > MAXINT) || (l < -1 - MAXINT))
|
|---|
| 274 | return 1 ;
|
|---|
| 275 | *value = (int) l;
|
|---|
| 276 | return 2 ;
|
|---|
| 277 | }
|
|---|
| 278 |
|
|---|
| 279 |
|
|---|
| 280 | /*---------------------------------------------------------------------------*/
|
|---|
| 281 | /* Definition of internal functions */
|
|---|
| 282 | /*---------------------------------------------------------------------------*/
|
|---|
| 283 |
|
|---|
| 284 |
|
|---|
| 285 | /**Function********************************************************************
|
|---|
| 286 |
|
|---|
| 287 | Synopsis [required]
|
|---|
| 288 |
|
|---|
| 289 | Description [optional]
|
|---|
| 290 |
|
|---|
| 291 | SideEffects [required]
|
|---|
| 292 |
|
|---|
| 293 | SeeAlso [optional]
|
|---|
| 294 |
|
|---|
| 295 | ******************************************************************************/
|
|---|
| 296 | void
|
|---|
| 297 | CmdFreeArgv(int argc, char ** argv)
|
|---|
| 298 | {
|
|---|
| 299 | int i;
|
|---|
| 300 |
|
|---|
| 301 | for(i = 0; i < argc; i++) {
|
|---|
| 302 | FREE(argv[i]);
|
|---|
| 303 | }
|
|---|
| 304 | FREE(argv);
|
|---|
| 305 | }
|
|---|
| 306 |
|
|---|
| 307 |
|
|---|
| 308 | /**Function********************************************************************
|
|---|
| 309 |
|
|---|
| 310 | Synopsis [required]
|
|---|
| 311 |
|
|---|
| 312 | Description [optional]
|
|---|
| 313 |
|
|---|
| 314 | SideEffects [required]
|
|---|
| 315 |
|
|---|
| 316 | SeeAlso [optional]
|
|---|
| 317 |
|
|---|
| 318 | ******************************************************************************/
|
|---|
| 319 | void
|
|---|
| 320 | CmdAliasFree(
|
|---|
| 321 | char * value)
|
|---|
| 322 | {
|
|---|
| 323 | CmdAliasDescr_t *alias = (CmdAliasDescr_t *) value;
|
|---|
| 324 |
|
|---|
| 325 | CmdFreeArgv(alias->argc, alias->argv);
|
|---|
| 326 | FREE(alias->name); /* same as key */
|
|---|
| 327 | FREE(alias);
|
|---|
| 328 | }
|
|---|
| 329 |
|
|---|
| 330 |
|
|---|
| 331 |
|
|---|
| 332 | /*---------------------------------------------------------------------------*/
|
|---|
| 333 | /* Definition of static functions */
|
|---|
| 334 | /*---------------------------------------------------------------------------*/
|
|---|
| 335 |
|
|---|
| 336 | /**Function********************************************************************
|
|---|
| 337 |
|
|---|
| 338 | Synopsis [Implements the time command.]
|
|---|
| 339 |
|
|---|
| 340 | CommandName [time]
|
|---|
| 341 | CommandSynopsis [provide a simple elapsed time value]
|
|---|
| 342 | CommandArguments [\[-h\]\[-u\]]
|
|---|
| 343 | CommandDescription [Prints the processor time used since the last time
|
|---|
| 344 | command, and the total processor time used since VIS was started. <p>
|
|---|
| 345 | By default, the time reported is the CPU time spent executing instructions
|
|---|
| 346 | of the calling process and the time this process waited for children that
|
|---|
| 347 | terminated.<p>
|
|---|
| 348 | Command options:<p>
|
|---|
| 349 | <dl><dt> -h
|
|---|
| 350 | <dd> Print the command usage.
|
|---|
| 351 | </dl>
|
|---|
| 352 | <dl><dt> -u
|
|---|
| 353 | <dd> Exclude child process time.
|
|---|
| 354 | </dl>]
|
|---|
| 355 |
|
|---|
| 356 | SideEffects []
|
|---|
| 357 |
|
|---|
| 358 | ******************************************************************************/
|
|---|
| 359 | static int
|
|---|
| 360 | CommandTime(
|
|---|
| 361 | Hrc_Manager_t ** hmgr,
|
|---|
| 362 | int argc,
|
|---|
| 363 | char ** argv)
|
|---|
| 364 | {
|
|---|
| 365 | static long last_time_u = 0;
|
|---|
| 366 | static long last_time_c = 0;
|
|---|
| 367 | long time;
|
|---|
| 368 | int c;
|
|---|
| 369 | boolean excludeChildren = FALSE;
|
|---|
| 370 |
|
|---|
| 371 | util_getopt_reset();
|
|---|
| 372 | while ((c = util_getopt(argc,argv,"hu")) != EOF){
|
|---|
| 373 | switch(c){
|
|---|
| 374 | case 'h':
|
|---|
| 375 | goto usage;
|
|---|
| 376 | case 'u':
|
|---|
| 377 | excludeChildren = TRUE;
|
|---|
| 378 | break;
|
|---|
| 379 | default:
|
|---|
| 380 | goto usage;
|
|---|
| 381 | }
|
|---|
| 382 | }
|
|---|
| 383 |
|
|---|
| 384 | if (argc != util_optind) {
|
|---|
| 385 | goto usage;
|
|---|
| 386 | }
|
|---|
| 387 |
|
|---|
| 388 | if (excludeChildren) {
|
|---|
| 389 | time = util_cpu_time();
|
|---|
| 390 | (void) fprintf(vis_stdout,
|
|---|
| 391 | "elapse: %2.1f seconds, total: %2.1f seconds\n",
|
|---|
| 392 | (time - last_time_u) / 1000.0, time / 1000.0);
|
|---|
| 393 | last_time_u = time;
|
|---|
| 394 | } else {
|
|---|
| 395 | time = util_cpu_ctime();
|
|---|
| 396 | (void) fprintf(vis_stdout,
|
|---|
| 397 | "elapse: %2.1f seconds, total: %2.1f seconds\n",
|
|---|
| 398 | (time - last_time_c) / 1000.0, time / 1000.0);
|
|---|
| 399 | last_time_c = time;
|
|---|
| 400 | }
|
|---|
| 401 | return 0;
|
|---|
| 402 |
|
|---|
| 403 | usage:
|
|---|
| 404 | (void) fprintf(vis_stderr, "usage: time [-h][-u]\n");
|
|---|
| 405 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 406 | (void) fprintf(vis_stderr, " -u \t\texclude child process time\n");
|
|---|
| 407 | return 1;
|
|---|
| 408 | }
|
|---|
| 409 |
|
|---|
| 410 | /**Function********************************************************************
|
|---|
| 411 |
|
|---|
| 412 | Synopsis [Implements the echo command.]
|
|---|
| 413 |
|
|---|
| 414 | CommandName [echo]
|
|---|
| 415 | CommandSynopsis [merely echo the arguments]
|
|---|
| 416 | CommandArguments [\[-h\] <args>]
|
|---|
| 417 | CommandDescription [Echoes the arguments to standard output.<p>
|
|---|
| 418 | Command options:<p>
|
|---|
| 419 | <dl><dt> -h
|
|---|
| 420 | <dd> Print the command usage.
|
|---|
| 421 | </dl>]
|
|---|
| 422 |
|
|---|
| 423 | SideEffects []
|
|---|
| 424 |
|
|---|
| 425 | ******************************************************************************/
|
|---|
| 426 | static int
|
|---|
| 427 | CommandEcho(
|
|---|
| 428 | Hrc_Manager_t ** hmgr,
|
|---|
| 429 | int argc,
|
|---|
| 430 | char ** argv)
|
|---|
| 431 | {
|
|---|
| 432 | int i;
|
|---|
| 433 | int c;
|
|---|
| 434 |
|
|---|
| 435 | util_getopt_reset();
|
|---|
| 436 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 437 | switch(c) {
|
|---|
| 438 | case 'h':
|
|---|
| 439 | goto usage;
|
|---|
| 440 | default:
|
|---|
| 441 | goto usage;
|
|---|
| 442 | }
|
|---|
| 443 | }
|
|---|
| 444 |
|
|---|
| 445 | for(i = 1; i < argc; i++) {
|
|---|
| 446 | (void) fprintf(vis_stdout, "%s ", argv[i]);
|
|---|
| 447 | }
|
|---|
| 448 | (void) fprintf(vis_stdout, "\n");
|
|---|
| 449 | return 0;
|
|---|
| 450 |
|
|---|
| 451 | usage:
|
|---|
| 452 | (void) fprintf(vis_stderr, "usage: echo [-h] string \n");
|
|---|
| 453 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 454 | return (1);
|
|---|
| 455 | }
|
|---|
| 456 |
|
|---|
| 457 | /**Function********************************************************************
|
|---|
| 458 |
|
|---|
| 459 | Synopsis [Implements the set_bdd_parameters command.]
|
|---|
| 460 |
|
|---|
| 461 | SideEffects []
|
|---|
| 462 |
|
|---|
| 463 | CommandName [set_bdd_parameters]
|
|---|
| 464 |
|
|---|
| 465 | CommandSynopsis [Creates a table with the value of all the flags currently
|
|---|
| 466 | active in VIS and calls the function bdd_set_parameters with the manager of
|
|---|
| 467 | the current place in the hierarchy and the table.]
|
|---|
| 468 |
|
|---|
| 469 | CommandArguments [\[-h\]\[-s\]]
|
|---|
| 470 |
|
|---|
| 471 | CommandDescription [The command obtains the bdd manager of the current point
|
|---|
| 472 | in the hierarchy. Given this manager and the set of pairs (variable,value) of
|
|---|
| 473 | the VIS environment, the function sets specific BDD parameters to the given
|
|---|
| 474 | values. This command works in conjunction with print_bdd_stats.<p>
|
|---|
| 475 |
|
|---|
| 476 | Print_bdd_stats first prints a report of the parameters and statistics of the
|
|---|
| 477 | current bdd_manager. By using the command "set", the user may modify the
|
|---|
| 478 | value of any of the parameters of the underlying bdd package. The way to do
|
|---|
| 479 | it is by setting a value in the variable <tt>BDD.parameter name</tt> where
|
|---|
| 480 | <tt>parameter name<\tt> is the name of the parameter exactly as printed by
|
|---|
| 481 | the print_bdd_stats command. In order to "re-program" the underlying bdd
|
|---|
| 482 | package this command must be invoked.<p>
|
|---|
| 483 |
|
|---|
| 484 | Command options:<p>
|
|---|
| 485 |
|
|---|
| 486 | <dl>
|
|---|
| 487 |
|
|---|
| 488 | <dt> -h
|
|---|
| 489 | <dd> Print the command usage.
|
|---|
| 490 |
|
|---|
| 491 | <dt> -s
|
|---|
| 492 | <dd> Print the bdd parameter and statistics after the modification.
|
|---|
| 493 |
|
|---|
| 494 | </dl>
|
|---|
| 495 | ]
|
|---|
| 496 |
|
|---|
| 497 | ******************************************************************************/
|
|---|
| 498 | static int
|
|---|
| 499 | CommandSetBddParameters(
|
|---|
| 500 | Hrc_Manager_t ** hmgr,
|
|---|
| 501 | int argc,
|
|---|
| 502 | char ** argv)
|
|---|
| 503 | {
|
|---|
| 504 | Ntk_Network_t *network;
|
|---|
| 505 | boolean showAfter;
|
|---|
| 506 | int c;
|
|---|
| 507 |
|
|---|
| 508 | showAfter = FALSE;
|
|---|
| 509 | network = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
|
|---|
| 510 |
|
|---|
| 511 | /*
|
|---|
| 512 | * Parse the command line.
|
|---|
| 513 | */
|
|---|
| 514 | util_getopt_reset();
|
|---|
| 515 | while ((c = util_getopt(argc, argv, "hs")) != EOF) {
|
|---|
| 516 | switch (c) {
|
|---|
| 517 | case 'h':
|
|---|
| 518 | goto usage;
|
|---|
| 519 | case 's':
|
|---|
| 520 | showAfter = TRUE;
|
|---|
| 521 | break;
|
|---|
| 522 | default:
|
|---|
| 523 | goto usage;
|
|---|
| 524 | }
|
|---|
| 525 | }
|
|---|
| 526 |
|
|---|
| 527 | /* flatten_hierarchy and static_order must have been invoked already. */
|
|---|
| 528 | if (network == NIL(Ntk_Network_t)) {
|
|---|
| 529 | return 1;
|
|---|
| 530 | }
|
|---|
| 531 | if (!Ntk_NetworkReadMddManager(network)) {
|
|---|
| 532 | (void) fprintf(vis_stderr, "The MDD variables have not been ordered. ");
|
|---|
| 533 | (void) fprintf(vis_stderr, "Use static_order.\n");
|
|---|
| 534 | return 1;
|
|---|
| 535 | }
|
|---|
| 536 |
|
|---|
| 537 | /* Create the table of variable->value */
|
|---|
| 538 | bdd_set_parameters(Ntk_NetworkReadMddManager(network), cmdFlagTable,
|
|---|
| 539 | vis_stdout);
|
|---|
| 540 |
|
|---|
| 541 | if (showAfter) {
|
|---|
| 542 | bdd_print_stats(Ntk_NetworkReadMddManager(network), vis_stdout);
|
|---|
| 543 | }
|
|---|
| 544 |
|
|---|
| 545 | return 0; /* Everything okay */
|
|---|
| 546 |
|
|---|
| 547 | usage:
|
|---|
| 548 | (void) fprintf(vis_stderr, "usage: set_bdd_parameters [-h] [-s]\n");
|
|---|
| 549 | (void) fprintf(vis_stderr, " -h print the command usage\n");
|
|---|
| 550 | (void) fprintf(vis_stderr, " -s print also the bdd statistics\n");
|
|---|
| 551 |
|
|---|
| 552 | return 1;
|
|---|
| 553 | }
|
|---|
| 554 |
|
|---|
| 555 | /**Function********************************************************************
|
|---|
| 556 |
|
|---|
| 557 | Synopsis [Implements the _memory_profile command.]
|
|---|
| 558 |
|
|---|
| 559 | CommandName [_memory_profile]
|
|---|
| 560 |
|
|---|
| 561 | CommandSynopsis [It shows the amount of memory used by every pacakge.]
|
|---|
| 562 |
|
|---|
| 563 | CommandArguments [\[-f <filename>\] \[-h\] \[-p\] \[-u <units>\]]
|
|---|
| 564 |
|
|---|
| 565 | CommandDescription [This command intregrates the output from purify with a
|
|---|
| 566 | function map generated by a perlscript plus another perlscript to generate a
|
|---|
| 567 | memory profile of vis.<p>
|
|---|
| 568 |
|
|---|
| 569 | This command relies on the output of purify to a file to call the script
|
|---|
| 570 | "memoryaccount" and produce a summary of how much memory has been allocated
|
|---|
| 571 | by each package. Although this command may appear simple it requires the
|
|---|
| 572 | interaction of two scripts and three files, so special care should be taken
|
|---|
| 573 | when attempting to modify it.<p>
|
|---|
| 574 |
|
|---|
| 575 | Here is the way it works. The code in this command is conditionally compiled
|
|---|
| 576 | depending on the definition of the symbol <tt>PURIFY</tt>. If the symbol is
|
|---|
| 577 | not defined, the program prints a message notifying that the command is not
|
|---|
| 578 | operative in this executable. If <tt>PURIFY</tt> has been defined, there are
|
|---|
| 579 | certain things that are assumed. The executable has been linked with
|
|---|
| 580 | purify. The output of purify is being redirected to a file with name
|
|---|
| 581 | <tt>purify.log</tt>. The perl script <tt>memoryaccount</tt> is in
|
|---|
| 582 | <tt>$VIS/common/share</tt> and it is executable. There exists a file mapping
|
|---|
| 583 | function names to packages in the same place whose name is <tt>.fmap</tt>.<p>
|
|---|
| 584 |
|
|---|
| 585 | The command then calls <tt>purify_all_inuse()</tt> to force purify to dump to
|
|---|
| 586 | the file <tt>purify.log</tt> the information about the memory that is
|
|---|
| 587 | currently visible to the program. This memory is not the total memory
|
|---|
| 588 | allocated by the program since there may be leaked memory that is no longer
|
|---|
| 589 | accessible. A temporary file is created and the script <tt>memoryaccount</tt>
|
|---|
| 590 | is called to analyze the file <tt>purify.log</tt> and write in the temporary
|
|---|
| 591 | file the memory profile obtained from it. Once the script is done, the
|
|---|
| 592 | temporary file is dumped to <tt>vis_stdout</tt> and deleted.<p>
|
|---|
| 593 |
|
|---|
| 594 | Since most of the computation in this command is done by the pearlscript
|
|---|
| 595 | <tt>memoryaccount</tt>, for more information please refer to the message
|
|---|
| 596 | printed when the script is invoked with the option <tt>-h</tt>.
|
|---|
| 597 |
|
|---|
| 598 | Command options:<p>
|
|---|
| 599 |
|
|---|
| 600 | <dl>
|
|---|
| 601 | <dt> -f <filename>
|
|---|
| 602 | <dd> File to read the dump from. The default is purify.log. This option
|
|---|
| 603 | should be used if and only if the option <tt>-log-file</tt> has been used at
|
|---|
| 604 | the linking stage when building the executable.
|
|---|
| 605 | <dt> -h
|
|---|
| 606 | <dd> Print the command usage.
|
|---|
| 607 | <dt> -p
|
|---|
| 608 | <dd> Print also the packages that did not allocated any visible memory
|
|---|
| 609 | <dt> -u <units>
|
|---|
| 610 | <dd> Units to print the memory usage in. It may be "b" for
|
|---|
| 611 | bytes, "k" for kilobytes, "m" for megabytes and "g" for gigabytes. The default
|
|---|
| 612 | is bytes.
|
|---|
| 613 | </dl>
|
|---|
| 614 | ]
|
|---|
| 615 |
|
|---|
| 616 | SideEffects []
|
|---|
| 617 |
|
|---|
| 618 | ******************************************************************************/
|
|---|
| 619 | static int
|
|---|
| 620 | CommandMemoryProfile(
|
|---|
| 621 | Hrc_Manager_t ** hmgr,
|
|---|
| 622 | int argc,
|
|---|
| 623 | char ** argv)
|
|---|
| 624 | {
|
|---|
| 625 |
|
|---|
| 626 | int c;
|
|---|
| 627 | char options[128];
|
|---|
| 628 | #ifdef PURIFY
|
|---|
| 629 | char tmpFileName[128];
|
|---|
| 630 | FILE *fp;
|
|---|
| 631 | char command[256];
|
|---|
| 632 | char *visDirectoryName;
|
|---|
| 633 | int systemStatus;
|
|---|
| 634 | #endif
|
|---|
| 635 |
|
|---|
| 636 | /*
|
|---|
| 637 | * Parse command line options.
|
|---|
| 638 | */
|
|---|
| 639 | options[0] = 0;
|
|---|
| 640 | util_getopt_reset();
|
|---|
| 641 | while ((c = util_getopt(argc, argv, "f:hpu:")) != EOF) {
|
|---|
| 642 | switch(c) {
|
|---|
| 643 | case 'f':
|
|---|
| 644 | strcat(options, " -f ");
|
|---|
| 645 | strcat(options, util_optarg);
|
|---|
| 646 | break;
|
|---|
| 647 | case 'h':
|
|---|
| 648 | goto usage;
|
|---|
| 649 | case 'p':
|
|---|
| 650 | strcat(options, " -p ");
|
|---|
| 651 | break;
|
|---|
| 652 | case 'u':
|
|---|
| 653 | strcat(options, " -u ");
|
|---|
| 654 | strcat(options, util_optarg);
|
|---|
| 655 | break;
|
|---|
| 656 | default:
|
|---|
| 657 | goto usage;
|
|---|
| 658 | }
|
|---|
| 659 | }
|
|---|
| 660 |
|
|---|
| 661 |
|
|---|
| 662 | #ifdef PURIFY
|
|---|
| 663 | /* Flag to remember that a file has been created by purify */
|
|---|
| 664 | fileCreated = TRUE;
|
|---|
| 665 |
|
|---|
| 666 | /* Obtain the name of a temporary file */
|
|---|
| 667 | tmpnam(tmpFileName);
|
|---|
| 668 |
|
|---|
| 669 | /* Kick purify to dump the data in the file */
|
|---|
| 670 | purify_all_inuse();
|
|---|
| 671 |
|
|---|
| 672 | /* Obtain the path to the perl script */
|
|---|
| 673 | visDirectoryName = Vm_VisObtainLibrary();
|
|---|
| 674 |
|
|---|
| 675 | /* Prepare the string to be sent to a shell */
|
|---|
| 676 | (void)sprintf(command, "%s/memoryaccount %s %s/.fmap ./.fmap >%s",
|
|---|
| 677 | visDirectoryName, options, visDirectoryName,
|
|---|
| 678 | tmpFileName);
|
|---|
| 679 |
|
|---|
| 680 | /* Effectively execute the perlscript */
|
|---|
| 681 | systemStatus = system(command);
|
|---|
| 682 | if (systemStatus != 0) {
|
|---|
| 683 | return 1;
|
|---|
| 684 | }
|
|---|
| 685 |
|
|---|
| 686 | fp = Cmd_FileOpen(tmpFileName, "r", NIL(char *), 1);
|
|---|
| 687 |
|
|---|
| 688 | /* Check if the open has been successful */
|
|---|
| 689 | if (fp == NIL(FILE)) {
|
|---|
| 690 | (void) fprintf(vis_stderr, "** cmd error: File %s was not found\n", tmpFileName);
|
|---|
| 691 | return 1;
|
|---|
| 692 | }
|
|---|
| 693 |
|
|---|
| 694 | /* Dump the contents of the result file in vis_stdout */
|
|---|
| 695 | while(fgets(command, 128, fp) != NIL(char)) {
|
|---|
| 696 | (void) fprintf(vis_stdout, "%s", command);
|
|---|
| 697 | }
|
|---|
| 698 | fclose(fp);
|
|---|
| 699 |
|
|---|
| 700 | /* Remove the temporary file */
|
|---|
| 701 | #if HAVE_UNLINK
|
|---|
| 702 | unlink(tmpFileName);
|
|---|
| 703 | #endif
|
|---|
| 704 | #else
|
|---|
| 705 | (void) fprintf(vis_stderr, "** cmd error: Command not available: Vis has not been ");
|
|---|
| 706 | (void) fprintf(vis_stderr, "compiled with purify.\n");
|
|---|
| 707 | #endif
|
|---|
| 708 |
|
|---|
| 709 | return 0; /* normal exit */
|
|---|
| 710 |
|
|---|
| 711 | usage:
|
|---|
| 712 | (void) fprintf(vis_stderr, "usage: _memory_profile [-f <filename>] [-h] ");
|
|---|
| 713 | (void) fprintf(vis_stderr, "[-p] [-u <units>] <filenames>\n");
|
|---|
| 714 | (void) fprintf(vis_stderr, " -f <file>\tFile to read the purify dump");
|
|---|
| 715 | (void) fprintf(vis_stderr, " from. The default is purify.log\n");
|
|---|
| 716 | (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n");
|
|---|
| 717 | (void) fprintf(vis_stderr, " -p\t\tPrint also the packages that do not ");
|
|---|
| 718 | (void) fprintf(vis_stderr, " allocate any memory\n");
|
|---|
| 719 | (void) fprintf(vis_stderr, " -u <units>\tUnits to print the memory usage");
|
|---|
| 720 | (void) fprintf(vis_stderr, " in. It may be b for bytes\n");
|
|---|
| 721 | (void) fprintf(vis_stderr, " \t\tk for kilobytes, m for megabytes and ");
|
|---|
| 722 | (void) fprintf(vis_stderr, "g for gigabutes.\n");
|
|---|
| 723 | return 1; /* error exit */
|
|---|
| 724 | }
|
|---|
| 725 |
|
|---|
| 726 |
|
|---|
| 727 | /**Function********************************************************************
|
|---|
| 728 |
|
|---|
| 729 | Synopsis [Implements the quit command.]
|
|---|
| 730 |
|
|---|
| 731 | Description [A return value of -1 indicates a quick quit, -2 return frees
|
|---|
| 732 | the memory.]
|
|---|
| 733 |
|
|---|
| 734 | CommandName [quit]
|
|---|
| 735 | CommandSynopsis [exit VIS]
|
|---|
| 736 | CommandArguments [\[-h\] \[-s\]]
|
|---|
| 737 | CommandDescription [Stops the program. Does not save the current network
|
|---|
| 738 | before exiting.<p>
|
|---|
| 739 | Command options:<p>
|
|---|
| 740 | <dl><dt> -h
|
|---|
| 741 | <dd> Print the command usage.
|
|---|
| 742 | </dl>
|
|---|
| 743 | <dl><dt> -s
|
|---|
| 744 | <dd> Free all the memory before quitting.
|
|---|
| 745 | This is slower, and is used for finding memory leaks.
|
|---|
| 746 | </dl>
|
|---|
| 747 | ]
|
|---|
| 748 |
|
|---|
| 749 | SideEffects []
|
|---|
| 750 |
|
|---|
| 751 | ******************************************************************************/
|
|---|
| 752 | static int
|
|---|
| 753 | CommandQuit(
|
|---|
| 754 | Hrc_Manager_t ** hmgr,
|
|---|
| 755 | int argc,
|
|---|
| 756 | char ** argv)
|
|---|
| 757 | {
|
|---|
| 758 | int c;
|
|---|
| 759 |
|
|---|
| 760 | util_getopt_reset();
|
|---|
| 761 | while ((c = util_getopt(argc,argv,"hs")) != EOF){
|
|---|
| 762 | switch(c){
|
|---|
| 763 | case 'h':
|
|---|
| 764 | goto usage;
|
|---|
| 765 | case 's':
|
|---|
| 766 | return -2;
|
|---|
| 767 | default:
|
|---|
| 768 | goto usage;
|
|---|
| 769 | }
|
|---|
| 770 | }
|
|---|
| 771 |
|
|---|
| 772 | if ( argc != util_optind){
|
|---|
| 773 | goto usage;
|
|---|
| 774 | }
|
|---|
| 775 | return -1;
|
|---|
| 776 |
|
|---|
| 777 | usage:
|
|---|
| 778 | (void)fprintf(vis_stderr, "usage: quit [-h] [-s]\n");
|
|---|
| 779 | (void)fprintf(vis_stderr, " -h print the command usage\n");
|
|---|
| 780 | (void)fprintf(vis_stderr, " -s frees all the memory before quitting\n");
|
|---|
| 781 | return 1;
|
|---|
| 782 | }
|
|---|
| 783 |
|
|---|
| 784 | /**Function********************************************************************
|
|---|
| 785 |
|
|---|
| 786 | Synopsis [Implements the usage command.]
|
|---|
| 787 |
|
|---|
| 788 | CommandName [usage]
|
|---|
| 789 | CommandSynopsis [provide a dump of process statistics]
|
|---|
| 790 | CommandArguments [\[-h\]]
|
|---|
| 791 | CommandDescription [Prints a formatted dump of processor-specific usage
|
|---|
| 792 | statistics. For Berkeley Unix, this includes all of the information in the
|
|---|
| 793 | getrusage() structure.<p>
|
|---|
| 794 | Command options:<p>
|
|---|
| 795 | <dl><dt> -h
|
|---|
| 796 | <dd> Print the command usage.
|
|---|
| 797 | </dl> ]
|
|---|
| 798 |
|
|---|
| 799 | SideEffects []
|
|---|
| 800 |
|
|---|
| 801 | ******************************************************************************/
|
|---|
| 802 | static int
|
|---|
| 803 | CommandUsage(
|
|---|
| 804 | Hrc_Manager_t ** hmgr,
|
|---|
| 805 | int argc,
|
|---|
| 806 | char ** argv)
|
|---|
| 807 | {
|
|---|
| 808 | int c;
|
|---|
| 809 |
|
|---|
| 810 | util_getopt_reset();
|
|---|
| 811 | while ((c = util_getopt(argc,argv,"h")) != EOF){
|
|---|
| 812 | switch(c){
|
|---|
| 813 | case 'h':
|
|---|
| 814 | goto usage;
|
|---|
| 815 | default:
|
|---|
| 816 | goto usage;
|
|---|
| 817 | }
|
|---|
| 818 | }
|
|---|
| 819 |
|
|---|
| 820 | if (argc != util_optind){
|
|---|
| 821 | goto usage;
|
|---|
| 822 | }
|
|---|
| 823 | util_print_cpu_stats(vis_stdout);
|
|---|
| 824 | return 0;
|
|---|
| 825 |
|
|---|
| 826 | usage:
|
|---|
| 827 | (void) fprintf(vis_stderr, "usage: usage [-h]\n");
|
|---|
| 828 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 829 | return 1;
|
|---|
| 830 | }
|
|---|
| 831 |
|
|---|
| 832 | /**Function********************************************************************
|
|---|
| 833 |
|
|---|
| 834 | Synopsis [Implements the which command.]
|
|---|
| 835 |
|
|---|
| 836 | CommandName [which]
|
|---|
| 837 | CommandSynopsis [look for a file called name]
|
|---|
| 838 | CommandArguments [\[-h\] <file_name>]
|
|---|
| 839 | CommandDescription [Looks for a file in a set of directories
|
|---|
| 840 | which includes the current directory as well as those in the VIS path.
|
|---|
| 841 | If it finds it, it reports the path.
|
|---|
| 842 | The path is specified through the "set open_path" command in the .visrc.<p>
|
|---|
| 843 | Command options:<p>
|
|---|
| 844 | <dl><dt> -h
|
|---|
| 845 | <dd> Print the command usage.
|
|---|
| 846 | </dl>
|
|---|
| 847 | <dl><dt> <file_name>
|
|---|
| 848 | <dd> File to be searched
|
|---|
| 849 | </dl>]
|
|---|
| 850 |
|
|---|
| 851 | SideEffects []
|
|---|
| 852 |
|
|---|
| 853 | SeeAlso [set]
|
|---|
| 854 |
|
|---|
| 855 | ******************************************************************************/
|
|---|
| 856 | static int
|
|---|
| 857 | CommandWhich(
|
|---|
| 858 | Hrc_Manager_t ** hmgr,
|
|---|
| 859 | int argc,
|
|---|
| 860 | char ** argv)
|
|---|
| 861 | {
|
|---|
| 862 | FILE *fp;
|
|---|
| 863 | char *filename;
|
|---|
| 864 | int c;
|
|---|
| 865 |
|
|---|
| 866 | util_getopt_reset();
|
|---|
| 867 | while ((c = util_getopt(argc,argv,"h")) != EOF){
|
|---|
| 868 | switch(c){
|
|---|
| 869 | case 'h':
|
|---|
| 870 | goto usage;
|
|---|
| 871 | default:
|
|---|
| 872 | goto usage;
|
|---|
| 873 | }
|
|---|
| 874 | }
|
|---|
| 875 |
|
|---|
| 876 | if (argc-1 != util_optind){
|
|---|
| 877 | goto usage;
|
|---|
| 878 | }
|
|---|
| 879 |
|
|---|
| 880 | fp = Cmd_FileOpen(argv[1], "r", &filename, 0);
|
|---|
| 881 | if (fp != 0) {
|
|---|
| 882 | (void) fprintf(vis_stdout, "%s\n", filename);
|
|---|
| 883 | (void) fclose(fp);
|
|---|
| 884 | }
|
|---|
| 885 | FREE(filename);
|
|---|
| 886 | return 0;
|
|---|
| 887 |
|
|---|
| 888 | usage:
|
|---|
| 889 | (void)fprintf(vis_stderr,"usage: which [-h] file_name\n");
|
|---|
| 890 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 891 | return 1;
|
|---|
| 892 | }
|
|---|
| 893 |
|
|---|
| 894 |
|
|---|
| 895 | /**Function********************************************************************
|
|---|
| 896 |
|
|---|
| 897 | Synopsis [Implements the history command.]
|
|---|
| 898 |
|
|---|
| 899 | CommandName [history]
|
|---|
| 900 |
|
|---|
| 901 | CommandSynopsis [list previous commands and their event numbers]
|
|---|
| 902 |
|
|---|
| 903 | CommandArguments [\[-h\] \[<num>\]]
|
|---|
| 904 |
|
|---|
| 905 | CommandDescription [Lists previous commands and their event numbers.
|
|---|
| 906 | This is a UNIX-like history mechanism inside the VIS shell.<p>
|
|---|
| 907 | Command options:<p>
|
|---|
| 908 | <dl><dt> -h
|
|---|
| 909 | <dd> Print the command usage.
|
|---|
| 910 | </dl>
|
|---|
| 911 | <dl><dt> <num>
|
|---|
| 912 | <dd> Lists the last <num> events. Lists the last
|
|---|
| 913 | 30 events if <num> is not specified.
|
|---|
| 914 | </dl><p>
|
|---|
| 915 |
|
|---|
| 916 | History Substitution:<p>
|
|---|
| 917 |
|
|---|
| 918 | The history substitution mechanism is a simpler version of the csh history
|
|---|
| 919 | substitution mechanism. It enables you to reuse words from previously typed
|
|---|
| 920 | commands.<p>
|
|---|
| 921 |
|
|---|
| 922 | The default history substitution character is the `%' (`!' is default for
|
|---|
| 923 | shell escapes, and `#' marks the beginning of a comment). This can be changed
|
|---|
| 924 | using the "set" command. In this description '%' is used as the history_char.
|
|---|
| 925 | The `%' can appear anywhere in a line. A line containing a history
|
|---|
| 926 | substitution is echoed to the screen after the substitution takes place.
|
|---|
| 927 | `%' can be preceded by a `\\' in order to escape the substitution,
|
|---|
| 928 | for example, to enter a `%' into an alias or to set the prompt.<br><p>
|
|---|
| 929 |
|
|---|
| 930 | Each valid line typed at the prompt is saved. If the "history" variable
|
|---|
| 931 | is set (see help page for "set"), each line is also echoed to the history
|
|---|
| 932 | file. You can use the "history" command to list the previously typed
|
|---|
| 933 | commands. <p>
|
|---|
| 934 |
|
|---|
| 935 | Substitutions: <p>
|
|---|
| 936 |
|
|---|
| 937 | At any point in a line these history substitutions are
|
|---|
| 938 | available.<p>
|
|---|
| 939 | <dl><dt>%:0 <dd> Initial word of last command.</dl>
|
|---|
| 940 | <dl><dt>%:n <dd> n-th argument of last command.</dl>
|
|---|
| 941 | <dl><dt>%$ <dd> Last argument of last command.</dl>
|
|---|
| 942 | <dl><dt>%* <dd> All but initial word of last command.</dl>
|
|---|
| 943 |
|
|---|
| 944 | <dl><dt>%% <dd> Last command.</dl>
|
|---|
| 945 | <dl><dt>%stuf <dd> Last command beginning with "stuf".</dl>
|
|---|
| 946 | <dl><dt>%n <dd> Repeat the n-th command.</dl>
|
|---|
| 947 | <dl><dt>%-n <dd> Repeat the n-th previous command.</dl>
|
|---|
| 948 | <dl><dt>^old^new <dd> Replace "old" with "new" in previous command.
|
|---|
| 949 | Trailing spaces are significant during substitution.
|
|---|
| 950 | Initial spaces are not significant.</dl> ]
|
|---|
| 951 |
|
|---|
| 952 | SideEffects []
|
|---|
| 953 |
|
|---|
| 954 | SeeAlso [set]
|
|---|
| 955 |
|
|---|
| 956 | ******************************************************************************/
|
|---|
| 957 | static int
|
|---|
| 958 | CommandHistory(
|
|---|
| 959 | Hrc_Manager_t ** hmgr,
|
|---|
| 960 | int argc,
|
|---|
| 961 | char ** argv)
|
|---|
| 962 | {
|
|---|
| 963 | int i, num, lineno;
|
|---|
| 964 | int size;
|
|---|
| 965 | int c;
|
|---|
| 966 |
|
|---|
| 967 | util_getopt_reset();
|
|---|
| 968 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 969 | switch(c) {
|
|---|
| 970 | case 'h':
|
|---|
| 971 | goto usage;
|
|---|
| 972 | default:
|
|---|
| 973 | goto usage;
|
|---|
| 974 | }
|
|---|
| 975 | }
|
|---|
| 976 |
|
|---|
| 977 | if (argc > 3) {
|
|---|
| 978 | goto usage;
|
|---|
| 979 | }
|
|---|
| 980 | num = 30;
|
|---|
| 981 | lineno = 1;
|
|---|
| 982 | for (i = 1; i < argc; i++) {
|
|---|
| 983 | if (argv[i][0] == '-') {
|
|---|
| 984 | if (argv[i][1] == 'h') {
|
|---|
| 985 | lineno = 0;
|
|---|
| 986 | }
|
|---|
| 987 | else {
|
|---|
| 988 | goto usage;
|
|---|
| 989 | }
|
|---|
| 990 | }
|
|---|
| 991 | else {
|
|---|
| 992 | num = atoi(argv[i]);
|
|---|
| 993 | if (num <= 0) {
|
|---|
| 994 | goto usage;
|
|---|
| 995 | }
|
|---|
| 996 | }
|
|---|
| 997 | }
|
|---|
| 998 | size = array_n(vm_commandHistoryArray);
|
|---|
| 999 | num = (num < size) ? num : size;
|
|---|
| 1000 | for (i = size - num; i < size; i++) {
|
|---|
| 1001 | if (lineno != 0) {
|
|---|
| 1002 | (void) fprintf(vis_stdout, "%d\t", i + 1);
|
|---|
| 1003 | }
|
|---|
| 1004 | (void) fprintf(vis_stdout, "%s\n", array_fetch(char *, vm_commandHistoryArray, i));
|
|---|
| 1005 | }
|
|---|
| 1006 | return(0);
|
|---|
| 1007 |
|
|---|
| 1008 | usage:
|
|---|
| 1009 | (void) fprintf(vis_stderr, "usage: history [-h] [num]\n");
|
|---|
| 1010 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1011 | (void) fprintf(vis_stderr, " num \t\tprint the last num commands\n");
|
|---|
| 1012 | return(1);
|
|---|
| 1013 | }
|
|---|
| 1014 |
|
|---|
| 1015 |
|
|---|
| 1016 |
|
|---|
| 1017 |
|
|---|
| 1018 | /**Function********************************************************************
|
|---|
| 1019 |
|
|---|
| 1020 | Synopsis [Implements the alias command.]
|
|---|
| 1021 |
|
|---|
| 1022 | CommandName [alias]
|
|---|
| 1023 |
|
|---|
| 1024 | CommandSynopsis [provide an alias for a command]
|
|---|
| 1025 |
|
|---|
| 1026 | CommandArguments [\[-h\] \[<name> \[<string>\]\]]
|
|---|
| 1027 |
|
|---|
| 1028 | CommandDescription [The "alias" command, if given no arguments, will print
|
|---|
| 1029 | the definition of all current aliases. <p>
|
|---|
| 1030 |
|
|---|
| 1031 | Given a single argument, it will print the definition of that alias (if any).
|
|---|
| 1032 |
|
|---|
| 1033 | Given two arguments, the keyword "name" becomes an alias for
|
|---|
| 1034 | the command string "string", replacing any other alias with the
|
|---|
| 1035 | same name.<p>
|
|---|
| 1036 |
|
|---|
| 1037 | Command options:
|
|---|
| 1038 | <dl><dt> -h
|
|---|
| 1039 | <dd> Print the command usage.
|
|---|
| 1040 | </dl>
|
|---|
| 1041 | <dl><dt> <name>
|
|---|
| 1042 | <dd> Alias
|
|---|
| 1043 | </dl>
|
|---|
| 1044 | <dl><dt> <string>
|
|---|
| 1045 | <dd> Command string
|
|---|
| 1046 | </dl>
|
|---|
| 1047 |
|
|---|
| 1048 | It is possible to create aliases that take arguments by using the history
|
|---|
| 1049 | substitution mechanism. To protect the history substitution character `%'
|
|---|
| 1050 | from immediate expansion, it must be preceded by a `\\' when entering the
|
|---|
| 1051 | alias. <p>
|
|---|
| 1052 |
|
|---|
| 1053 | For example:<p>
|
|---|
| 1054 | <pre>
|
|---|
| 1055 | vis> alias read read_\\%:1 \\%:2.\\%:1
|
|---|
| 1056 | vis> read blif lion
|
|---|
| 1057 | </pre>
|
|---|
| 1058 | will create an alias `read', execute "read_blif lion.blif". <p>
|
|---|
| 1059 |
|
|---|
| 1060 | And...<p>
|
|---|
| 1061 | <pre>
|
|---|
| 1062 | vis> alias echo2 "echo Hi ; echo \\%* !"
|
|---|
| 1063 | vis> echo2 happy birthday
|
|---|
| 1064 | </pre>
|
|---|
| 1065 | will print:<p>
|
|---|
| 1066 | <pre>
|
|---|
| 1067 | Hi
|
|---|
| 1068 | happy birthday !
|
|---|
| 1069 | </pre>
|
|---|
| 1070 |
|
|---|
| 1071 | CAVEAT: Currently there is no check to see if there is a circular
|
|---|
| 1072 | dependency in the alias definition. e.g.<p>
|
|---|
| 1073 |
|
|---|
| 1074 | <pre>
|
|---|
| 1075 | vis> alias foo "print_network_stats; print_network; foo"
|
|---|
| 1076 | </pre>
|
|---|
| 1077 |
|
|---|
| 1078 | creates an alias which refers to itself. Executing the command "foo" will
|
|---|
| 1079 | result an infinite loop during which the commands "print_network_stats"
|
|---|
| 1080 | and "print_network" will be executed.<p>
|
|---|
| 1081 |
|
|---|
| 1082 | ]
|
|---|
| 1083 |
|
|---|
| 1084 | SideEffects []
|
|---|
| 1085 |
|
|---|
| 1086 | SeeAlso [unalias]
|
|---|
| 1087 |
|
|---|
| 1088 | ******************************************************************************/
|
|---|
| 1089 | static int
|
|---|
| 1090 | CommandAlias(
|
|---|
| 1091 | Hrc_Manager_t ** hmgr,
|
|---|
| 1092 | int argc,
|
|---|
| 1093 | char ** argv)
|
|---|
| 1094 | {
|
|---|
| 1095 | int i;
|
|---|
| 1096 | char *key, *value;
|
|---|
| 1097 | CmdAliasDescr_t *alias;
|
|---|
| 1098 | avl_generator *gen;
|
|---|
| 1099 | int status;
|
|---|
| 1100 | int c;
|
|---|
| 1101 |
|
|---|
| 1102 | util_getopt_reset();
|
|---|
| 1103 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 1104 | switch(c) {
|
|---|
| 1105 | case 'h':
|
|---|
| 1106 | goto usage;
|
|---|
| 1107 | default:
|
|---|
| 1108 | goto usage;
|
|---|
| 1109 | }
|
|---|
| 1110 | }
|
|---|
| 1111 |
|
|---|
| 1112 |
|
|---|
| 1113 | if (argc == 1) {
|
|---|
| 1114 | avl_foreach_item(cmdAliasTable, gen, AVL_FORWARD, &key, &value) {
|
|---|
| 1115 | print_alias(value);
|
|---|
| 1116 | }
|
|---|
| 1117 | return 0;
|
|---|
| 1118 |
|
|---|
| 1119 | }
|
|---|
| 1120 | else if (argc == 2) {
|
|---|
| 1121 | if (avl_lookup(cmdAliasTable, argv[1], &value)) {
|
|---|
| 1122 | print_alias(value);
|
|---|
| 1123 | }
|
|---|
| 1124 | return 0;
|
|---|
| 1125 | }
|
|---|
| 1126 |
|
|---|
| 1127 | /* delete any existing alias */
|
|---|
| 1128 | key = argv[1];
|
|---|
| 1129 | if (avl_delete(cmdAliasTable, &key, &value)) {
|
|---|
| 1130 | CmdAliasFree(value);
|
|---|
| 1131 | }
|
|---|
| 1132 |
|
|---|
| 1133 | alias = ALLOC(CmdAliasDescr_t, 1);
|
|---|
| 1134 | alias->name = util_strsav(argv[1]);
|
|---|
| 1135 | alias->argc = argc - 2;
|
|---|
| 1136 | alias->argv = ALLOC(char *, alias->argc);
|
|---|
| 1137 | for(i = 2; i < argc; i++) {
|
|---|
| 1138 | alias->argv[i-2] = util_strsav(argv[i]);
|
|---|
| 1139 | }
|
|---|
| 1140 | status = avl_insert(cmdAliasTable, alias->name, (char *) alias);
|
|---|
| 1141 | assert(!status); /* error here in SIS version, TRS, 8/4/95 */
|
|---|
| 1142 | return 0;
|
|---|
| 1143 |
|
|---|
| 1144 | usage:
|
|---|
| 1145 | (void) fprintf(vis_stderr, "usage: alias [-h] [command [string]]\n");
|
|---|
| 1146 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1147 | return (1);
|
|---|
| 1148 | }
|
|---|
| 1149 |
|
|---|
| 1150 |
|
|---|
| 1151 | /**Function********************************************************************
|
|---|
| 1152 |
|
|---|
| 1153 | Synopsis [Implements the unalias command.]
|
|---|
| 1154 |
|
|---|
| 1155 | CommandName [unalias]
|
|---|
| 1156 | CommandSynopsis [remove the definition of an alias.]
|
|---|
| 1157 | CommandArguments [\[-h\] <alias_names>]
|
|---|
| 1158 | CommandDescription [Removes the definition of an alias.<p>
|
|---|
| 1159 | Command options:<p>
|
|---|
| 1160 | <dl><dt> -h
|
|---|
| 1161 | <dd> Print the command usage.
|
|---|
| 1162 | </dl>
|
|---|
| 1163 | <dl><dt> <alias_names>
|
|---|
| 1164 | <dd> Aliases to be removed
|
|---|
| 1165 | </dl>]
|
|---|
| 1166 |
|
|---|
| 1167 | SideEffects []
|
|---|
| 1168 |
|
|---|
| 1169 | SeeAlso [alias]
|
|---|
| 1170 |
|
|---|
| 1171 | ******************************************************************************/
|
|---|
| 1172 | static int
|
|---|
| 1173 | CommandUnalias(
|
|---|
| 1174 | Hrc_Manager_t ** hmgr,
|
|---|
| 1175 | int argc,
|
|---|
| 1176 | char ** argv)
|
|---|
| 1177 | {
|
|---|
| 1178 | int i;
|
|---|
| 1179 | char *key, *value;
|
|---|
| 1180 | int c;
|
|---|
| 1181 |
|
|---|
| 1182 | util_getopt_reset();
|
|---|
| 1183 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 1184 | switch(c) {
|
|---|
| 1185 | case 'h':
|
|---|
| 1186 | goto usage;
|
|---|
| 1187 | default:
|
|---|
| 1188 | goto usage;
|
|---|
| 1189 | }
|
|---|
| 1190 | }
|
|---|
| 1191 |
|
|---|
| 1192 | if (argc < 2) {
|
|---|
| 1193 | goto usage;
|
|---|
| 1194 | }
|
|---|
| 1195 |
|
|---|
| 1196 | for(i = 1; i < argc; i++) {
|
|---|
| 1197 | key = argv[i];
|
|---|
| 1198 | if (avl_delete(cmdAliasTable, &key, &value)) {
|
|---|
| 1199 | CmdAliasFree(value);
|
|---|
| 1200 | }
|
|---|
| 1201 | }
|
|---|
| 1202 | return 0;
|
|---|
| 1203 |
|
|---|
| 1204 | usage:
|
|---|
| 1205 | (void) fprintf(vis_stderr, "usage: unalias [-h] alias_names\n");
|
|---|
| 1206 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1207 | return 1;
|
|---|
| 1208 | }
|
|---|
| 1209 |
|
|---|
| 1210 |
|
|---|
| 1211 | /**Function********************************************************************
|
|---|
| 1212 |
|
|---|
| 1213 | Synopsis [Implements the set command.]
|
|---|
| 1214 |
|
|---|
| 1215 | CommandName [set]
|
|---|
| 1216 |
|
|---|
| 1217 | CommandSynopsis [set an environment variable]
|
|---|
| 1218 |
|
|---|
| 1219 | CommandArguments [\[-h\] \[<name>\] \[<value>\]]
|
|---|
| 1220 |
|
|---|
| 1221 | CommandDescription [ A variable environment is maintained by the command
|
|---|
| 1222 | interpreter.
|
|---|
| 1223 | The "set" command sets a variable to a particular value, and the
|
|---|
| 1224 | "unset" command removes the definition of a variable.
|
|---|
| 1225 | If "set" is given no arguments, it prints the current value of all variables.<p>
|
|---|
| 1226 |
|
|---|
| 1227 | Command options:<p>
|
|---|
| 1228 | <dl> <dt> -h
|
|---|
| 1229 | <dd> Print the command usage.
|
|---|
| 1230 | </dl>
|
|---|
| 1231 | <dl> <dt> <name>
|
|---|
| 1232 | <dd> Variable name
|
|---|
| 1233 | </dl>
|
|---|
| 1234 | <dl> <dt> <value>
|
|---|
| 1235 | <dd> Value to be assigned to the variable.
|
|---|
| 1236 | </dl>
|
|---|
| 1237 |
|
|---|
| 1238 | <p>
|
|---|
| 1239 | Interpolation of variables is allowed when using the set command. The
|
|---|
| 1240 | variables are referred to with the prefix of '$'. So for example, the following
|
|---|
| 1241 | can be done to check the value of a set variable:<br>
|
|---|
| 1242 | <code>
|
|---|
| 1243 | vis> set foo bar <br>
|
|---|
| 1244 | vis> echo $foo <br>
|
|---|
| 1245 | bar <br>
|
|---|
| 1246 | </code>
|
|---|
| 1247 |
|
|---|
| 1248 | The last line "bar" will the output produced by vis.<p>
|
|---|
| 1249 |
|
|---|
| 1250 | Variables can be extended by using the character ':' to concatenate
|
|---|
| 1251 | values. For example : <br>
|
|---|
| 1252 | <code>
|
|---|
| 1253 | vis> set foo bar <br>
|
|---|
| 1254 | vis> set foo $foo:foobar <br>
|
|---|
| 1255 | vis> echo $foo <br>
|
|---|
| 1256 | bar:foobar <br>
|
|---|
| 1257 | </code>
|
|---|
| 1258 | The variable <code> foo </code> is extended with the value <code>
|
|---|
| 1259 | foobar </code>. <p>
|
|---|
| 1260 |
|
|---|
| 1261 | Whitespace characters may be present within quotes. However, variable
|
|---|
| 1262 | interpolation lays the restriction that the characters ':' and '/' may
|
|---|
| 1263 | not be used within quotes. This is to allow for recursive interpolation.
|
|---|
| 1264 | So for example, the following is allowed<br>
|
|---|
| 1265 | <code>
|
|---|
| 1266 | vis> set "foo bar" this <br>
|
|---|
| 1267 | vis> echo $"foo bar"<br>
|
|---|
| 1268 | this <br>
|
|---|
| 1269 | </code>
|
|---|
| 1270 | The last line will be the output produced by vis. <br>
|
|---|
| 1271 | But in the following, the value of the variable <code> foo/bar </code>
|
|---|
| 1272 | will not be interpreted correctly:<p>
|
|---|
| 1273 | <code>
|
|---|
| 1274 | vis> set "foo/bar" this <br>
|
|---|
| 1275 | vis> echo $"foo/bar" <br>
|
|---|
| 1276 | foo/bar <br>
|
|---|
| 1277 | </code>
|
|---|
| 1278 | If a variable is not set by the "set" command, then the variable is returned
|
|---|
| 1279 | unchanged.
|
|---|
| 1280 | <p>
|
|---|
| 1281 |
|
|---|
| 1282 | Different commands use environment information for different purposes.
|
|---|
| 1283 | The command interpreter makes use of the following parameters:<p>
|
|---|
| 1284 |
|
|---|
| 1285 | <dl>
|
|---|
| 1286 | <dt><b>autoexec</b>
|
|---|
| 1287 | <dd> Defines a command string to be automatically executed after every
|
|---|
| 1288 | command processed by the command interpreter.
|
|---|
| 1289 | This is useful for things like timing commands, or tracing the
|
|---|
| 1290 | progress of optimization.
|
|---|
| 1291 | </dl>
|
|---|
| 1292 |
|
|---|
| 1293 |
|
|---|
| 1294 | <dl><dt><b>open_path</b>
|
|---|
| 1295 | <dd> "open_path" (in analogy to the shell-variable PATH) is a list of
|
|---|
| 1296 | colon-separated strings giving directories to be searched whenever
|
|---|
| 1297 | a file is opened for read. Typically the current directory (.) is
|
|---|
| 1298 | first in this list. The standard system library (typically
|
|---|
| 1299 | $VIS_LIBRARY_PATH) is always implicitly appended to the current path.
|
|---|
| 1300 | This provides a convenient short-hand mechanism for reaching
|
|---|
| 1301 | standard library files.
|
|---|
| 1302 | </dl>
|
|---|
| 1303 | <dl><dt> <b>vis_stderr </b>
|
|---|
| 1304 | <dd> Standard error (normally stderr) can be re-directed to a file
|
|---|
| 1305 | by setting the variable vis_stderr.
|
|---|
| 1306 | </dl>
|
|---|
| 1307 |
|
|---|
| 1308 | <dl><dt> <b>vis_stdout</b>
|
|---|
| 1309 | <dd> Standard output (normally stdout) can be re-directed to a file
|
|---|
| 1310 | by setting the variable vis_stdout.
|
|---|
| 1311 | </dl>
|
|---|
| 1312 |
|
|---|
| 1313 | Building MDDs for the network makes use of following setting:
|
|---|
| 1314 | <dl><dt> <b>partition_method</b>
|
|---|
| 1315 | <dd> This parameter is used to select the method for creating the
|
|---|
| 1316 | partition. The vertices of a partition correspond to the
|
|---|
| 1317 | combinational inputs, combinational outputs, and any intermediate nodes used. Each vertex has a multi-valued
|
|---|
| 1318 | function (represented by MDDs) expressing the function of the corresponding
|
|---|
| 1319 | network node in terms of the partition vertices in its transitive fanin.
|
|---|
| 1320 | Hence, the MDDs of the partition represent a partial collapsing of the
|
|---|
| 1321 | network. The possible values of partition_method are:
|
|---|
| 1322 | <dl>
|
|---|
| 1323 | <dt> <b>inout</b>
|
|---|
| 1324 | <dd>Expresses the combinational outputs in terms of the
|
|---|
| 1325 | combinational inputs. This is the default partitioning method.
|
|---|
| 1326 |
|
|---|
| 1327 | <dt> <b>total</b>
|
|---|
| 1328 | <dd> The partition built is isomorphic to the combinational
|
|---|
| 1329 | part of the network. The function of each node is expressed in terms of its
|
|---|
| 1330 | immediate fanins.
|
|---|
| 1331 |
|
|---|
| 1332 | <dt> <b>frontier</b>
|
|---|
| 1333 | <dd> The partition built contains the combinational part of the
|
|---|
| 1334 | network as well as vertices corresponding to some intermediate
|
|---|
| 1335 | nodes. These vertices are generated to control the MDD sizes of the
|
|---|
| 1336 | combinational outputs. The number of intermediate variables can be
|
|---|
| 1337 | controlled by the parameter "partition_threshold". The method
|
|---|
| 1338 | "inout" and "total" are special cases of this method (corresponding
|
|---|
| 1339 | to a partition_threshold of infinity and 0 respectively).
|
|---|
| 1340 |
|
|---|
| 1341 | </dl>
|
|---|
| 1342 | </dl>
|
|---|
| 1343 | <dl><dt> <b>partition_threshold</b>
|
|---|
| 1344 | <dd> This parameter is used in
|
|---|
| 1345 | conjuction with the selection of "frontier" as partition method. This
|
|---|
| 1346 | determines the threshold at which a new MDD variable is created in
|
|---|
| 1347 | the partition.
|
|---|
| 1348 | </dl>
|
|---|
| 1349 |
|
|---|
| 1350 | Image computation makes use of following settings:
|
|---|
| 1351 |
|
|---|
| 1352 | <dl>
|
|---|
| 1353 | <dt><b>image_method</b>
|
|---|
| 1354 | <dd> The "image_method" parameter is used to control the image method used
|
|---|
| 1355 | in various symbolic analysis techniques. Currently, two image methods are
|
|---|
| 1356 | implemented. Use "set image_method <method>" to choose the appropriate
|
|---|
| 1357 | method.
|
|---|
| 1358 |
|
|---|
| 1359 | <dl>
|
|---|
| 1360 | <dt><b>monolithic</b>
|
|---|
| 1361 | <dd> This is the most naive approach possible. However, this method is not
|
|---|
| 1362 | suitable for circuits with more than 20 latches.
|
|---|
| 1363 |
|
|---|
| 1364 | <dt><b>tfm</b>
|
|---|
| 1365 | <dd> This is the pure transition function method. This method is supposed
|
|---|
| 1366 | not to be used in general fixpoint computations. Approximate traversal is
|
|---|
| 1367 | an application of this method. Basically this method is made as a part of
|
|---|
| 1368 | hybrid method. For more detailed options, see the help of
|
|---|
| 1369 | print_tfm_options command.
|
|---|
| 1370 |
|
|---|
| 1371 | <dt><b>hybrid</b>
|
|---|
| 1372 | <dd> This is a hybrid method combining transition relation and function
|
|---|
| 1373 | methods. Transition relation method is based on conjunction of partitioned
|
|---|
| 1374 | transition relation, whereas transition function method is based on
|
|---|
| 1375 | splitting on an input or output variable recursively. The hybrid method
|
|---|
| 1376 | choose either splitting or conjunction at each recursion dynamically using
|
|---|
| 1377 | the dependence matrix. For details, refer to the paper "To split or to
|
|---|
| 1378 | Conjoin: The Question in Image Computation" by In-Ho Moon, James Kukula,
|
|---|
| 1379 | Kavita Ravi, and Fabio Somenzi, DAC'00. Also for more detailed options,
|
|---|
| 1380 | see the help of print_hybrid_options command.
|
|---|
| 1381 |
|
|---|
| 1382 | <dt><b>iwls95</b>
|
|---|
| 1383 | <dd> This technique is based on the early variable quantification and
|
|---|
| 1384 | related heuristics of Ranjan, et al. "Efficient BDD Algorithms for FSM
|
|---|
| 1385 | Synthesis and Verification", IWLS 1995. First, from the given multivalued
|
|---|
| 1386 | functions, bit level relations are created. These relations are then
|
|---|
| 1387 | clustered based on the value of threshold value controlled by
|
|---|
| 1388 | <b>image_cluster_size</b> parameter. Next the relations are ordered for
|
|---|
| 1389 | early variable quantification. This ordering is controlled by the
|
|---|
| 1390 | parameters <b>image_W1, image_W2, image_W3,</b> and <b>image_W4</b>.
|
|---|
| 1391 |
|
|---|
| 1392 | <dt><b>mlp</b>
|
|---|
| 1393 | <dd> This technique is based on minimizing the variable lifetime
|
|---|
| 1394 | in the conjunctions of the partitioned transition relation. The
|
|---|
| 1395 | method is called MLP (Minimal Lifetime Permutation). For details,
|
|---|
| 1396 | refer to the paper "Border-Block Triangular Form and Conjunction Schedule
|
|---|
| 1397 | in Image Computation" by In-Ho Moon, Gary Hachtel, and Fabio Somenzi,
|
|---|
| 1398 | FMCAD'00. Also for more detailed options, see the help of
|
|---|
| 1399 | print_mlp_options command.
|
|---|
| 1400 | </dl>
|
|---|
| 1401 |
|
|---|
| 1402 |
|
|---|
| 1403 | <dt><b>image_farside_method</b>
|
|---|
| 1404 | <dd> This parameter is used in conjunction with the selection of
|
|---|
| 1405 | <b>iwls95</b>, <b>mlp</b>, or <b>linear</b> as the
|
|---|
| 1406 | <b>image_method</b>. When the value is 1, the compositional far
|
|---|
| 1407 | side image computation approach is enabled; when the value is 0,
|
|---|
| 1408 | this feature is disabled (default).
|
|---|
| 1409 |
|
|---|
| 1410 | <dt><b>image_cluster_size</b>
|
|---|
| 1411 | <dd> This parameter is used in conjunction with the selection of
|
|---|
| 1412 | <b>iwls95</b> as the <b>image_method</b>. The value of this parameter is
|
|---|
| 1413 | used as threshold value for creating clusters. The default value of this
|
|---|
| 1414 | parameter is 5000 which has been empirically proved to be an optimal value.
|
|---|
| 1415 |
|
|---|
| 1416 | <dt><b>image_W1, image_W2, image_W3, image_W4</b>
|
|---|
| 1417 | <dd> These parameters are used in conjunction with the selection of
|
|---|
| 1418 | <b>iwls95</b> as the <b>image_method</b>. They control the weights
|
|---|
| 1419 | associated with various factors in ordering the clusters. The default values
|
|---|
| 1420 | are 6, 1, 1, and 2 respectively. For a detailed description of these
|
|---|
| 1421 | parameters, please refer to the paper in IWLS'95 proceedings.
|
|---|
| 1422 |
|
|---|
| 1423 | <dt><b>image_verbosity</b>
|
|---|
| 1424 | <dd> Sets the verbosity mode (0 minimum to 4 maximum), for the image method
|
|---|
| 1425 | <b>iwls95</b>.<p>
|
|---|
| 1426 |
|
|---|
| 1427 | <dt>image_minimize_method <method>
|
|---|
| 1428 | <dd> Sets a minimization method to minimize the transition relation or an
|
|---|
| 1429 | image/preimage computaion with a set of dont-care states. <p>
|
|---|
| 1430 | Methods:
|
|---|
| 1431 | <code> 0 </code>: restrict (default). <p>
|
|---|
| 1432 | <code> 1 </code>: constrain <p>
|
|---|
| 1433 | <code> 2 </code>: compact (currently supported by only CUDD) <p>
|
|---|
| 1434 | <code> 3 </code>: squeeze (currently supported by only CUDD) <p>
|
|---|
| 1435 |
|
|---|
| 1436 | <dt>scc_method <method>
|
|---|
| 1437 | <dd> Sets the symbolic method to enumerate strongly connected components
|
|---|
| 1438 | (SCCs). Symbolic SCC enumeration is the core computation in LTL and
|
|---|
| 1439 | fair-CTL model checking.
|
|---|
| 1440 | <p> Methods: <code> lockstep </code>: the O(nlogn) time LockStep
|
|---|
| 1441 | algorithm (default).
|
|---|
| 1442 | <p> Methods: <code> linearstep </code>: the linear time symbolic
|
|---|
| 1443 | algorithm (default).
|
|---|
| 1444 |
|
|---|
| 1445 | </dl> ]
|
|---|
| 1446 |
|
|---|
| 1447 | SideEffects []
|
|---|
| 1448 |
|
|---|
| 1449 | SeeAlso [unset]
|
|---|
| 1450 |
|
|---|
| 1451 | ******************************************************************************/
|
|---|
| 1452 | static int
|
|---|
| 1453 | CommandSetVariable(
|
|---|
| 1454 | Hrc_Manager_t ** hmgr,
|
|---|
| 1455 | int argc,
|
|---|
| 1456 | char ** argv)
|
|---|
| 1457 | {
|
|---|
| 1458 | char *flag_value, *key, *value;
|
|---|
| 1459 | avl_generator *gen;
|
|---|
| 1460 | int c;
|
|---|
| 1461 |
|
|---|
| 1462 | util_getopt_reset();
|
|---|
| 1463 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 1464 | switch(c) {
|
|---|
| 1465 | case 'h':
|
|---|
| 1466 | goto usage;
|
|---|
| 1467 | default:
|
|---|
| 1468 | goto usage;
|
|---|
| 1469 | }
|
|---|
| 1470 | }
|
|---|
| 1471 | if (argc == 0 || argc > 3) {
|
|---|
| 1472 | goto usage ;
|
|---|
| 1473 | }
|
|---|
| 1474 | else if (argc == 1) {
|
|---|
| 1475 | avl_foreach_item(cmdFlagTable, gen, AVL_FORWARD, &key, &value) {
|
|---|
| 1476 | (void) fprintf(vis_stdout, "%s\t%s\n", key, value);
|
|---|
| 1477 | }
|
|---|
| 1478 | return 0;
|
|---|
| 1479 | }
|
|---|
| 1480 | else {
|
|---|
| 1481 | key = argv[1];
|
|---|
| 1482 | if (avl_delete(cmdFlagTable, &key, &value)) {
|
|---|
| 1483 | FREE(key);
|
|---|
| 1484 | FREE(value);
|
|---|
| 1485 | }
|
|---|
| 1486 |
|
|---|
| 1487 | flag_value = argc == 2 ? util_strsav("") : util_strsav(argv[2]);
|
|---|
| 1488 |
|
|---|
| 1489 | (void) avl_insert(cmdFlagTable, util_strsav(argv[1]), flag_value);
|
|---|
| 1490 |
|
|---|
| 1491 | if (strcmp(argv[1], "vis_stdout") == 0) {
|
|---|
| 1492 | if (vis_stdout != stdout) {
|
|---|
| 1493 | (void) fclose(vis_stdout);
|
|---|
| 1494 | }
|
|---|
| 1495 | if (strcmp(flag_value, "") == 0) {
|
|---|
| 1496 | flag_value = "-";
|
|---|
| 1497 | }
|
|---|
| 1498 | vis_stdout = Cmd_FileOpen(flag_value, "w", NIL(char *), 0);
|
|---|
| 1499 | if (vis_stdout == NULL) {
|
|---|
| 1500 | vis_stdout = stdout;
|
|---|
| 1501 | }
|
|---|
| 1502 | #if HAVE_SETVBUF
|
|---|
| 1503 | setvbuf(vis_stdout, (char *)NULL, _IOLBF, 0);
|
|---|
| 1504 | #endif
|
|---|
| 1505 | }
|
|---|
| 1506 | if (strcmp(argv[1], "vis_stderr") == 0) {
|
|---|
| 1507 | if (vis_stderr != stderr) {
|
|---|
| 1508 | (void) fclose(vis_stderr);
|
|---|
| 1509 | }
|
|---|
| 1510 | if (strcmp(flag_value, "") == 0) {
|
|---|
| 1511 | flag_value = "-";
|
|---|
| 1512 | }
|
|---|
| 1513 | vis_stderr = Cmd_FileOpen(flag_value, "w", NIL(char *), 0);
|
|---|
| 1514 | if (vis_stderr == NULL) {
|
|---|
| 1515 | vis_stderr = stderr;
|
|---|
| 1516 | }
|
|---|
| 1517 | #if HAVE_SETVBUF
|
|---|
| 1518 | setvbuf(vis_stderr, (char *)NULL, _IOLBF, 0);
|
|---|
| 1519 | #endif
|
|---|
| 1520 | }
|
|---|
| 1521 | if (strcmp(argv[1], "history") == 0) {
|
|---|
| 1522 | if (vis_historyFile != NIL(FILE)) {
|
|---|
| 1523 | (void) fclose(vis_historyFile);
|
|---|
| 1524 | }
|
|---|
| 1525 | if (strcmp(flag_value, "") == 0) {
|
|---|
| 1526 | vis_historyFile = NIL(FILE);
|
|---|
| 1527 | }
|
|---|
| 1528 | else {
|
|---|
| 1529 | vis_historyFile = Cmd_FileOpen(flag_value, "w", NIL(char *), 0);
|
|---|
| 1530 | if (vis_historyFile == NULL) {
|
|---|
| 1531 | vis_historyFile = NIL(FILE);
|
|---|
| 1532 | }
|
|---|
| 1533 | }
|
|---|
| 1534 | }
|
|---|
| 1535 | return 0;
|
|---|
| 1536 | }
|
|---|
| 1537 |
|
|---|
| 1538 | usage:
|
|---|
| 1539 | (void) printf("usage: set [-h] [name] [value]\n");
|
|---|
| 1540 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1541 | return 1;
|
|---|
| 1542 |
|
|---|
| 1543 | }
|
|---|
| 1544 |
|
|---|
| 1545 |
|
|---|
| 1546 | /**Function********************************************************************
|
|---|
| 1547 |
|
|---|
| 1548 | Synopsis [Implements the unset command.]
|
|---|
| 1549 |
|
|---|
| 1550 | CommandName [unset]
|
|---|
| 1551 |
|
|---|
| 1552 | CommandSynopsis [unset an environment variable]
|
|---|
| 1553 |
|
|---|
| 1554 | CommandArguments [\[-h\] <variables>]
|
|---|
| 1555 |
|
|---|
| 1556 | CommandDescription [ A variable environment is maintained by the command
|
|---|
| 1557 | interpreter.
|
|---|
| 1558 | The "set" command sets a variable to a particular value, and the
|
|---|
| 1559 | "unset" command removes the definition of a variable. <p>
|
|---|
| 1560 | Command options:<p>
|
|---|
| 1561 | </dl>
|
|---|
| 1562 | <dl><dt> -h
|
|---|
| 1563 | <dd> Print the command usage.
|
|---|
| 1564 | </dl>
|
|---|
| 1565 | <dl><dt> <variables>
|
|---|
| 1566 | <dd> Variables to be unset
|
|---|
| 1567 | </dl>
|
|---|
| 1568 | ]
|
|---|
| 1569 |
|
|---|
| 1570 | SideEffects []
|
|---|
| 1571 |
|
|---|
| 1572 | SeeAlso [set]
|
|---|
| 1573 |
|
|---|
| 1574 | ******************************************************************************/
|
|---|
| 1575 | static int
|
|---|
| 1576 | CommandUnsetVariable(
|
|---|
| 1577 | Hrc_Manager_t ** hmgr,
|
|---|
| 1578 | int argc,
|
|---|
| 1579 | char ** argv)
|
|---|
| 1580 | {
|
|---|
| 1581 | int i;
|
|---|
| 1582 | char *key, *value;
|
|---|
| 1583 | int c;
|
|---|
| 1584 |
|
|---|
| 1585 | util_getopt_reset();
|
|---|
| 1586 | while ((c = util_getopt(argc, argv, "h")) != EOF) {
|
|---|
| 1587 | switch(c) {
|
|---|
| 1588 | case 'h':
|
|---|
| 1589 | goto usage;
|
|---|
| 1590 | default:
|
|---|
| 1591 | goto usage;
|
|---|
| 1592 | }
|
|---|
| 1593 | }
|
|---|
| 1594 |
|
|---|
| 1595 | if (argc < 2) {
|
|---|
| 1596 | goto usage;
|
|---|
| 1597 | }
|
|---|
| 1598 |
|
|---|
| 1599 | for(i = 1; i < argc; i++) {
|
|---|
| 1600 | key = argv[i];
|
|---|
| 1601 | if (avl_delete(cmdFlagTable, &key, &value)) {
|
|---|
| 1602 | FREE(key);
|
|---|
| 1603 | FREE(value);
|
|---|
| 1604 | }
|
|---|
| 1605 | }
|
|---|
| 1606 | return 0;
|
|---|
| 1607 |
|
|---|
| 1608 |
|
|---|
| 1609 | usage:
|
|---|
| 1610 | (void) fprintf(vis_stderr, "usage: unset [-h] variables \n");
|
|---|
| 1611 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1612 | return 1;
|
|---|
| 1613 | }
|
|---|
| 1614 |
|
|---|
| 1615 | /**Function********************************************************************
|
|---|
| 1616 |
|
|---|
| 1617 | Synopsis [Implements the help command.]
|
|---|
| 1618 |
|
|---|
| 1619 | CommandName [help]
|
|---|
| 1620 |
|
|---|
| 1621 | CommandSynopsis [provide on-line information on commands]
|
|---|
| 1622 |
|
|---|
| 1623 | CommandArguments [\[-a\] \[-h\] \[<command>\]]
|
|---|
| 1624 |
|
|---|
| 1625 | CommandDescription [Given no arguments, "help" prints a list of all commands
|
|---|
| 1626 | known to the command interpreter.
|
|---|
| 1627 | If a command name is given, detailed information for that command will be
|
|---|
| 1628 | provided.<p>
|
|---|
| 1629 |
|
|---|
| 1630 | Command options:<p>
|
|---|
| 1631 | <dl><dt> -a
|
|---|
| 1632 | <dd> Provides a list of all internal commands, which by convention begin with an underscore.
|
|---|
| 1633 | </dl>
|
|---|
| 1634 | <dl><dt> -h
|
|---|
| 1635 | <dd> Print the command usage.
|
|---|
| 1636 | </dl>]
|
|---|
| 1637 |
|
|---|
| 1638 | SideEffects []
|
|---|
| 1639 |
|
|---|
| 1640 | ******************************************************************************/
|
|---|
| 1641 | static int
|
|---|
| 1642 | CommandHelp(
|
|---|
| 1643 | Hrc_Manager_t ** hmgr,
|
|---|
| 1644 | int argc,
|
|---|
| 1645 | char ** argv)
|
|---|
| 1646 | {
|
|---|
| 1647 | int c, i, all;
|
|---|
| 1648 | char *key;
|
|---|
| 1649 | avl_generator *gen;
|
|---|
| 1650 | char buffer[1024];
|
|---|
| 1651 | char *command;
|
|---|
| 1652 | char *lib_name;
|
|---|
| 1653 | #if HAVE_GETENV
|
|---|
| 1654 | char *pager;
|
|---|
| 1655 | #endif
|
|---|
| 1656 |
|
|---|
| 1657 |
|
|---|
| 1658 | util_getopt_reset();
|
|---|
| 1659 | all = 0;
|
|---|
| 1660 | while ((c = util_getopt(argc, argv, "ah")) != EOF) {
|
|---|
| 1661 | switch(c) {
|
|---|
| 1662 | case 'a':
|
|---|
| 1663 | all = 1;
|
|---|
| 1664 | break;
|
|---|
| 1665 | case 'h':
|
|---|
| 1666 | goto usage;
|
|---|
| 1667 | default:
|
|---|
| 1668 | goto usage;
|
|---|
| 1669 | }
|
|---|
| 1670 | }
|
|---|
| 1671 |
|
|---|
| 1672 | if (argc - util_optind == 0) {
|
|---|
| 1673 | fprintf(vis_stderr,"List of commands:\n");
|
|---|
| 1674 | i = 0;
|
|---|
| 1675 | avl_foreach_item(cmdCommandTable, gen, AVL_FORWARD, &key, NIL(char *)) {
|
|---|
| 1676 | if ((key[0] == '_') == all) {
|
|---|
| 1677 | (void) fprintf(vis_stdout, "%-26s", key);
|
|---|
| 1678 | if ((++i%3) == 0) {
|
|---|
| 1679 | (void) fprintf(vis_stdout, "\n");
|
|---|
| 1680 | }
|
|---|
| 1681 | }
|
|---|
| 1682 | }
|
|---|
| 1683 | if ((i%3) != 0) {
|
|---|
| 1684 | (void) fprintf(vis_stdout, "\n");
|
|---|
| 1685 | }
|
|---|
| 1686 | }
|
|---|
| 1687 | else if (argc - util_optind == 1) {
|
|---|
| 1688 | command = command_alias_help(argv[util_optind]);
|
|---|
| 1689 | lib_name = Vm_VisObtainLibrary();
|
|---|
| 1690 | #if HAVE_GETENV
|
|---|
| 1691 | pager = getenv("PAGER");
|
|---|
| 1692 | if (pager != NULL) {
|
|---|
| 1693 | (void) sprintf(buffer, "%s %s/help/%sCmd.txt", pager, lib_name, command);
|
|---|
| 1694 | } else {
|
|---|
| 1695 | (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command);
|
|---|
| 1696 | }
|
|---|
| 1697 | #else
|
|---|
| 1698 | (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command);
|
|---|
| 1699 | #endif
|
|---|
| 1700 | (void) system(buffer);
|
|---|
| 1701 | FREE(lib_name);
|
|---|
| 1702 | }
|
|---|
| 1703 | else {
|
|---|
| 1704 | goto usage;
|
|---|
| 1705 | }
|
|---|
| 1706 |
|
|---|
| 1707 | return 0;
|
|---|
| 1708 |
|
|---|
| 1709 | usage:
|
|---|
| 1710 | (void) fprintf(vis_stderr, "usage: help [-a] [-h] [command]\n");
|
|---|
| 1711 | (void) fprintf(vis_stderr, " -a \t\tprint help for all commands\n");
|
|---|
| 1712 | (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n");
|
|---|
| 1713 |
|
|---|
| 1714 | return 1;
|
|---|
| 1715 | }
|
|---|
| 1716 |
|
|---|
| 1717 | #if 0
|
|---|
| 1718 | Change "/*!*Function" to "/**Function" when reactivate command
|
|---|
| 1719 | /*!*Function********************************************************************
|
|---|
| 1720 |
|
|---|
| 1721 | Synopsis [Implements the undo command.]
|
|---|
| 1722 |
|
|---|
| 1723 | CommandName [undo]
|
|---|
| 1724 |
|
|---|
| 1725 | CommandSynopsis [undo the result of the last command which changed the network]
|
|---|
| 1726 |
|
|---|
| 1727 | CommandDescription [ A simple 1-level undo is supported.
|
|---|
| 1728 | It reverts the network to its state before the last command which
|
|---|
| 1729 | changed the network. Note that interrupting a command (with ^C)
|
|---|
| 1730 | which changes the network uses up the one level of undo.<p> ]
|
|---|
| 1731 |
|
|---|
| 1732 | SideEffects []
|
|---|
| 1733 |
|
|---|
| 1734 | ******************************************************************************/
|
|---|
| 1735 | static int
|
|---|
| 1736 | CommandUndo(
|
|---|
| 1737 | Hrc_Manager_t ** hmgr,
|
|---|
| 1738 | int argc,
|
|---|
| 1739 | char ** argv)
|
|---|
| 1740 | {
|
|---|
| 1741 | if (argc != 1) {
|
|---|
| 1742 | (void) fprintf(vis_stderr, "usage: undo\n");
|
|---|
| 1743 | return 1;
|
|---|
| 1744 | }
|
|---|
| 1745 |
|
|---|
| 1746 | (void) fprintf(vis_stderr, "** cmd error: undo: not yet implemented\n");
|
|---|
| 1747 | return 1;
|
|---|
| 1748 |
|
|---|
| 1749 | #if 0
|
|---|
| 1750 |
|
|---|
| 1751 | /*
|
|---|
| 1752 | * FIX (Tom): can't enable "undo" until network_dup and hmgr_dup exist.
|
|---|
| 1753 | */
|
|---|
| 1754 | if (cmdBackupHmgr == NIL(Hrc_Manager_t)) {
|
|---|
| 1755 | (void) fprintf(vis_stderr, "undo: no hmgr currently saved\n");
|
|---|
| 1756 | return 1;
|
|---|
| 1757 | }
|
|---|
| 1758 | else {
|
|---|
| 1759 |
|
|---|
| 1760 | /* Swap the current and backup. */
|
|---|
| 1761 | Hrc_Manager_t *temp = *hmgr;
|
|---|
| 1762 | *hmgr = cmdBackupHmgr;
|
|---|
| 1763 | cmdBackupHmgr = temp;
|
|---|
| 1764 | return 0;
|
|---|
| 1765 | }
|
|---|
| 1766 | #endif
|
|---|
| 1767 | }
|
|---|
| 1768 | #endif
|
|---|
| 1769 |
|
|---|
| 1770 |
|
|---|
| 1771 |
|
|---|
| 1772 | /**Function********************************************************************
|
|---|
| 1773 |
|
|---|
| 1774 | Synopsis [Implements the source command.]
|
|---|
| 1775 |
|
|---|
| 1776 | CommandName [source]
|
|---|
| 1777 |
|
|---|
| 1778 | CommandSynopsis [execute commands from a file]
|
|---|
| 1779 |
|
|---|
| 1780 | CommandArguments [\[-h\] \[-p\] \[-s\] \[-x\] <file> \[<args>\]]
|
|---|
| 1781 |
|
|---|
| 1782 | CommandDescription [Reads and executes commands from a file.<p>
|
|---|
| 1783 | Command options:<p>
|
|---|
| 1784 | <dl><dt> -h
|
|---|
| 1785 | <dd> Print the command usage.
|
|---|
| 1786 | </dl>
|
|---|
| 1787 | <dl><dt> -p
|
|---|
| 1788 | <dd> Print a prompt before reading each command.
|
|---|
| 1789 | </dl>
|
|---|
| 1790 | <dl><dt> -s
|
|---|
| 1791 | <dd> Silently
|
|---|
| 1792 | ignore an attempt to execute commands from a nonexistent file.
|
|---|
| 1793 | </dl>
|
|---|
| 1794 | <dl><dt> -x
|
|---|
| 1795 | <dd> Echo each command before it is executed.
|
|---|
| 1796 | </dl>
|
|---|
| 1797 | <dl><dt> <file>
|
|---|
| 1798 | <dd> File name
|
|---|
| 1799 | </dl>
|
|---|
| 1800 |
|
|---|
| 1801 | Arguments on the command line after the filename are remembered but not
|
|---|
| 1802 | evaluated. Commands in the script file can then refer to these arguments
|
|---|
| 1803 | using the history substitution mechanism.<p>
|
|---|
| 1804 |
|
|---|
| 1805 | EXAMPLE:<p>
|
|---|
| 1806 |
|
|---|
| 1807 | Contents of test.scr:<p>
|
|---|
| 1808 |
|
|---|
| 1809 | <pre>
|
|---|
| 1810 | read_blif_mv %:2
|
|---|
| 1811 | init_verify
|
|---|
| 1812 | simulate -n 10
|
|---|
| 1813 | </pre>
|
|---|
| 1814 |
|
|---|
| 1815 | Typing "source test.scr lion.mv" on the command line will execute the
|
|---|
| 1816 | sequence<p>
|
|---|
| 1817 |
|
|---|
| 1818 | <pre>
|
|---|
| 1819 | read_blif_mv lion.mv
|
|---|
| 1820 | init_verify
|
|---|
| 1821 | simulate -n 10
|
|---|
| 1822 | </pre>
|
|---|
| 1823 |
|
|---|
| 1824 | (In this case <code>%:0</code> gets "source", <code>%:1</code> gets
|
|---|
| 1825 | "test.scr", and <code>%:2</code> gets "lion.mv".)
|
|---|
| 1826 | If you type "alias st source test.scr" and then type "st lion.blif bozo",
|
|---|
| 1827 | you will execute<p>
|
|---|
| 1828 |
|
|---|
| 1829 | <pre>
|
|---|
| 1830 | read_blif_mv bozo
|
|---|
| 1831 | init_verify
|
|---|
| 1832 | simulate -n 10
|
|---|
| 1833 | </pre>
|
|---|
| 1834 |
|
|---|
| 1835 | because "bozo" was the second argument on the last command line typed. In
|
|---|
| 1836 | other words, command substitution in a script file depends on how the script
|
|---|
| 1837 | file was invoked. Switches passed to a command are also counted as
|
|---|
| 1838 | positional parameters. Therefore, if you type "st -x lion.mv bozo",
|
|---|
| 1839 | you will execute
|
|---|
| 1840 |
|
|---|
| 1841 | <pre>
|
|---|
| 1842 | read_blif_mv lion.mv
|
|---|
| 1843 | init_verify
|
|---|
| 1844 | simulate -n 10
|
|---|
| 1845 | </pre>
|
|---|
| 1846 |
|
|---|
| 1847 | To pass the "-x" switch (or any other switch) to "source" when the
|
|---|
| 1848 | script uses positional parameters, you can define an alias. For
|
|---|
| 1849 | instance, "alias srcx source -x".<p>
|
|---|
| 1850 |
|
|---|
| 1851 |
|
|---|
| 1852 | ]
|
|---|
| 1853 |
|
|---|
| 1854 | SideEffects [required]
|
|---|
| 1855 |
|
|---|
| 1856 | SeeAlso [history]
|
|---|
| 1857 |
|
|---|
| 1858 | ******************************************************************************/
|
|---|
| 1859 | static int
|
|---|
| 1860 | CommandSource(
|
|---|
| 1861 | Hrc_Manager_t ** hmgr,
|
|---|
| 1862 | int argc,
|
|---|
| 1863 | char ** argv)
|
|---|
| 1864 | {
|
|---|
| 1865 | int c, echo, prompt, silent, interactive, quit_count, lp_count;
|
|---|
| 1866 | int status = 0; /* initialize so that lint doesn't complain */
|
|---|
| 1867 | int lp_file_index, did_subst;
|
|---|
| 1868 | char *prompt_string, *real_filename, line[MAX_STR], *command;
|
|---|
| 1869 | FILE *fp;
|
|---|
| 1870 |
|
|---|
| 1871 | interactive = silent = prompt = echo = 0;
|
|---|
| 1872 |
|
|---|
| 1873 | util_getopt_reset();
|
|---|
| 1874 | while ((c = util_getopt(argc, argv, "hipsx")) != EOF) {
|
|---|
| 1875 | switch(c) {
|
|---|
| 1876 | case 'h':
|
|---|
| 1877 | goto usage ;
|
|---|
| 1878 | case 'i': /* a hack to distinguish EOF from stdin */
|
|---|
| 1879 | interactive = 1;
|
|---|
| 1880 | break;
|
|---|
| 1881 | case 'p':
|
|---|
| 1882 | prompt = 1;
|
|---|
| 1883 | break;
|
|---|
| 1884 | case 's':
|
|---|
| 1885 | silent = 1;
|
|---|
| 1886 | break;
|
|---|
| 1887 | case 'x':
|
|---|
| 1888 | echo = 1;
|
|---|
| 1889 | break;
|
|---|
| 1890 | default:
|
|---|
| 1891 | goto usage;
|
|---|
| 1892 | }
|
|---|
| 1893 | }
|
|---|
| 1894 |
|
|---|
| 1895 | /* added to avoid core-dumping when no script file is specified */
|
|---|
| 1896 | if (argc == util_optind){
|
|---|
| 1897 | goto usage;
|
|---|
| 1898 | }
|
|---|
| 1899 |
|
|---|
| 1900 | lp_file_index = util_optind;
|
|---|
| 1901 | lp_count = 0;
|
|---|
| 1902 |
|
|---|
| 1903 | /*
|
|---|
| 1904 | * FIX (Tom, 5/7/95): I'm not sure what the purpose of this outer do loop
|
|---|
| 1905 | * is. In particular, lp_file_index is never modified in the loop, so it
|
|---|
| 1906 | * looks it would just read the same file over again. Also, SIS had
|
|---|
| 1907 | * lp_count initialized to -1, and hence, any file sourced by SIS (if -l or
|
|---|
| 1908 | * -t options on "source" were used in SIS) would actually be executed
|
|---|
| 1909 | * twice.
|
|---|
| 1910 | */
|
|---|
| 1911 | do {
|
|---|
| 1912 | lp_count ++; /* increment the loop counter */
|
|---|
| 1913 |
|
|---|
| 1914 | fp = Cmd_FileOpen(argv[lp_file_index], "r", &real_filename, silent);
|
|---|
| 1915 | if (fp == NULL) {
|
|---|
| 1916 | FREE(real_filename);
|
|---|
| 1917 | return ! silent; /* error return if not silent */
|
|---|
| 1918 | }
|
|---|
| 1919 |
|
|---|
| 1920 | quit_count = 0;
|
|---|
| 1921 | do {
|
|---|
| 1922 | if (prompt) {
|
|---|
| 1923 | prompt_string = Cmd_FlagReadByName("prompt");
|
|---|
| 1924 | if (prompt_string == NIL(char)) {
|
|---|
| 1925 | prompt_string = "vis> ";
|
|---|
| 1926 | }
|
|---|
| 1927 |
|
|---|
| 1928 | }
|
|---|
| 1929 | else {
|
|---|
| 1930 | prompt_string = NIL(char);
|
|---|
| 1931 | }
|
|---|
| 1932 |
|
|---|
| 1933 | /* clear errors -- e.g., EOF reached from stdin */
|
|---|
| 1934 | clearerr(fp);
|
|---|
| 1935 |
|
|---|
| 1936 | /* read another command line */
|
|---|
| 1937 | if (CmdFgetsFilec(line, MAX_STR, fp, prompt_string) == NULL) {
|
|---|
| 1938 | if (interactive) {
|
|---|
| 1939 | if (quit_count++ < 5) {
|
|---|
| 1940 | (void) fprintf(vis_stderr, "\nUse \"quit\" to leave VIS.\n");
|
|---|
| 1941 | continue;
|
|---|
| 1942 | }
|
|---|
| 1943 | status = -1; /* fake a 'quit' */
|
|---|
| 1944 | }
|
|---|
| 1945 | else {
|
|---|
| 1946 | status = 0; /* successful end of 'source' ; loop? */
|
|---|
| 1947 | }
|
|---|
| 1948 | break;
|
|---|
| 1949 | }
|
|---|
| 1950 | quit_count = 0;
|
|---|
| 1951 |
|
|---|
| 1952 | if (echo) {
|
|---|
| 1953 | (void) fprintf(vis_stdout, "%s", line);
|
|---|
| 1954 | }
|
|---|
| 1955 | command = CmdHistorySubstitution(line, &did_subst);
|
|---|
| 1956 | if (command == NIL(char)) {
|
|---|
| 1957 | status = 1;
|
|---|
| 1958 | break;
|
|---|
| 1959 | }
|
|---|
| 1960 | if (did_subst) {
|
|---|
| 1961 | if (interactive) {
|
|---|
| 1962 | (void) fprintf(stdout, "%s\n", command);
|
|---|
| 1963 | }
|
|---|
| 1964 | }
|
|---|
| 1965 | if (command != line) {
|
|---|
| 1966 | (void) strcpy(line, command);
|
|---|
| 1967 | }
|
|---|
| 1968 | if (interactive && *line != '\0') {
|
|---|
| 1969 | array_insert_last(char *, vm_commandHistoryArray, util_strsav(line));
|
|---|
| 1970 | if (vis_historyFile != NIL(FILE)) {
|
|---|
| 1971 | (void) fprintf(vis_historyFile, "%s\n", line);
|
|---|
| 1972 | (void) fflush(vis_historyFile);
|
|---|
| 1973 | }
|
|---|
| 1974 | }
|
|---|
| 1975 |
|
|---|
| 1976 | status = Cmd_CommandExecute(hmgr, line);
|
|---|
| 1977 | } while (status == 0);
|
|---|
| 1978 |
|
|---|
| 1979 | if (fp != stdin) {
|
|---|
| 1980 | if (status > 0) {
|
|---|
| 1981 | (void) fprintf(vis_stderr, "** cmd error: aborting 'source %s'\n", real_filename);
|
|---|
| 1982 | }
|
|---|
| 1983 | (void) fclose(fp);
|
|---|
| 1984 | }
|
|---|
| 1985 | FREE(real_filename);
|
|---|
| 1986 |
|
|---|
| 1987 | } while ((status == 0) && (lp_count <= 0));
|
|---|
| 1988 |
|
|---|
| 1989 | return status;
|
|---|
| 1990 |
|
|---|
| 1991 | usage:
|
|---|
| 1992 | (void) fprintf(vis_stderr, "source [-h] [-p] [-s] [-x] file_name\n");
|
|---|
| 1993 | (void) fprintf(vis_stderr, "\t-h print the command usage\n");
|
|---|
| 1994 | (void) fprintf(vis_stderr, "\t-p supply prompt before reading each line\n");
|
|---|
| 1995 | (void) fprintf(vis_stderr, "\t-s silently ignore nonexistent file\n");
|
|---|
| 1996 | (void) fprintf(vis_stderr, "\t-x echo each line as it is executed\n");
|
|---|
| 1997 | return 1;
|
|---|
| 1998 | }
|
|---|
| 1999 |
|
|---|
| 2000 | /**Function********************************************************************
|
|---|
| 2001 |
|
|---|
| 2002 | Synopsis [required]
|
|---|
| 2003 |
|
|---|
| 2004 | Description [optional]
|
|---|
| 2005 |
|
|---|
| 2006 | SideEffects [required]
|
|---|
| 2007 |
|
|---|
| 2008 | SeeAlso [optional]
|
|---|
| 2009 |
|
|---|
| 2010 | ******************************************************************************/
|
|---|
| 2011 | static void
|
|---|
| 2012 | print_alias(
|
|---|
| 2013 | char * value)
|
|---|
| 2014 | {
|
|---|
| 2015 | int i;
|
|---|
| 2016 | CmdAliasDescr_t *alias;
|
|---|
| 2017 |
|
|---|
| 2018 | alias = (CmdAliasDescr_t *) value;
|
|---|
| 2019 | (void) fprintf(vis_stdout, "%s\t", alias->name);
|
|---|
| 2020 | for(i = 0; i < alias->argc; i++) {
|
|---|
| 2021 | (void) fprintf(vis_stdout, " %s", alias->argv[i]);
|
|---|
| 2022 | }
|
|---|
| 2023 | (void) fprintf(vis_stdout, "\n");
|
|---|
| 2024 | }
|
|---|
| 2025 |
|
|---|
| 2026 |
|
|---|
| 2027 | /**Function********************************************************************
|
|---|
| 2028 |
|
|---|
| 2029 | Synopsis [required]
|
|---|
| 2030 |
|
|---|
| 2031 | Description [optional]
|
|---|
| 2032 |
|
|---|
| 2033 | SideEffects [required]
|
|---|
| 2034 |
|
|---|
| 2035 | SeeAlso [optional]
|
|---|
| 2036 |
|
|---|
| 2037 | ******************************************************************************/
|
|---|
| 2038 | static char *
|
|---|
| 2039 | command_alias_help(
|
|---|
| 2040 | char * command)
|
|---|
| 2041 | {
|
|---|
| 2042 | char *value;
|
|---|
| 2043 | CmdAliasDescr_t *alias;
|
|---|
| 2044 |
|
|---|
| 2045 | if (!avl_lookup(cmdAliasTable, command, &value)) {
|
|---|
| 2046 | return command;
|
|---|
| 2047 | }
|
|---|
| 2048 | alias = (CmdAliasDescr_t *) value;
|
|---|
| 2049 | return alias->argv[0];
|
|---|
| 2050 | }
|
|---|
| 2051 |
|
|---|
| 2052 | /**Function********************************************************************
|
|---|
| 2053 |
|
|---|
| 2054 | Synopsis [Function to flush vis_stdout and vis_stderr.]
|
|---|
| 2055 |
|
|---|
| 2056 | Description [This function is the signal handler for the SIGUSR1
|
|---|
| 2057 | signal. Whenever that signal is received, this function is executed and the
|
|---|
| 2058 | output channels of VIS are flushed.]
|
|---|
| 2059 |
|
|---|
| 2060 | SideEffects []
|
|---|
| 2061 |
|
|---|
| 2062 | SeeAlso [Cmd_Init]
|
|---|
| 2063 |
|
|---|
| 2064 | ******************************************************************************/
|
|---|
| 2065 | static void
|
|---|
| 2066 | FlushBuffers(
|
|---|
| 2067 | int sigtype)
|
|---|
| 2068 | {
|
|---|
| 2069 | fflush(vis_stdout);
|
|---|
| 2070 | fflush(vis_stderr);
|
|---|
| 2071 |
|
|---|
| 2072 | /* Reprogram again the handler */
|
|---|
| 2073 | #ifdef SIGUSR1
|
|---|
| 2074 | (void) signal(SIGUSR1, FlushBuffers);
|
|---|
| 2075 | #endif
|
|---|
| 2076 | } /* End of FlushBuffers */
|
|---|