/**CFile*********************************************************************** FileName [hrcCmd.c] PackageName [hrc] Synopsis [Commands for walking around HSIS/VIS hierarchies.] Description [] SeeAlso [] Author [Yuji Kukimoto] 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.] ******************************************************************************/ #include "hrcInt.h" static char rcsid[] UNUSED = "$Id: hrcCmd.c,v 1.6 2002/09/08 21:54:25 fabio Exp $"; /*---------------------------------------------------------------------------*/ /* Constant declarations */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* Type declarations */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* Stucture declarations */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* Variable declarations */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* Macro declarations */ /*---------------------------------------------------------------------------*/ /**AutomaticStart*************************************************************/ /*---------------------------------------------------------------------------*/ /* Static function prototypes */ /*---------------------------------------------------------------------------*/ static int CommandCd(Hrc_Manager_t **hmgr, int argc, char **argv); static int CommandLs(Hrc_Manager_t **hmgr, int argc, char **argv); static int CommandPwd(Hrc_Manager_t **hmgr, int argc, char **argv); static void NodeListChildren(Hrc_Node_t *hnode, boolean recursiveFlag, int depth); static void PrintSpace(int depth); static int CommandPrintModels(Hrc_Manager_t **hmgr, int argc, char **argv); static int CommandPrintHierarchyStats(Hrc_Manager_t **hmgr, int argc, char **argv); static void PrintNodeStats(Hrc_Node_t *node, boolean isHnode); static void PrintNodeStatsRecursively(Hrc_Node_t *node); static int CommandPrintIo(Hrc_Manager_t **hmgr, int argc, char **argv); static int CommandPrintLatches(Hrc_Manager_t **hmgr, int argc, char **argv); static int _HrcStringCmp(const void * s1, const void * s2); /**AutomaticEnd***************************************************************/ /*---------------------------------------------------------------------------*/ /* Definition of exported functions */ /*---------------------------------------------------------------------------*/ /**Function******************************************************************** Synopsis [Initializes the hrc package.] SideEffects [] SeeAlso [Hrc_End] ******************************************************************************/ void Hrc_Init(void) { Cmd_CommandAdd("cd", CommandCd, 0); Cmd_CommandAdd("ls", CommandLs, 0); Cmd_CommandAdd("pwd", CommandPwd, 0); Cmd_CommandAdd("print_models", CommandPrintModels, 0); Cmd_CommandAdd("print_hierarchy_stats", CommandPrintHierarchyStats, 0); Cmd_CommandAdd("print_io", CommandPrintIo, 0); Cmd_CommandAdd("print_latches", CommandPrintLatches, 0); } /**Function******************************************************************** Synopsis [Ends the hrc package.] SideEffects [] SeeAlso [Hrc_Init] ******************************************************************************/ void Hrc_End(void) { } /*---------------------------------------------------------------------------*/ /* Definition of internal functions */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* Definition of static functions */ /*---------------------------------------------------------------------------*/ /**Function******************************************************************** Synopsis [The top-level routine for cd.] SideEffects [] CommandName [cd] CommandSynopsis [change the current node] CommandArguments [ \[-h\] <child_instance_name> or <..>] CommandDescription [Changes the current node in the existing hierarchy. The argument should be either the name of a child node or .. meaning the parent node. Note that cd ../foo is not allowed.

Command options:

-h
Print the command usage.
] SeeAlso [] ******************************************************************************/ static int CommandCd( Hrc_Manager_t **hmgr, int argc, char **argv) { Hrc_Node_t *currentNode, *parent, *child; 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; } currentNode = Hrc_ManagerReadCurrentNode(*hmgr); if (currentNode == NIL(Hrc_Node_t)){ (void)fprintf(vis_stdout,"No file has been read in.\n"); return 1; } /* go to the parent node */ if (strcmp(*(++argv),"..") == 0){ if ((parent = Hrc_NodeReadParentNode(currentNode)) == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"You are at the root node. Can't cd to a parent.\n"); return 1; } Hrc_ManagerSetCurrentNode(*hmgr,parent); return 0; } if ((child = Hrc_NodeFindChildByName(currentNode,*argv)) == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"No child node whose name is %s exists in the current node.\n",*argv); return 1; } Hrc_ManagerSetCurrentNode(*hmgr,child); return 0; usage: (void)fprintf(vis_stderr,"usage: cd [-h] child_name or cd ..\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; } /**Function******************************************************************** Synopsis [The top-level routine for ls.] SideEffects [] CommandName [ls] CommandSynopsis [list all the child nodes at the current node] CommandArguments [\[-h\] \[-R\]] CommandDescription [Lists all the child nodes at the current node.

Command options:

-h
Print the command usage.

-R
Call ls recursively all the way down to leaves.
] SeeAlso [] ******************************************************************************/ static int CommandLs( Hrc_Manager_t **hmgr, int argc, char **argv) { int recursiveFlag = 0; int c; Hrc_Node_t *currentNode; util_getopt_reset(); while ((c = util_getopt(argc, argv, "hR")) != EOF) { switch(c){ case 'h': goto usage; case 'R': recursiveFlag = 1; break; default: goto usage; } } /* if there are some arguments for ls */ if (argc != util_optind){ goto usage; } currentNode = Hrc_ManagerReadCurrentNode(*hmgr); if (currentNode == NIL(Hrc_Node_t)){ (void)fprintf(vis_stdout,"No file has been read in.\n"); return 1; } NodeListChildren(currentNode, recursiveFlag, 0); return 0; usage: (void)fprintf(vis_stderr,"usage: ls [-h] [-R]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); (void) fprintf(vis_stderr, " -R \t\tprint recursive tree\n"); return 1; } /**Function******************************************************************** Synopsis [The top-level routine for pwd.] SideEffects [] CommandName [pwd] CommandSynopsis [print out the full path of the current node from the root node] CommandArguments [ \[-h\] ] CommandDescription [Prints out the full path of the current node from the root node.

Command options:

-h
Print the command usage.
] SeeAlso [] ******************************************************************************/ static int CommandPwd( Hrc_Manager_t **hmgr, int argc, char **argv) { Hrc_Node_t *currentNode; Hrc_Node_t *rootNode; char *separator, *hierarchicalName; 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){ goto usage; } currentNode = Hrc_ManagerReadCurrentNode(*hmgr); if (currentNode == NIL(Hrc_Node_t)){ (void)fprintf(vis_stdout,"No file has been read in.\n"); return 1; } rootNode = Hrc_ManagerReadRootNode(*hmgr); separator = (char *) ((rootNode == currentNode) ? "" : "."); hierarchicalName = Hrc_NodeFindHierarchicalName(currentNode, FALSE); (void)fprintf(vis_stdout,"%s%s%s\n", Hrc_NodeReadInstanceName(rootNode), separator, hierarchicalName); FREE(hierarchicalName); return 0; usage: (void)fprintf(vis_stderr,"usage: pwd [-h]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; } /**Function******************************************************************** Synopsis [The core routine for the command ls.] Description [The core routine for the command ls. If the second argument is set to 1, it calls the ls routine recursively all the way down to leaves.] SideEffects [] SeeAlso [] ******************************************************************************/ static void NodeListChildren( Hrc_Node_t *hnode, boolean recursiveFlag, int depth) { st_generator *gen; char *childName; Hrc_Node_t *child; int newDepth, i; array_t *tmpArray; newDepth = depth + 1; tmpArray = array_alloc(char *,0); Hrc_NodeForEachChild(hnode,gen,childName,child){ array_insert_last(char *,tmpArray,childName); } array_sort(tmpArray,_HrcStringCmp); for (i=0; i < array_n(tmpArray); i++){ PrintSpace(depth); childName = array_fetch(char *,tmpArray,i); (void)fprintf(vis_stdout,"%s\n",childName); if (recursiveFlag == 1){ NodeListChildren(Hrc_NodeFindChildByName(hnode,childName),recursiveFlag,newDepth); } } array_free(tmpArray); } /**Function******************************************************************** Synopsis [Prints out spaces.] SideEffects [] SeeAlso [] ******************************************************************************/ static void PrintSpace(int depth) { int i; for (i=0; i < depth; i++){ (void)fprintf(vis_stdout," "); } } /**Function******************************************************************** Synopsis [This function the statistics of a model.] SideEffects [] CommandName [print_models] CommandSynopsis [list all the models and their statistics] CommandArguments [ \[-h\] ] CommandDescription [Lists all the models and prints information about the number of variables, tables, latches etc. in them.

Command options:

-h
Print the command usage.
] SeeAlso [] ******************************************************************************/ static int CommandPrintModels( Hrc_Manager_t **hmgr, int argc, char **argv) { st_generator *gen; char *name; Hrc_Model_t *model; Hrc_Node_t *node; 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) { goto usage; } node = Hrc_ManagerReadCurrentNode(*hmgr); if (node == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"No file has been read in.\n"); return 1; } Hrc_ManagerForEachModel(*hmgr, gen, name, model) { PrintNodeStats(Hrc_ModelReadMasterNode(model), FALSE); (void) fprintf(vis_stdout, "subckts = %d\n", st_count(Hrc_ModelReadSubcktTable(model))); } return 0; usage: (void) fprintf(vis_stderr, "usage: print_models [-h]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; } /**Function******************************************************************** Synopsis [This function prints the statistics of the hierarchy.] SideEffects [] CommandName [print_hierarchy_stats] CommandSynopsis [print the statistics of the current node] CommandArguments [ \[-h\] \[-R\] ] CommandDescription [Prints the statistics of the current node. Note that it is not necessary to invoke flatten_hierarchy first to create a network.

Command options:

-h
Print the command usage

-R
Print statistics for nodes recursively all the way down to leaves.
] SeeAlso [] ******************************************************************************/ static int CommandPrintHierarchyStats( Hrc_Manager_t **hmgr, int argc, char **argv) { int c; int recursiveFlag = 0; Hrc_Node_t *node; util_getopt_reset(); while ((c = util_getopt(argc, argv, "hR")) != EOF) { switch(c){ case 'h': goto usage; case 'R': recursiveFlag = 1; break; default: goto usage; } } /* if there are some arguments left */ if (argc != util_optind){ goto usage; } node = Hrc_ManagerReadCurrentNode(*hmgr); if (node == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"No file has been read in.\n"); return 1; } if(recursiveFlag) { PrintNodeStatsRecursively(node); } else { PrintNodeStats(node, TRUE); } return 0; usage: (void) fprintf(vis_stderr,"usage: print_hierarchy_stats [-h][-R]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); (void) fprintf(vis_stderr, " -R \t\tprint recursive tree\n"); return 1; } /**Function******************************************************************** Synopsis [This function prints the statistics of a node.] SideEffects [] SeeAlso [] ******************************************************************************/ static void PrintNodeStats( Hrc_Node_t *node, boolean isHnode) { (void) fprintf(vis_stdout, "Model name = %s", Hrc_NodeReadModelName(node)); if(isHnode) { (void) fprintf(vis_stdout, ", Instance name = %s\n", Hrc_NodeReadInstanceName(node)); } else { (void) fprintf(vis_stdout, "\n"); } (void) fprintf(vis_stdout, "inputs = %d,", Hrc_NodeReadNumFormalInputs(node)); (void) fprintf(vis_stdout, " outputs = %d,", Hrc_NodeReadNumFormalOutputs(node)); (void) fprintf(vis_stdout, " variables = %d,", Hrc_NodeReadNumVariables(node)); (void) fprintf(vis_stdout, " tables = %d,", Hrc_NodeReadNumTables(node)); (void) fprintf(vis_stdout, " latches = %d", Hrc_NodeReadNumLatches(node)); if(isHnode) { (void) fprintf(vis_stdout, ", children = %d\n", Hrc_NodeReadNumChildren(node)); } else { (void) fprintf(vis_stdout, "\n"); } } /**Function******************************************************************** Synopsis [This function prints the statistics of each node in the subtree rooted at node. ] SideEffects [] SeeAlso [] ******************************************************************************/ static void PrintNodeStatsRecursively( Hrc_Node_t *node) { Hrc_Node_t *childNode; st_generator *gen; char *name; PrintNodeStats(node, TRUE); Hrc_NodeForEachChild(node, gen, name, childNode) { PrintNodeStatsRecursively(childNode); } } /**Function******************************************************************** Synopsis [This function prints the names of inputs/outputs in the current node.] SideEffects [] CommandName [print_io] CommandSynopsis [print the names of inputs/outputs in the current node] CommandArguments [ \[-h\] ] CommandDescription [Prints the names of inputs/outputs in the current node.

Command options:

-h
Print the command usage.
] SeeAlso [] ******************************************************************************/ static int CommandPrintIo( Hrc_Manager_t **hmgr, int argc, char **argv) { int c, i; Hrc_Node_t *node; Var_Variable_t *var; array_t *tmpArray; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c){ case 'h': goto usage; default: goto usage; } } /* if there are some arguments left */ if (argc != util_optind){ goto usage; } node = Hrc_ManagerReadCurrentNode(*hmgr); if (node == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"No file has been read in.\n"); return 1; } if (Hrc_NodeReadNumFormalInputs(node) == 0){ fprintf(vis_stdout,"No inputs\n"); } else { tmpArray = array_alloc(char *,0); Hrc_NodeForEachFormalInput(node,i,var){ array_insert_last(char *,tmpArray,Var_VariableReadName(var)); } array_sort(tmpArray,_HrcStringCmp); fprintf(vis_stdout,"inputs:"); for (i=0; i < array_n(tmpArray); i++){ fprintf(vis_stdout," %s",array_fetch(char *,tmpArray,i)); } fprintf(vis_stdout,"\n"); array_free(tmpArray); } if (Hrc_NodeReadNumFormalOutputs(node) == 0){ fprintf(vis_stdout,"No outputs\n"); } else { tmpArray = array_alloc(char *,0); Hrc_NodeForEachFormalOutput(node,i,var){ array_insert_last(char *,tmpArray,Var_VariableReadName(var)); } array_sort(tmpArray,_HrcStringCmp); fprintf(vis_stdout,"outputs:"); for (i=0; i < array_n(tmpArray); i++){ fprintf(vis_stdout," %s",array_fetch(char *,tmpArray,i)); } fprintf(vis_stdout,"\n"); array_free(tmpArray); } return 0; usage: (void) fprintf(vis_stderr,"usage: print_io [-h]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; } /**Function******************************************************************** Synopsis [This function prints the names of latches in the current node.] SideEffects [] CommandName [print_latches] CommandSynopsis [print the names of latches in the current node] CommandArguments [ \[-h\] ] CommandDescription [Prints the names of latches in the current node.

Command options:

-h
Print the command usage.
] SeeAlso [] ******************************************************************************/ static int CommandPrintLatches( Hrc_Manager_t **hmgr, int argc, char **argv) { int c, i; Hrc_Node_t *node; st_generator *gen; char *latchName; Hrc_Latch_t *latch; array_t *tmpArray; util_getopt_reset(); while ((c = util_getopt(argc, argv, "h")) != EOF) { switch(c){ case 'h': goto usage; default: goto usage; } } /* if there are some arguments left */ if (argc != util_optind){ goto usage; } node = Hrc_ManagerReadCurrentNode(*hmgr); if (node == NIL(Hrc_Node_t)){ (void)fprintf(vis_stderr,"No file has been read in.\n"); return 1; } if (Hrc_NodeReadNumLatches(node) == 0){ fprintf(vis_stdout,"No latches\n"); } else { tmpArray = array_alloc(char *,0); Hrc_NodeForEachLatch(node,gen,latchName,latch){ array_insert_last(char *,tmpArray,latchName); } array_sort(tmpArray,_HrcStringCmp); for (i=0; i < array_n(tmpArray); i++){ fprintf(vis_stdout,"%s ",array_fetch(char *,tmpArray,i)); } fprintf(vis_stdout,"\n"); array_free(tmpArray); } return 0; usage: (void) fprintf(vis_stderr,"usage: print_latches [-h]\n"); (void) fprintf(vis_stderr, " -h \t\tprint the command usage\n"); return 1; } /**Function******************************************************************** Synopsis [This function is used for string comparison in array_sort.] Description [This function is used for string comparison in array_sort.] SideEffects [] SeeAlso [] ******************************************************************************/ static int _HrcStringCmp( const void * s1, const void * s2) { return(strcmp(*(char **)s1, *(char **)s2)); }