VIS
|
#include "cmdInt.h"
#include <errno.h>
Go to the source code of this file.
Defines | |
#define | MAX_STR 32768 |
Functions | |
static int | CommandTime (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandEcho (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandSetBddParameters (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandMemoryProfile (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandQuit (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandUsage (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandWhich (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandHistory (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandAlias (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandUnalias (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandSetVariable (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandUnsetVariable (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandHelp (Hrc_Manager_t **hmgr, int argc, char **argv) |
static int | CommandSource (Hrc_Manager_t **hmgr, int argc, char **argv) |
static void | print_alias (char *value) |
static char * | command_alias_help (char *command) |
static void | FlushBuffers (int sigtype) |
char * | Cmd_FlagReadByName (char *flag) |
void | Cmd_FlagUpdateValue (char *key, char *value) |
void | Cmd_FlagDeleteByName (char *key) |
void | Cmd_Init (void) |
void | Cmd_End (void) |
int | Cmd_StringCheckIsInteger (char *string, int *value) |
void | CmdFreeArgv (int argc, char **argv) |
void | CmdAliasFree (char *value) |
Variables | |
static char rcsid[] | UNUSED = "$Id: cmdMisc.c,v 1.59 2009/04/11 18:25:50 fabio Exp $" |
avl_tree * | cmdAliasTable |
avl_tree * | cmdFlagTable |
static boolean | fileCreated |
void Cmd_End | ( | void | ) |
Function********************************************************************
Synopsis [Ends the command package.]
Description [Ends the command package. Tables are freed, and the global error string is freed.]
SideEffects []
SeeAlso [Cmd_Init]
Definition at line 232 of file cmdMisc.c.
{ avl_free_table(cmdFlagTable, (void (*)(char *))free, (void (*)(char *))free); avl_free_table(cmdCommandTable, (void (*)(char *)) 0, CmdCommandFree); avl_free_table(cmdAliasTable, (void (*)(char *)) 0, CmdAliasFree); if (cmdBackupHmgr != NIL(Hrc_Manager_t)) { Hrc_ManagerFree(cmdBackupHmgr); } error_cleanup(); if (fileCreated == TRUE) { (void) fprintf(vis_stdout, "Purify has created a temporary file. The file"); (void) fprintf(vis_stdout, " must be deleted.\n"); } }
void Cmd_FlagDeleteByName | ( | char * | key | ) |
Function********************************************************************
Synopsis [Deletes a set value by calling instead of unset command.]
Description [Deletes a set value by calling instead of unset command.]
SideEffects []
Definition at line 152 of file cmdMisc.c.
{ char *value; if (!key) return; if (avl_delete(cmdFlagTable, &key, &value)) { FREE(key); FREE(value); } }
char* Cmd_FlagReadByName | ( | char * | flag | ) |
AutomaticEnd Function********************************************************************
Synopsis [Looks up value of flag in table of named values.]
Description [The command parser maintains a table of named values. These are manipulated using the 'set' and 'unset' commands. The value of the named flag is returned, or NIL(char) is returned if the flag has not been set.]
SideEffects []
Definition at line 99 of file cmdMisc.c.
{ char *value; if (avl_lookup(cmdFlagTable, flag, &value)) { return value; } else { return NIL(char); } }
void Cmd_FlagUpdateValue | ( | char * | key, |
char * | value | ||
) |
Function********************************************************************
Synopsis [Updates a set value by calling instead of set command.]
Description [Updates a set value by calling instead of set command.]
SideEffects []
Definition at line 123 of file cmdMisc.c.
{ char *oldValue, *newValue; if (!key) return; if (value) newValue = util_strsav(value); else newValue = util_strsav(""); if (avl_delete(cmdFlagTable, &key, &oldValue)) FREE(oldValue); (void) avl_insert(cmdFlagTable, key, newValue); }
void Cmd_Init | ( | void | ) |
Function********************************************************************
Synopsis [Initializes the command package.]
SideEffects [Commands are added to the command table.]
SeeAlso [Cmd_End]
Definition at line 177 of file cmdMisc.c.
{ char *path; char *lib_name; cmdCommandTable = avl_init_table((int(*)(const void *, const void *))strcmp); cmdFlagTable = avl_init_table((int(*)(const void *, const void *))strcmp); cmdAliasTable = avl_init_table((int(*)(const void *, const void *))strcmp); Cmd_CommandAdd("alias", CommandAlias, 0); Cmd_CommandAdd("echo", CommandEcho, 0); Cmd_CommandAdd("help", CommandHelp, 0); Cmd_CommandAdd("quit", CommandQuit, 0); Cmd_CommandAdd("source", CommandSource, 0); /* Cmd_CommandAdd("undo", CommandUndo, 0); */ Cmd_CommandAdd("set", CommandSetVariable, 0); Cmd_CommandAdd("unalias", CommandUnalias, 0); Cmd_CommandAdd("unset", CommandUnsetVariable, 0); Cmd_CommandAdd("time", CommandTime, 0); Cmd_CommandAdd("usage", CommandUsage, 0); Cmd_CommandAdd("history", CommandHistory, 0); Cmd_CommandAdd("which", CommandWhich, 0); Cmd_CommandAdd("set_bdd_parameters" , CommandSetBddParameters, 0); Cmd_CommandAdd("_memory_profile", CommandMemoryProfile, 0); fileCreated = FALSE; /* Program the signal of type USR1 to flush vis_stdout and vis_stderr */ #ifdef SIGUSR1 (void) signal(SIGUSR1, FlushBuffers); #endif /* set the default open_path */ lib_name = Vm_VisObtainLibrary(); path = ALLOC(char, strlen(lib_name) + 20); sprintf(path, "set open_path .:%s", lib_name); Cmd_CommandExecute(NULL, path); FREE(lib_name); FREE(path); }
int Cmd_StringCheckIsInteger | ( | char * | string, |
int * | value | ||
) |
Function********************************************************************
Synopsis [Test that the given string is an integer. Returns 0 if string is not an integer, 1 if the integer is too big for int, and 2 if integer fits in int.]
SideEffects [Sets the pointer value if the string is an integer small enough for int.]
Definition at line 260 of file cmdMisc.c.
{ char *ptr; long l; errno = 0 ; l = strtol (string, &ptr, 0) ; if(*ptr != '\0') return 0; if (errno != 0) return 1; if ((l > MAXINT) || (l < -1 - MAXINT)) return 1 ; *value = (int) l; return 2 ; }
void CmdAliasFree | ( | char * | value | ) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 320 of file cmdMisc.c.
{ CmdAliasDescr_t *alias = (CmdAliasDescr_t *) value; CmdFreeArgv(alias->argc, alias->argv); FREE(alias->name); /* same as key */ FREE(alias); }
void CmdFreeArgv | ( | int | argc, |
char ** | argv | ||
) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 297 of file cmdMisc.c.
{ int i; for(i = 0; i < argc; i++) { FREE(argv[i]); } FREE(argv); }
static char* command_alias_help | ( | char * | command | ) | [static] |
static int CommandAlias | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the alias command.]
CommandName [alias]
CommandSynopsis [provide an alias for a command]
CommandArguments [\[-h\] \[<name> \[<string>\]\]]
CommandDescription [The "alias" command, if given no arguments, will print the definition of all current aliases.
Given a single argument, it will print the definition of that alias (if any).
Given two arguments, the keyword "name" becomes an alias for the command string "string", replacing any other alias with the same name.
Command options:
It is possible to create aliases that take arguments by using the history substitution mechanism. To protect the history substitution character `' from immediate expansion, it must be preceded by a `\' when entering the alias.
For example:
vis> alias read read_\%:1 \%:2.\%:1 vis> read blif lion
will create an alias `read', execute "read_blif lion.blif".
And...
vis> alias echo2 "echo Hi ; echo \\%* !" vis> echo2 happy birthday
will print:
Hi happy birthday !
CAVEAT: Currently there is no check to see if there is a circular dependency in the alias definition. e.g.
vis> alias foo "print_network_stats; print_network; foo"
creates an alias which refers to itself. Executing the command "foo" will result an infinite loop during which the commands "print_network_stats" and "print_network" will be executed.
]
SideEffects []
SeeAlso [unalias]
Definition at line 1090 of file cmdMisc.c.
{ int i; char *key, *value; CmdAliasDescr_t *alias; avl_generator *gen; int status; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } if (argc == 1) { avl_foreach_item(cmdAliasTable, gen, AVL_FORWARD, &key, &value) { print_alias(value); } return 0; } else if (argc == 2) { if (avl_lookup(cmdAliasTable, argv[1], &value)) { print_alias(value); } return 0; } /* delete any existing alias */ key = argv[1]; if (avl_delete(cmdAliasTable, &key, &value)) { CmdAliasFree(value); } alias = ALLOC(CmdAliasDescr_t, 1); alias->name = util_strsav(argv[1]); alias->argc = argc - 2; alias->argv = ALLOC(char *, alias->argc); for(i = 2; i < argc; i++) { alias->argv[i-2] = util_strsav(argv[i]); } status = avl_insert(cmdAliasTable, alias->name, (char *) alias); assert(!status); /* error here in SIS version, TRS, 8/4/95 */ return 0; usage: (void) fprintf(vis_stderr, "usage: alias [-h] [command [string]]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return (1); }
static int CommandEcho | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the echo command.]
CommandName [echo] CommandSynopsis [merely echo the arguments] CommandArguments [\[-h\] <args>] CommandDescription [Echoes the arguments to standard output.
Command options:
]
SideEffects []
Definition at line 427 of file cmdMisc.c.
{ int i; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } for(i = 1; i < argc; i++) { (void) fprintf(vis_stdout, "%s ", argv[i]); } (void) fprintf(vis_stdout, "\n"); return 0; usage: (void) fprintf(vis_stderr, "usage: echo [-h] string \n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return (1); }
static int CommandHelp | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the help command.]
CommandName [help]
CommandSynopsis [provide on-line information on commands]
CommandArguments [\[-a\] \[-h\] \[<command>\]]
CommandDescription [Given no arguments, "help" prints a list of all commands known to the command interpreter. If a command name is given, detailed information for that command will be provided.
Command options:
]
SideEffects []
Definition at line 1642 of file cmdMisc.c.
{ int c, i, all; char *key; avl_generator *gen; char buffer[1024]; char *command; char *lib_name; #if HAVE_GETENV char *pager; #endif util_getopt_reset(); all = 0; while ((c = util_getopt(argc, argv, "ah")) != EOF) { switch(c) { case 'a': all = 1; break; case 'h': goto usage; default: goto usage; } } if (argc - util_optind == 0) { fprintf(vis_stderr,"List of commands:\n"); i = 0; avl_foreach_item(cmdCommandTable, gen, AVL_FORWARD, &key, NIL(char *)) { if ((key[0] == '_') == all) { (void) fprintf(vis_stdout, "%-26s", key); if ((++i%3) == 0) { (void) fprintf(vis_stdout, "\n"); } } } if ((i%3) != 0) { (void) fprintf(vis_stdout, "\n"); } } else if (argc - util_optind == 1) { command = command_alias_help(argv[util_optind]); lib_name = Vm_VisObtainLibrary(); #if HAVE_GETENV pager = getenv("PAGER"); if (pager != NULL) { (void) sprintf(buffer, "%s %s/help/%sCmd.txt", pager, lib_name, command); } else { (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command); } #else (void) sprintf(buffer, "more %s/help/%sCmd.txt", lib_name, command); #endif (void) system(buffer); FREE(lib_name); } else { goto usage; } return 0; usage: (void) fprintf(vis_stderr, "usage: help [-a] [-h] [command]\n"); (void) fprintf(vis_stderr, " -a \t\tprint help for all commands\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static int CommandHistory | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the history command.]
CommandName [history]
CommandSynopsis [list previous commands and their event numbers]
CommandArguments [\[-h\] \[<num>\]]
CommandDescription [Lists previous commands and their event numbers. This is a UNIX-like history mechanism inside the VIS shell.
Command options:
History Substitution:
The history substitution mechanism is a simpler version of the csh history substitution mechanism. It enables you to reuse words from previously typed commands.
The default history substitution character is the `' (`!' is default for shell escapes, and `#' marks the beginning of a comment). This can be changed using the "set" command. In this description '' is used as the history_char. The `' can appear anywhere in a line. A line containing a history substitution is echoed to the screen after the substitution takes place. `' can be preceded by a `\' in order to escape the substitution, for example, to enter a `' into an alias or to set the prompt.
Each valid line typed at the prompt is saved. If the "history" variable is set (see help page for "set"), each line is also echoed to the history file. You can use the "history" command to list the previously typed commands.
Substitutions:
At any point in a line these history substitutions are available.
]
SideEffects []
SeeAlso [set]
Definition at line 958 of file cmdMisc.c.
{ int i, num, lineno; int size; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } if (argc > 3) { goto usage; } num = 30; lineno = 1; for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { if (argv[i][1] == 'h') { lineno = 0; } else { goto usage; } } else { num = atoi(argv[i]); if (num <= 0) { goto usage; } } } size = array_n(vm_commandHistoryArray); num = (num < size) ? num : size; for (i = size - num; i < size; i++) { if (lineno != 0) { (void) fprintf(vis_stdout, "%d\t", i + 1); } (void) fprintf(vis_stdout, "%s\n", array_fetch(char *, vm_commandHistoryArray, i)); } return(0); usage: (void) fprintf(vis_stderr, "usage: history [-h] [num]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); (void) fprintf(vis_stderr, " num \t\tprint the last num commands\n"); return(1); }
static int CommandMemoryProfile | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the _memory_profile command.]
CommandName [_memory_profile]
CommandSynopsis [It shows the amount of memory used by every pacakge.]
CommandArguments [\[-f <filename>\] \[-h\] \[-p\] \[-u <units>\]]
CommandDescription [This command intregrates the output from purify with a function map generated by a perlscript plus another perlscript to generate a memory profile of vis.
This command relies on the output of purify to a file to call the script "memoryaccount" and produce a summary of how much memory has been allocated by each package. Although this command may appear simple it requires the interaction of two scripts and three files, so special care should be taken when attempting to modify it.
Here is the way it works. The code in this command is conditionally compiled depending on the definition of the symbol PURIFY
. If the symbol is not defined, the program prints a message notifying that the command is not operative in this executable. If PURIFY
has been defined, there are certain things that are assumed. The executable has been linked with purify. The output of purify is being redirected to a file with name purify.log
. The perl script memoryaccount
is in $VIS/common/share
and it is executable. There exists a file mapping function names to packages in the same place whose name is .fmap
.
The command then calls purify_all_inuse()
to force purify to dump to the file purify.log
the information about the memory that is currently visible to the program. This memory is not the total memory allocated by the program since there may be leaked memory that is no longer accessible. A temporary file is created and the script memoryaccount
is called to analyze the file purify.log
and write in the temporary file the memory profile obtained from it. Once the script is done, the temporary file is dumped to vis_stdout
and deleted.
Since most of the computation in this command is done by the pearlscript memoryaccount
, for more information please refer to the message printed when the script is invoked with the option -h
.
Command options:
-log-file
has been used at the linking stage when building the executable. ]
SideEffects []
Definition at line 620 of file cmdMisc.c.
{ int c; char options[128]; #ifdef PURIFY char tmpFileName[128]; FILE *fp; char command[256]; char *visDirectoryName; int systemStatus; #endif /* * Parse command line options. */ options[0] = 0; util_getopt_reset(); while ((c = util_getopt(argc, argv, "f:hpu:")) != EOF) { switch(c) { case 'f': strcat(options, " -f "); strcat(options, util_optarg); break; case 'h': goto usage; case 'p': strcat(options, " -p "); break; case 'u': strcat(options, " -u "); strcat(options, util_optarg); break; default: goto usage; } } #ifdef PURIFY /* Flag to remember that a file has been created by purify */ fileCreated = TRUE; /* Obtain the name of a temporary file */ tmpnam(tmpFileName); /* Kick purify to dump the data in the file */ purify_all_inuse(); /* Obtain the path to the perl script */ visDirectoryName = Vm_VisObtainLibrary(); /* Prepare the string to be sent to a shell */ (void)sprintf(command, "%s/memoryaccount %s %s/.fmap ./.fmap >%s", visDirectoryName, options, visDirectoryName, tmpFileName); /* Effectively execute the perlscript */ systemStatus = system(command); if (systemStatus != 0) { return 1; } fp = Cmd_FileOpen(tmpFileName, "r", NIL(char *), 1); /* Check if the open has been successful */ if (fp == NIL(FILE)) { (void) fprintf(vis_stderr, "** cmd error: File %s was not found\n", tmpFileName); return 1; } /* Dump the contents of the result file in vis_stdout */ while(fgets(command, 128, fp) != NIL(char)) { (void) fprintf(vis_stdout, "%s", command); } fclose(fp); /* Remove the temporary file */ #if HAVE_UNLINK unlink(tmpFileName); #endif #else (void) fprintf(vis_stderr, "** cmd error: Command not available: Vis has not been "); (void) fprintf(vis_stderr, "compiled with purify.\n"); #endif return 0; /* normal exit */ usage: (void) fprintf(vis_stderr, "usage: _memory_profile [-f <filename>] [-h] "); (void) fprintf(vis_stderr, "[-p] [-u <units>] <filenames>\n"); (void) fprintf(vis_stderr, " -f <file>\tFile to read the purify dump"); (void) fprintf(vis_stderr, " from. The default is purify.log\n"); (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n"); (void) fprintf(vis_stderr, " -p\t\tPrint also the packages that do not "); (void) fprintf(vis_stderr, " allocate any memory\n"); (void) fprintf(vis_stderr, " -u <units>\tUnits to print the memory usage"); (void) fprintf(vis_stderr, " in. It may be b for bytes\n"); (void) fprintf(vis_stderr, " \t\tk for kilobytes, m for megabytes and "); (void) fprintf(vis_stderr, "g for gigabutes.\n"); return 1; /* error exit */ }
static int CommandQuit | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the quit command.]
Description [A return value of -1 indicates a quick quit, -2 return frees the memory.]
CommandName [quit] CommandSynopsis [exit VIS] CommandArguments [\[-h\] \[-s\]] CommandDescription [Stops the program. Does not save the current network before exiting.
Command options:
]
SideEffects []
Definition at line 753 of file cmdMisc.c.
{ int c; util_getopt_reset(); while ((c = util_getopt(argc,argv,"hs")) != EOF){ switch(c){ case 'h': goto usage; case 's': return -2; default: goto usage; } } if ( argc != util_optind){ goto usage; } return -1; usage: (void)fprintf(vis_stderr, "usage: quit [-h] [-s]\n"); (void)fprintf(vis_stderr, " -h print the command usage\n"); (void)fprintf(vis_stderr, " -s frees all the memory before quitting\n"); return 1; }
static int CommandSetBddParameters | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the set_bdd_parameters command.]
SideEffects []
CommandName [set_bdd_parameters]
CommandSynopsis [Creates a table with the value of all the flags currently active in VIS and calls the function bdd_set_parameters with the manager of the current place in the hierarchy and the table.]
CommandArguments [\[-h\]\[-s\]]
CommandDescription [The command obtains the bdd manager of the current point in the hierarchy. Given this manager and the set of pairs (variable,value) of the VIS environment, the function sets specific BDD parameters to the given values. This command works in conjunction with print_bdd_stats.
Print_bdd_stats first prints a report of the parameters and statistics of the current bdd_manager. By using the command "set", the user may modify the value of any of the parameters of the underlying bdd package. The way to do it is by setting a value in the variable BDD.parameter name
where parameter name<> is the name of the parameter exactly as printed by the print_bdd_stats command. In order to "re-program" the underlying bdd package this command must be invoked.
Command options:
Print the command usage.
Print the bdd parameter and statistics after the modification.
]
Definition at line 499 of file cmdMisc.c.
{ Ntk_Network_t *network; boolean showAfter; int c; showAfter = FALSE; network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); /* * Parse the command line. */ util_getopt_reset(); while ((c = util_getopt(argc, argv, "hs")) != EOF) { switch (c) { case 'h': goto usage; case 's': showAfter = TRUE; break; default: goto usage; } } /* flatten_hierarchy and static_order must have been invoked already. */ if (network == NIL(Ntk_Network_t)) { return 1; } if (!Ntk_NetworkReadMddManager(network)) { (void) fprintf(vis_stderr, "The MDD variables have not been ordered. "); (void) fprintf(vis_stderr, "Use static_order.\n"); return 1; } /* Create the table of variable->value */ bdd_set_parameters(Ntk_NetworkReadMddManager(network), cmdFlagTable, vis_stdout); if (showAfter) { bdd_print_stats(Ntk_NetworkReadMddManager(network), vis_stdout); } return 0; /* Everything okay */ usage: (void) fprintf(vis_stderr, "usage: set_bdd_parameters [-h] [-s]\n"); (void) fprintf(vis_stderr, " -h print the command usage\n"); (void) fprintf(vis_stderr, " -s print also the bdd statistics\n"); return 1; }
static int CommandSetVariable | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the set command.]
CommandName [set]
CommandSynopsis [set an environment variable]
CommandArguments [\[-h\] \[<name>\] \[<value>\]]
CommandDescription [ A variable environment is maintained by the command interpreter. The "set" command sets a variable to a particular value, and the "unset" command removes the definition of a variable. If "set" is given no arguments, it prints the current value of all variables.
Command options:
Interpolation of variables is allowed when using the set command. The variables are referred to with the prefix of '$'. So for example, the following can be done to check the value of a set variable:
vis> set foo bar
vis> echo $foo
bar
The last line "bar" will the output produced by vis.
Variables can be extended by using the character ':' to concatenate values. For example :
vis> set foo bar
The variable
vis> set foo $foo:foobar
vis> echo $foo
bar:foobar
foo
is extended with the value foobar
.
Whitespace characters may be present within quotes. However, variable interpolation lays the restriction that the characters ':' and '/' may not be used within quotes. This is to allow for recursive interpolation. So for example, the following is allowed
vis> set "foo bar" this
The last line will be the output produced by vis.
vis> echo $"foo bar"
this
But in the following, the value of the variable foo/bar
will not be interpreted correctly:
vis> set "foo/bar" this
If a variable is not set by the "set" command, then the variable is returned unchanged.
vis> echo $"foo/bar"
foo/bar
Different commands use environment information for different purposes. The command interpreter makes use of the following parameters:
Building MDDs for the network makes use of following setting:
Expresses the combinational outputs in terms of the combinational inputs. This is the default partitioning method.
The partition built is isomorphic to the combinational part of the network. The function of each node is expressed in terms of its immediate fanins.
The partition built contains the combinational part of the network as well as vertices corresponding to some intermediate nodes. These vertices are generated to control the MDD sizes of the combinational outputs. The number of intermediate variables can be controlled by the parameter "partition_threshold". The method "inout" and "total" are special cases of this method (corresponding to a partition_threshold of infinity and 0 respectively).
Image computation makes use of following settings:
The "image_method" parameter is used to control the image method used in various symbolic analysis techniques. Currently, two image methods are implemented. Use "set image_method <method>" to choose the appropriate method.
This is the most naive approach possible. However, this method is not suitable for circuits with more than 20 latches.
This is the pure transition function method. This method is supposed not to be used in general fixpoint computations. Approximate traversal is an application of this method. Basically this method is made as a part of hybrid method. For more detailed options, see the help of print_tfm_options command.
This is a hybrid method combining transition relation and function methods. Transition relation method is based on conjunction of partitioned transition relation, whereas transition function method is based on splitting on an input or output variable recursively. The hybrid method choose either splitting or conjunction at each recursion dynamically using the dependence matrix. For details, refer to the paper "To split or to Conjoin: The Question in Image Computation" by In-Ho Moon, James Kukula, Kavita Ravi, and Fabio Somenzi, DAC'00. Also for more detailed options, see the help of print_hybrid_options command.
This technique is based on the early variable quantification and related heuristics of Ranjan, et al. "Efficient BDD Algorithms for FSM Synthesis and Verification", IWLS 1995. First, from the given multivalued functions, bit level relations are created. These relations are then clustered based on the value of threshold value controlled by image_cluster_size parameter. Next the relations are ordered for early variable quantification. This ordering is controlled by the parameters image_W1, image_W2, image_W3, and image_W4.
This parameter is used in conjunction with the selection of iwls95, mlp, or linear as the image_method. When the value is 1, the compositional far side image computation approach is enabled; when the value is 0, this feature is disabled (default).
This parameter is used in conjunction with the selection of iwls95 as the image_method. The value of this parameter is used as threshold value for creating clusters. The default value of this parameter is 5000 which has been empirically proved to be an optimal value.
These parameters are used in conjunction with the selection of iwls95 as the image_method. They control the weights associated with various factors in ordering the clusters. The default values are 6, 1, 1, and 2 respectively. For a detailed description of these parameters, please refer to the paper in IWLS'95 proceedings.
Sets the verbosity mode (0 minimum to 4 maximum), for the image method iwls95.
Sets a minimization method to minimize the transition relation or an image/preimage computaion with a set of dont-care states.
Methods: 0
: restrict (default).
1
: constrain
2
: compact (currently supported by only CUDD)
3
: squeeze (currently supported by only CUDD)
Sets the symbolic method to enumerate strongly connected components (SCCs). Symbolic SCC enumeration is the core computation in LTL and fair-CTL model checking.
Methods: lockstep
: the O(nlogn) time LockStep algorithm (default).
Methods: linearstep
: the linear time symbolic algorithm (default).
]
SideEffects []
SeeAlso [unset]
Definition at line 1453 of file cmdMisc.c.
{ char *flag_value, *key, *value; avl_generator *gen; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } if (argc == 0 || argc > 3) { goto usage ; } else if (argc == 1) { avl_foreach_item(cmdFlagTable, gen, AVL_FORWARD, &key, &value) { (void) fprintf(vis_stdout, "%s\t%s\n", key, value); } return 0; } else { key = argv[1]; if (avl_delete(cmdFlagTable, &key, &value)) { FREE(key); FREE(value); } flag_value = argc == 2 ? util_strsav("") : util_strsav(argv[2]); (void) avl_insert(cmdFlagTable, util_strsav(argv[1]), flag_value); if (strcmp(argv[1], "vis_stdout") == 0) { if (vis_stdout != stdout) { (void) fclose(vis_stdout); } if (strcmp(flag_value, "") == 0) { flag_value = "-"; } vis_stdout = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); if (vis_stdout == NULL) { vis_stdout = stdout; } #if HAVE_SETVBUF setvbuf(vis_stdout, (char *)NULL, _IOLBF, 0); #endif } if (strcmp(argv[1], "vis_stderr") == 0) { if (vis_stderr != stderr) { (void) fclose(vis_stderr); } if (strcmp(flag_value, "") == 0) { flag_value = "-"; } vis_stderr = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); if (vis_stderr == NULL) { vis_stderr = stderr; } #if HAVE_SETVBUF setvbuf(vis_stderr, (char *)NULL, _IOLBF, 0); #endif } if (strcmp(argv[1], "history") == 0) { if (vis_historyFile != NIL(FILE)) { (void) fclose(vis_historyFile); } if (strcmp(flag_value, "") == 0) { vis_historyFile = NIL(FILE); } else { vis_historyFile = Cmd_FileOpen(flag_value, "w", NIL(char *), 0); if (vis_historyFile == NULL) { vis_historyFile = NIL(FILE); } } } return 0; } usage: (void) printf("usage: set [-h] [name] [value]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static int CommandSource | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
static int CommandTime | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
AutomaticStart
Function********************************************************************
Synopsis [Implements the time command.]
CommandName [time] CommandSynopsis [provide a simple elapsed time value] CommandArguments [\[-h\]\[-u\]] CommandDescription [Prints the processor time used since the last time command, and the total processor time used since VIS was started.
By default, the time reported is the CPU time spent executing instructions of the calling process and the time this process waited for children that terminated.
Command options:
]
SideEffects []
Definition at line 360 of file cmdMisc.c.
{ static long last_time_u = 0; static long last_time_c = 0; long time; int c; boolean excludeChildren = FALSE; util_getopt_reset(); while ((c = util_getopt(argc,argv,"hu")) != EOF){ switch(c){ case 'h': goto usage; case 'u': excludeChildren = TRUE; break; default: goto usage; } } if (argc != util_optind) { goto usage; } if (excludeChildren) { time = util_cpu_time(); (void) fprintf(vis_stdout, "elapse: %2.1f seconds, total: %2.1f seconds\n", (time - last_time_u) / 1000.0, time / 1000.0); last_time_u = time; } else { time = util_cpu_ctime(); (void) fprintf(vis_stdout, "elapse: %2.1f seconds, total: %2.1f seconds\n", (time - last_time_c) / 1000.0, time / 1000.0); last_time_c = time; } return 0; usage: (void) fprintf(vis_stderr, "usage: time [-h][-u]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); (void) fprintf(vis_stderr, " -u \t\texclude child process time\n"); return 1; }
static int CommandUnalias | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the unalias command.]
CommandName [unalias] CommandSynopsis [remove the definition of an alias.] CommandArguments [\[-h\] <alias_names>] CommandDescription [Removes the definition of an alias.
Command options:
]
SideEffects []
SeeAlso [alias]
Definition at line 1173 of file cmdMisc.c.
{ int i; char *key, *value; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } if (argc < 2) { goto usage; } for(i = 1; i < argc; i++) { key = argv[i]; if (avl_delete(cmdAliasTable, &key, &value)) { CmdAliasFree(value); } } return 0; usage: (void) fprintf(vis_stderr, "usage: unalias [-h] alias_names\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static int CommandUnsetVariable | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the unset command.]
CommandName [unset]
CommandSynopsis [unset an environment variable]
CommandArguments [\[-h\] <variables>]
CommandDescription [ A variable environment is maintained by the command interpreter. The "set" command sets a variable to a particular value, and the "unset" command removes the definition of a variable.
Command options:
]
SideEffects []
SeeAlso [set]
Definition at line 1576 of file cmdMisc.c.
{ int i; char *key, *value; int c; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c) { case 'h': goto usage; default: goto usage; } } if (argc < 2) { goto usage; } for(i = 1; i < argc; i++) { key = argv[i]; if (avl_delete(cmdFlagTable, &key, &value)) { FREE(key); FREE(value); } } return 0; usage: (void) fprintf(vis_stderr, "usage: unset [-h] variables \n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static int CommandUsage | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the usage command.]
CommandName [usage] CommandSynopsis [provide a dump of process statistics] CommandArguments [\[-h\]] CommandDescription [Prints a formatted dump of processor-specific usage statistics. For Berkeley Unix, this includes all of the information in the getrusage() structure.
Command options:
]
SideEffects []
Definition at line 803 of file cmdMisc.c.
{ int c; util_getopt_reset(); while ((c = util_getopt(argc,argv,"h")) != EOF){ switch(c){ case 'h': goto usage; default: goto usage; } } if (argc != util_optind){ goto usage; } util_print_cpu_stats(vis_stdout); return 0; usage: (void) fprintf(vis_stderr, "usage: usage [-h]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static int CommandWhich | ( | Hrc_Manager_t ** | hmgr, |
int | argc, | ||
char ** | argv | ||
) | [static] |
Function********************************************************************
Synopsis [Implements the which command.]
CommandName [which] CommandSynopsis [look for a file called name] CommandArguments [\[-h\] <file_name>] CommandDescription [Looks for a file in a set of directories which includes the current directory as well as those in the VIS path. If it finds it, it reports the path. The path is specified through the "set open_path" command in the .visrc.
Command options:
]
SideEffects []
SeeAlso [set]
Definition at line 857 of file cmdMisc.c.
{ FILE *fp; char *filename; int c; util_getopt_reset(); while ((c = util_getopt(argc,argv,"h")) != EOF){ switch(c){ case 'h': goto usage; default: goto usage; } } if (argc-1 != util_optind){ goto usage; } fp = Cmd_FileOpen(argv[1], "r", &filename, 0); if (fp != 0) { (void) fprintf(vis_stdout, "%s\n", filename); (void) fclose(fp); } FREE(filename); return 0; usage: (void)fprintf(vis_stderr,"usage: which [-h] file_name\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; }
static void FlushBuffers | ( | int | sigtype | ) | [static] |
static void print_alias | ( | char * | value | ) | [static] |
avl_tree* cmdAliasTable |
avl_tree* cmdFlagTable |
boolean fileCreated [static] |
char rcsid [] UNUSED = "$Id: cmdMisc.c,v 1.59 2009/04/11 18:25:50 fabio Exp $" [static] |
CFile***********************************************************************
FileName [cmdMisc.c]
PackageName [cmd]
Synopsis [Variable table; miscellaneous commands related to the general system.]
Author [SIS]
Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. All rights reserved.
Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]