VIS

src/io/ioCmd.c

Go to the documentation of this file.
00001 
00034 #include "ioInt.h"
00035 
00036 static char rcsid[] UNUSED = "$Id: ioCmd.c,v 1.16 2005/05/19 02:34:33 awedh Exp $";
00037 
00038 /*---------------------------------------------------------------------------*/
00039 /* Constant declarations                                                     */
00040 /*---------------------------------------------------------------------------*/
00041 #ifndef NAWK
00042 #define NAWK "gawk"
00043 #endif
00044 /*---------------------------------------------------------------------------*/
00045 /* Stucture declarations                                                     */
00046 /*---------------------------------------------------------------------------*/
00047 
00048 /*---------------------------------------------------------------------------*/
00049 /* Type declarations                                                         */
00050 /*---------------------------------------------------------------------------*/
00051 
00052 /*---------------------------------------------------------------------------*/
00053 /* Variable declarations                                                     */
00054 /*---------------------------------------------------------------------------*/
00055 extern FILE *yyin;
00056 
00057 /*---------------------------------------------------------------------------*/
00058 /* Macro declarations                                                        */
00059 /*---------------------------------------------------------------------------*/
00060 
00061 
00064 /*---------------------------------------------------------------------------*/
00065 /* Static function prototypes                                                */
00066 /*---------------------------------------------------------------------------*/
00067 
00068 static int CommandReadBlifMv(Hrc_Manager_t **hmgr, int argc, char **argv);
00069 static int CommandWriteBlifMv(Hrc_Manager_t **hmgr, int argc, char **argv);
00070 static int CommandReadVerilog(Hrc_Manager_t **hmgr, int argc, char **argv);
00071 static int CommandReadBlif(Hrc_Manager_t **hmgr, int argc, char **argv);
00072 static int CommandWriteBlif(Hrc_Manager_t **hmgr, int argc, char **argv);
00073 static int CommandWriteSmv(Hrc_Manager_t **hmgr, int argc, char **argv);
00074  
00078 /*---------------------------------------------------------------------------*/
00079 /* Definition of exported functions                                          */
00080 /*---------------------------------------------------------------------------*/
00081 
00091 void
00092 Io_Init(void)
00093 {
00094   Cmd_CommandAdd("read_blif_mv", CommandReadBlifMv, 0);
00095   Cmd_CommandAdd("write_blif_mv", CommandWriteBlifMv, 0);
00096   Cmd_CommandAdd("write_smv", CommandWriteSmv, 0);
00097   Cmd_CommandAdd("read_verilog", CommandReadVerilog, 0);
00098   Cmd_CommandAdd("read_blif", CommandReadBlif, 0);
00099   Cmd_CommandAdd("write_blif", CommandWriteBlif, 0);
00100 }
00101 
00111 void
00112 Io_End(void)
00113 {
00114 }
00115 
00116 /*---------------------------------------------------------------------------*/
00117 /* Definition of static functions                                            */
00118 /*---------------------------------------------------------------------------*/
00119 
00175 static int
00176 CommandReadBlifMv(
00177   Hrc_Manager_t **hmgr,
00178   int argc,
00179   char **argv)
00180 {
00181   int status, c;
00182   boolean isCanonical, isIncremental, isVerbose;
00183   char *fileName;
00184   FILE *fp;
00185   Hrc_Manager_t *newHmgr;
00186   
00187   isCanonical = 0;
00188   isIncremental = 0;
00189   isVerbose = 0;
00190   util_getopt_reset();
00191   while ((c = util_getopt(argc,argv,"chrv")) != EOF){
00192     switch(c){
00193       case 'c':
00194         isCanonical = 1;
00195         break;
00196       case 'h':
00197         goto usage;
00198       case 'r':
00199         isIncremental = 1;
00200         break;
00201       case 'v':
00202         isVerbose = 1;
00203         break;
00204       default:
00205         goto usage;
00206     }
00207   }
00208   
00209   /* check to see if there is only one argument left for a file name */
00210   if (argc-1 != util_optind){
00211     goto usage;
00212   }
00213   fileName = argv[util_optind];
00214 
00215   fp = Cmd_FileOpen(fileName, "r", NIL(char *), 1);
00216   
00217   if (fp == NIL(FILE)){
00218     (void)fprintf(vis_stderr,"File %s cannot be opened\n", fileName);
00219     return 1;
00220   }
00221   error_init();
00222 
00223   newHmgr = Io_BlifMvRead(fp,*hmgr,isCanonical,isIncremental,isVerbose);
00224   /* success */
00225   if (newHmgr != NIL(Hrc_Manager_t)){
00226     status = 0;
00227     if (isIncremental == 0){
00228       Hrc_ManagerFree(*hmgr);
00229       *hmgr = newHmgr;
00230     }
00231   }
00232   /* failure */
00233   else {
00234     status = 1;
00235   }
00236   (void)fprintf(vis_stderr,"%s",error_string());
00237   fflush(vis_stderr);
00238   if (fp != stdin) {
00239     (void) fclose(fp);
00240   }
00241   return (status);
00242 
00243   usage:
00244     (void)fprintf(vis_stderr, "usage: read_blif_mv [-c] [-h] [-r] [-v] file\n");
00245     (void)fprintf(vis_stderr, "   -c  semi-canonicalize all the tables\n");
00246     (void)fprintf(vis_stderr, "   -h  print the command usage\n");  
00247     (void)fprintf(vis_stderr, "   -r  replace the current subhierarchy\n");
00248     (void)fprintf(vis_stderr, "   -v  verbose\n");
00249     return 1 ;
00250 }
00251 
00252 
00281 static int
00282 CommandWriteBlifMv(
00283   Hrc_Manager_t **hmgr,
00284   int argc,
00285   char **argv)
00286 {
00287   FILE *fp;
00288   int c;
00289   Hrc_Node_t *currentNode;
00290 
00291   util_getopt_reset();
00292   while ((c = util_getopt(argc,argv,"h")) != EOF){
00293     switch(c){
00294       case 'h':
00295         goto usage;
00296       default:
00297         goto usage;
00298     }
00299   }
00300 
00301   currentNode = Hrc_ManagerReadCurrentNode(*hmgr);
00302   if (currentNode == NIL(Hrc_Node_t)){
00303     (void)fprintf(vis_stderr,"No file has been read in.\n");
00304     return 1;
00305   }
00306 
00307   if (argc == 1){
00308     fp = stdout;
00309   }
00310   else if (argc == 2){
00311     fp = Cmd_FileOpen(*(++argv), "w", NIL(char *), 1);
00312     if (fp == NIL(FILE)){
00313       (void)fprintf(vis_stderr,"Cannot write to %s\n", *argv);
00314       return 1;
00315     }
00316   }
00317   else {
00318     goto usage; 
00319   }
00320   
00321   error_init();
00322   IoBlifMvWrite(fp,*hmgr);
00323   (void)fprintf(vis_stderr,"%s",error_string());
00324   fflush(fp);
00325   if (fp != stdout) {
00326     (void) fclose(fp);
00327   }
00328   return 0;
00329 
00330   usage:
00331     (void)fprintf(vis_stderr, "usage: write_blif_mv [-h] [file]\n");
00332     (void)fprintf(vis_stderr, "   -h  print the command usage\n");  
00333     return 1;
00334 }
00335 
00364 static int
00365 CommandWriteSmv(
00366   Hrc_Manager_t **hmgr,
00367   int argc,
00368   char **argv)
00369 {
00370   FILE *fp;
00371   int c;
00372   Hrc_Node_t *currentNode;
00373 
00374   util_getopt_reset();
00375   while ((c = util_getopt(argc,argv,"h")) != EOF){
00376     switch(c){
00377       case 'h':
00378         goto usage;
00379       default:
00380         goto usage;
00381     }
00382   }
00383 
00384   currentNode = Hrc_ManagerReadCurrentNode(*hmgr);
00385   if (currentNode == NIL(Hrc_Node_t)){
00386     (void)fprintf(vis_stderr,"No file has been read in.\n");
00387     return 1;
00388   }
00389 
00390   if (argc == 1){
00391     fp = stdout;
00392   }else if (argc == 2){
00393     fp = Cmd_FileOpen(*(++argv), "w", NIL(char *), 1);
00394     if (fp == NIL(FILE)){
00395       (void)fprintf(vis_stderr,"Cannot write to %s\n", *argv);
00396       return 1;
00397     }
00398   }else {
00399     goto usage; 
00400   }
00401   
00402   error_init();
00403   IoSmvWrite(fp,*hmgr);
00404   (void)fprintf(vis_stderr,"%s",error_string());
00405   fflush(fp);
00406   if (fp != stdout) {
00407     (void) fclose(fp);
00408   }
00409   return 0;
00410 
00411   usage:
00412     (void)fprintf(vis_stderr, "usage: write_smv [-h] [file]\n");
00413     (void)fprintf(vis_stderr, "   -h  print the command usage\n");  
00414     return 1;
00415 }
00416 
00417 
00455 static int
00456 CommandReadVerilog(Hrc_Manager_t **hmgr, int argc, char **argv)
00457 {
00458   int c;
00459   char *realFileName, *verilogFileName;
00460 #if HAVE_MKSTEMP && HAVE_CLOSE
00461   char outFileName[] = "/tmp/vis.XXXXXX";
00462   int  fd;
00463 #else
00464   char *outFileName;
00465   char buffer[512];
00466 #endif
00467   FILE *fp;
00468   static char parseBuffer[1024];
00469   int vl2mvStatus;
00470   int cSet = 0;
00471   int uSet = 0;
00472   int FSet = 0;
00473 
00474   util_getopt_reset();
00475   while ((c = util_getopt(argc,argv,"chuF")) != EOF){
00476     switch(c){
00477       case 'c':
00478         cSet = 1;
00479         break;
00480       case 'h': 
00481         goto usage;
00482       case 'u':
00483         uSet = 1;
00484         break;
00485       case 'F':
00486         FSet = 1;
00487         break;
00488       default:
00489         goto usage;
00490     }
00491   }
00492   
00493   /* check to see if there is only one argument left for a file name */
00494   if (argc-1 != util_optind){
00495     goto usage;
00496   }
00497   verilogFileName = argv[util_optind];
00498 
00499   fp = Cmd_FileOpen(verilogFileName, "r", &realFileName, /* silent */ 1);
00500   
00501   if (fp == NIL(FILE)){
00502     FREE(realFileName);
00503     (void)fprintf(vis_stderr,"File %s  cannot be opened\n", verilogFileName);
00504     return 1;
00505   }
00506   fclose(fp);
00507 
00508 #if HAVE_MKSTEMP && HAVE_CLOSE
00509   fd = mkstemp(outFileName);
00510   if (fd == -1){
00511 #else
00512   outFileName = util_strsav(tmpnam(buffer));
00513   if (outFileName == NIL(char)){
00514 #endif
00515     FREE(realFileName);
00516     (void)fprintf(vis_stderr,"Can not create temporary file. ");
00517     (void)fprintf(vis_stderr,"Clean up /tmp an try again.\n");
00518     return  1;
00519   }  
00520  
00521   strcpy(parseBuffer,"vl2mv ");
00522   strcat(parseBuffer,"-o ");
00523   strcat(parseBuffer,outFileName);
00524   strcat(parseBuffer," ");
00525   /* start inserting options for vl2mv */
00526   if (cSet){
00527     strcat(parseBuffer,"-c ");
00528   }
00529   if (uSet){
00530     strcat(parseBuffer,"-u ");
00531   }
00532   if (FSet){
00533     strcat(parseBuffer,"-F ");
00534   }
00535   strcat(parseBuffer, realFileName);
00536   FREE(realFileName);
00537 #if HAVE_MKSTEMP && HAVE_CLOSE
00538   close(fd);
00539 #endif
00540   vl2mvStatus = system(parseBuffer);
00541   if (vl2mvStatus != 0){
00542     return 1;
00543   }
00544   sprintf(parseBuffer,"read_blif_mv %s",outFileName);
00545   Cmd_CommandExecute(hmgr, parseBuffer);
00546 #if HAVE_UNLINK
00547   unlink(outFileName);
00548 #endif
00549   return 0;
00550   
00551   usage:
00552     (void)fprintf(vis_stderr, "usage: read_verilog [-c] [-h] [-u] [-F] file\n");
00553     (void)fprintf(vis_stderr, "   -c  use explicit clocking\n");
00554     (void)fprintf(vis_stderr, "   -h  print the command usage\n");
00555     (void)fprintf(vis_stderr, "   -u  turn off unroling\n");
00556     (void)fprintf(vis_stderr, "   -F  ignore all timing\n");
00557     return 1;
00558 }
00559 
00610 static int
00611 CommandReadBlif(
00612   Hrc_Manager_t **hmgr,
00613   int argc,
00614   char **argv)
00615 {
00616   int c, status;
00617   boolean isCanonical = 0;
00618   boolean isIncremental = 0;
00619   boolean isVerbose = 0;
00620   char *fileName, *realFileName, *visDirectoryName, *blifMvFileName;
00621   char *encodingFileName;
00622   char command[512];
00623   FILE *fp;
00624 #if HAVE_MKSTEMP && HAVE_CLOSE
00625   int  fd;
00626 #else
00627   char buffer[512];
00628 #endif
00629   Hrc_Manager_t *newHmgr;
00630   
00631   util_getopt_reset();
00632   while ((c = util_getopt(argc,argv,"ce:hv")) != EOF){
00633     switch(c){
00634       case 'c':
00635         isCanonical = 1;
00636         break;
00637       case 'e':
00638         isIncremental = 1;
00639         fp = Cmd_FileOpen(util_optarg, "r", &encodingFileName, 1);
00640         if (fp == NIL(FILE)){
00641           (void)fprintf(vis_stderr,"Encoding file %s is not found\n", util_optarg);
00642           return 1;
00643         }
00644         if (fp != stdin){
00645           (void)fclose(fp);
00646         }
00647         break;
00648       case 'h':
00649         goto usage;
00650       case 'v':
00651         isVerbose = 1;
00652         break;
00653       default:
00654         goto usage;
00655     }
00656   }
00657 
00658   /* check to see if there is only one argument left for a file name */
00659   if (argc-1 != util_optind){
00660     goto usage;
00661   }
00662   fileName = argv[util_optind];
00663 
00664   fp = Cmd_FileOpen(fileName, "r", &realFileName, 1);
00665   
00666   if (fp == NIL(FILE)){
00667     /*
00668     FREE(realFileName);
00669     */
00670     (void)fprintf(vis_stderr,"File %s cannot be opened\n", fileName);
00671     return 1;
00672   }
00673   if (fp != stdin){
00674     (void)fclose(fp);
00675   }
00676 
00677 #if HAVE_MKSTEMP && HAVE_CLOSE
00678   blifMvFileName = util_strsav("/tmp/vis.XXXXXX");
00679   fd = mkstemp(blifMvFileName);
00680   if (fd == -1){
00681 #else
00682   blifMvFileName = util_strsav(tmpnam(buffer));
00683   if (blifMvFileName == NIL(char)){
00684 #endif
00685     FREE(realFileName);
00686     (void)fprintf(vis_stderr,"Could not create temporary file. ");
00687     (void)fprintf(vis_stderr,"Clean up /tmp an try again.\n");
00688     return 1;
00689   }
00690 #if HAVE_MKSTEMP && HAVE_CLOSE
00691   close(fd);
00692 #endif
00693   /* Invoking an awk script */
00694   visDirectoryName = Vm_VisObtainLibrary();
00695   if (isIncremental == 0){
00696     (void)sprintf(command,"sed 's/^\\./@/g' %s | sed 's/\\./$/g' | sed 's/^@/\\./g' | sed 's/{/</g' | sed 's/}/>/g'| sed 's/(/<</g' | sed 's/)/>>/g'| %s -f %s/ioBlifToMv.nawk > %s", realFileName, NAWK, visDirectoryName, blifMvFileName);
00697   }
00698   else {
00699     (void)sprintf(command,"sed 's/^\\./@/g' %s | sed 's/\\./$/g' | sed 's/^@/\\./g' | sed 's/{/</g' | sed 's/}/>/g'| %s -f %s/ioBlifToMvForIncremental.nawk > %s", realFileName, NAWK, visDirectoryName, blifMvFileName);
00700   }
00701   (void)system(command);
00702   FREE(visDirectoryName);
00703   FREE(realFileName);
00704 
00705   error_init();
00706 
00707   if (isIncremental == 0){
00708     fp = Cmd_FileOpen(blifMvFileName, "r", NIL(char *), 1);
00709   }
00710   else {
00711     char *finalBlifMvFileName;
00712     
00713 #if HAVE_MKSTEMP && HAVE_CLOSE
00714     finalBlifMvFileName = util_strsav("/tmp/vis.XXXXXX");
00715     fd = mkstemp(finalBlifMvFileName);
00716     if (fd == -1){
00717 #else
00718     finalBlifMvFileName = util_strsav(tmpnam(buffer));
00719     if (finalBlifMvFileName == NIL(char)){
00720 #endif
00721       FREE(blifMvFileName);
00722       (void)fprintf(vis_stderr,"Could not create temporary file. ");
00723       (void)fprintf(vis_stderr,"Clean up /tmp an try again.\n");
00724       return 1;
00725     }
00726 #if HAVE_MKSTEMP && HAVE_CLOSE
00727     close(fd);
00728 #endif
00729 
00730     (void)sprintf(command,"cat %s %s > %s",encodingFileName,blifMvFileName,finalBlifMvFileName);
00731     (void)system(command);
00732     FREE(encodingFileName);
00733 #if HAVE_UNLINK
00734     unlink(blifMvFileName);
00735 #endif
00736     FREE(blifMvFileName);
00737     blifMvFileName = finalBlifMvFileName;
00738 
00739     fp = Cmd_FileOpen(blifMvFileName, "r", NIL(char *), 1);
00740   }
00741   assert(fp != NIL(FILE));
00742   newHmgr = Io_BlifMvRead(fp,*hmgr,isCanonical,isIncremental,isVerbose);
00743   if (newHmgr != NIL(Hrc_Manager_t)){
00744     status = 0;
00745     if (isIncremental == 0){
00746       Hrc_ManagerFree(*hmgr);
00747       *hmgr = newHmgr;
00748     }
00749   }
00750   else {
00751     status = 1;
00752   }
00753 
00754   (void)fprintf(vis_stderr,"%s",error_string());
00755   fflush(vis_stderr);
00756   if (fp != stdin) {
00757     (void) fclose(fp);
00758 #if HAVE_UNLINK
00759     unlink(blifMvFileName);
00760 #endif
00761   }
00762   FREE(blifMvFileName);
00763   return (status);
00764 
00765   usage:
00766     (void)fprintf(vis_stderr, "usage: read_blif [-c] [-e encoding_file] [-h] [-v] file\n");
00767     (void)fprintf(vis_stderr, "   -c  table canonicalization\n");
00768     (void)fprintf(vis_stderr, "   -e  read a file into the current node using encoding file\n");
00769     (void)fprintf(vis_stderr, "   -h  print the command usage\n");    
00770     (void)fprintf(vis_stderr, "   -v  verbose\n");
00771     return 1 ;
00772 }
00773 
00774 
00973 static int
00974 CommandWriteBlif(
00975   Hrc_Manager_t **hmgr,
00976   int argc, 
00977   char **argv)
00978 {
00979   FILE *enc_fp, *fp;
00980   char *modelName, *dupname;
00981   int status, verbosity, combinationalOnly, makeLatchIOsPOs;
00982   Io_Encoding_Type_t encoding_type;
00983   Hrc_Node_t *hnode;
00984   int c;
00985   boolean recursive;
00986 
00987   fp = stdout;
00988   enc_fp = NIL(FILE);
00989   verbosity = 0;
00990   combinationalOnly = 0;
00991   makeLatchIOsPOs = 0;
00992   recursive = 0;
00993 
00994   util_getopt_reset();
00995   while ((c = util_getopt(argc, argv, "clRe:hv:")) != EOF) {
00996       switch(c) {
00997       case 'c':
00998           combinationalOnly = 1;
00999           break;
01000       case 'l':
01001           makeLatchIOsPOs = 1;
01002           break;
01003       case 'R':
01004           recursive = 1;
01005           break;
01006       case 'e':
01007           enc_fp = Cmd_FileOpen(util_optarg, "w", NIL(char *), 1);
01008           if (enc_fp == NIL(FILE)){
01009               (void)fprintf(vis_stderr,"Cannot write to %s\n", util_optarg);
01010               return 1;
01011           }
01012           break;
01013       case 'h':
01014           goto usage;
01015       case 'v':
01016           verbosity = atoi(util_optarg);
01017           break;
01018       default:
01019           goto usage;
01020       }
01021   }
01022 
01023   if(makeLatchIOsPOs && combinationalOnly){
01024     (void)fprintf(vis_stderr,"Cannot use -c and -l options simultaneously.\n");
01025     goto usage;
01026   }
01027   if(recursive){
01028     if(makeLatchIOsPOs || combinationalOnly){
01029       (void)fprintf(vis_stderr,"Cannot use -c or -l options with -R option.\n");      
01030       goto usage;
01031     }
01032     if(enc_fp != NIL(FILE)){
01033       (void)fprintf(vis_stderr,"Cannot use -e option with -R option.\n");            
01034       goto usage;
01035     }
01036   }
01037   hnode = Hrc_ManagerReadCurrentNode(*hmgr);
01038   if (hnode == NIL(Hrc_Node_t)){
01039     (void)fprintf(vis_stderr,"No file has been read in.\n");
01040     return 1;
01041   }
01042 
01043   /* check to see if there is only one argument left for a file name */
01044   if (argc == util_optind){
01045     fp = stdout;
01046   }
01047   else if (argc-1 == util_optind){
01048     fp = Cmd_FileOpen(argv[util_optind], "w", NIL(char *), 1);
01049     if (fp == NIL(FILE)){
01050       (void)fprintf(vis_stderr,"Cannot write to %s\n", argv[util_optind]);
01051        if (enc_fp != NIL(FILE)){
01052          fclose(enc_fp);
01053        }
01054        return 1;
01055     }
01056   }
01057   else {
01058     if (enc_fp != NIL(FILE)){
01059       fclose(enc_fp);
01060     }
01061     goto usage;
01062   }
01063 
01064   if((enc_fp == NIL(FILE)) && !recursive){
01065       modelName = Hrc_NodeReadModelName(hnode);
01066       dupname = ALLOC(char, strlen(modelName) + strlen(".enc") + 1);
01067       sprintf(dupname, "%s%s", modelName, ".enc");
01068       enc_fp = Cmd_FileOpen(dupname, "w", NIL(char *), 1);
01069       if (enc_fp == NIL(FILE)){
01070         (void)fprintf(vis_stderr,"Cannot write to %s\n", dupname);
01071         return 1;
01072       }
01073       (void)fprintf(stdout, "Writing encoding information to %s\n",dupname);
01074       FREE(dupname);
01075   }
01076 
01077   if(!recursive){
01078     if(!(makeLatchIOsPOs || combinationalOnly)){
01079       (void)fprintf(vis_stderr,"Warning - The blif and encoding files generated cannot be read back into \n");
01080       (void)fprintf(vis_stderr, "VIS. If you would like to read the optimized blif file back into VIS, then \n");
01081       (void)fprintf(vis_stderr, "please use 'write_blif -l' or 'write_blif -c' instead.\n");
01082     }
01083   }
01084 
01085   error_init();
01086   encoding_type = SIMPLE;
01087   if(recursive){
01088     status = Io_HnodeWriteBlifTotal(encoding_type, hnode, fp, verbosity);
01089   }
01090   else{
01091     status = Io_HnodeWriteBlif(encoding_type, hnode, fp, enc_fp, verbosity, combinationalOnly, makeLatchIOsPOs);
01092   }
01093   (void)fprintf(vis_stderr,"%s",error_string());
01094   fflush(fp);
01095   if (fp != stdout) {
01096     (void) fclose(fp);
01097   }
01098 
01099   if(status == 0){
01100     return 0;
01101   }
01102   else{
01103     return 1;
01104   }
01105 
01106   usage:
01107     (void)fprintf(vis_stderr, "usage: write_blif [-c] [-l] [-e encoding_file] [-R] [-h] [-v verbosity] [blif_file]\n");
01108     (void)fprintf(vis_stderr, "   -c write only combinational part to blif file\n");  
01109     (void)fprintf(vis_stderr, "   -l make latch IOs primary outputs in the blif file\n");  
01110     (void)fprintf(vis_stderr, "   -e encoding_file, default is <model_name>.enc\n");
01111     (void)fprintf(vis_stderr, "   -R recursively write out the hierarchy rooted at the current hnode.\n");
01112     (void)fprintf(vis_stderr, "      In this sub-hierarchy, all tables must be deterministic and all\n");
01113     (void)fprintf(vis_stderr, "      variables must be boolean. Either of the -c, -l, or -e options \n");
01114     (void)fprintf(vis_stderr, "      cannot be simultaneously with the -R option \n");
01115     (void)fprintf(vis_stderr, "   -h print this usage message\n");  
01116     (void)fprintf(vis_stderr, "   -v verbosity, an integer < 3, default is 0\n");
01117     (void)fprintf(vis_stderr, "Note: * If neither the -c or -l options are chosen, then latches will \n");
01118     (void)fprintf(vis_stderr, "        be written out to the blif file. Latch IOs will not be made\n");
01119     (void)fprintf(vis_stderr, "        into primary outputs in the blif file\n");
01120     (void)fprintf(vis_stderr, "      * After optimizing the blif file in SIS, do not write out the\n");
01121     (void)fprintf(vis_stderr, "        optimized file using 'write_blif -s' if you want to read\n");
01122     (void)fprintf(vis_stderr, "        it back into VIS. Use 'write_blif' instead \n");
01123     return 1 ;
01124     
01125 }
01126