diff --git a/vpi/sys_display.c b/vpi/sys_display.c index 26d570a0b..54d7a0922 100644 --- a/vpi/sys_display.c +++ b/vpi/sys_display.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: sys_display.c,v 1.26 2001/07/11 02:22:17 steve Exp $" +#ident "$Id: sys_display.c,v 1.27 2001/07/16 18:40:19 steve Exp $" #endif # include "vpi_user.h" @@ -246,12 +246,12 @@ static int sys_display_calltf(char *name) info.scope = scope; array_from_iterator(&info, argv); - do_display(1, &info); + do_display(5, &info); free(info.items); if (strcmp(name,"$display") == 0) - vpi_printf("\n"); + vpi_mcd_printf(5, "\n"); return 0; } @@ -726,6 +726,10 @@ void sys_display_register() /* * $Log: sys_display.c,v $ + * Revision 1.27 2001/07/16 18:40:19 steve + * Add a stdlog output for vvp, and vvp options + * to direct them around. (Stephan Boettcher.) + * * Revision 1.26 2001/07/11 02:22:17 steve * Manually create the stage-2 callback structure. * diff --git a/vvp/config.h.in b/vvp/config.h.in index 80718ec52..b89576646 100644 --- a/vvp/config.h.in +++ b/vvp/config.h.in @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: config.h.in,v 1.5 2001/05/11 02:06:14 steve Exp $" +#ident "$Id: config.h.in,v 1.6 2001/07/16 18:40:19 steve Exp $" #endif # define SIZEOF_UNSIGNED_LONG 0 @@ -43,8 +43,14 @@ # define WITH_DEBUG 1 #endif +# undef HAVE_TIMES + /* * $Log: config.h.in,v $ + * Revision 1.6 2001/07/16 18:40:19 steve + * Add a stdlog output for vvp, and vvp options + * to direct them around. (Stephan Boettcher.) + * * Revision 1.5 2001/05/11 02:06:14 steve * Add the --enable-vvp-debug option to the configure * script of vvp, and detect getopt.h. diff --git a/vvp/configure.in b/vvp/configure.in index 23d6f482d..73e4d00b2 100644 --- a/vvp/configure.in +++ b/vvp/configure.in @@ -42,6 +42,18 @@ fi AC_SUBST(DLLIB) +AC_MSG_CHECKING(for sys/times) +AC_TRY_LINK( +#include +#include +,{clock_t a = times(0)/sysconf(_SC_CLK_TCK);}, +do_times=yes +AC_DEFINE(HAVE_TIMES,1), +do_times=no +) +AC_MSG_RESULT($do_times) + + # The -rdynamic flag is used by iverilog when compiling the target, # to know how to export symbols of the main program to loadable modules # that are brought in by -ldl. VPI support requires this. diff --git a/vvp/main.cc b/vvp/main.cc index b8be21643..29906b698 100644 --- a/vvp/main.cc +++ b/vvp/main.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: main.cc,v 1.16 2001/06/23 18:26:26 steve Exp $" +#ident "$Id: main.cc,v 1.17 2001/07/16 18:40:19 steve Exp $" #endif # include "config.h" @@ -28,6 +28,11 @@ # include "vpi_priv.h" # include # include +# include +#if defined(HAVE_TIMES) +# include +# include +#endif #if defined(HAVE_GETOPT_H) # include #endif @@ -38,12 +43,34 @@ extern "C" int optind; extern "C" const char*optarg; #endif +#if defined(HAVE_TIMES) +static double cycles_diff(struct tms *a, struct tms *b) +{ + clock_t aa = a->tms_utime + + a->tms_stime + + a->tms_cutime + + a->tms_cstime; + + clock_t bb = b->tms_utime + + b->tms_stime + + b->tms_cutime + + b->tms_cstime; + + return (aa-bb)/(double)sysconf(_SC_CLK_TCK); +} +#else // ! defined(HAVE_TIMES) +// Provide dummies +struct tms { int x; }; +inline static void times(struct tms *) { } +inline static double cycles_diff(struct tms *a, struct tms *b) { return 0; } +#endif // ! defined(HAVE_TIMES) + const char*module_path = MODULE_DIR; unsigned module_cnt = 0; const char*module_tab[64]; -extern void vpi_mcd_init(void); +extern void vpi_mcd_init(FILE *log); extern void vvp_vpi_init(void); int main(int argc, char*argv[]) @@ -52,17 +79,27 @@ int main(int argc, char*argv[]) unsigned flag_errors = 0; const char*design_path = 0; bool debug_flag = false; + bool verbose_flag = false; + struct tms cycles[3]; + char *logfile_name = 0x0; + FILE *logfile = 0x0; - while ((opt = getopt(argc, argv, "dM:m:")) != EOF) switch (opt) { + while ((opt = getopt(argc, argv, "dl:M:m:v")) != EOF) switch (opt) { case 'd': debug_flag = true; break; + case 'l': + logfile_name = optarg; + break; case 'M': module_path = optarg; break; case 'm': module_tab[module_cnt++] = optarg; break; + case 'v': + verbose_flag = true; + break; default: flag_errors += 1; } @@ -81,8 +118,24 @@ int main(int argc, char*argv[]) anything. It is done early because it is plausible that the compile might affect it, and it is cheap to do. */ - vpi_mcd_init(); + if (logfile_name) { + if (!strcmp(logfile_name, "-")) + logfile = stderr; + else + logfile = fopen(logfile_name, "w"); + if (!logfile) { + perror(logfile_name); + exit(1); + } + } + + if (verbose_flag) { + times(cycles+0); + fprintf(stderr, "Compiling VVP ...\n"); + } + vpi_mcd_init(logfile); + vvp_vpi_init(); compile_init(); @@ -94,6 +147,14 @@ int main(int argc, char*argv[]) return rc; compile_cleanup(); + if (verbose_flag) { + times(cycles+1); + fprintf(stderr, + " ... %G seconds\n" + "Running ...\n", + cycles_diff(cycles+1, cycles+0)); + } + if (compile_errors > 0) { fprintf(stderr, "%s: Program not runnable, %u errors.\n", design_path, compile_errors); @@ -107,11 +168,21 @@ int main(int argc, char*argv[]) schedule_simulate(); + if (verbose_flag) { + times(cycles+2); + fprintf(stderr, " ... %G seconds\n", + cycles_diff(cycles+2, cycles+1)); + } + return 0; } /* * $Log: main.cc,v $ + * Revision 1.17 2001/07/16 18:40:19 steve + * Add a stdlog output for vvp, and vvp options + * to direct them around. (Stephan Boettcher.) + * * Revision 1.16 2001/06/23 18:26:26 steve * Add the %shiftl/i0 instruction. * diff --git a/vvp/vpi_mcd.cc b/vvp/vpi_mcd.cc index 3fa9db0c7..24dbb7849 100644 --- a/vvp/vpi_mcd.cc +++ b/vvp/vpi_mcd.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: vpi_mcd.cc,v 1.4 2001/06/12 03:53:11 steve Exp $" +#ident "$Id: vpi_mcd.cc,v 1.5 2001/07/16 18:40:19 steve Exp $" #endif # include "vpi_priv.h" @@ -37,13 +37,13 @@ static struct mcd_entry mcd_table[32]; /* Initialize mcd portion of vpi. Must be called before * any vpi_mcd routines can be used. */ -void vpi_mcd_init(void) +void vpi_mcd_init(FILE *log) { mcd_table[0].fp = stdout; mcd_table[0].filename = ""; mcd_table[1].fp = stderr; mcd_table[1].filename = ""; - mcd_table[2].fp = stdout; /* TODO: initialize this to log file */ + mcd_table[2].fp = log; mcd_table[2].filename = ""; }