From c0d51dd2eb6478b52384a8006da0a1d8f19142a4 Mon Sep 17 00:00:00 2001 From: steve Date: Fri, 21 Apr 2000 06:41:02 +0000 Subject: [PATCH] Add the iverilog driver program. --- .cvsignore | 1 + Makefile.in | 14 ++++- iverilog.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 iverilog.c diff --git a/.cvsignore b/.cvsignore index 95a091a9e..aa1d8069f 100644 --- a/.cvsignore +++ b/.cvsignore @@ -9,6 +9,7 @@ configure Makefile verilog gverilog +iverilog config.status config.log config.cache diff --git a/Makefile.in b/Makefile.in index c4f7260c6..bc10b8b50 100644 --- a/Makefile.in +++ b/Makefile.in @@ -18,7 +18,7 @@ # 59 Temple Place - Suite 330 # Boston, MA 02111-1307, USA # -#ident "$Id: Makefile.in,v 1.45 2000/04/20 00:28:03 steve Exp $" +#ident "$Id: Makefile.in,v 1.46 2000/04/21 06:41:02 steve Exp $" # # SHELL = /bin/sh @@ -48,7 +48,7 @@ CPPFLAGS = @CPPFLAGS@ @DEFS@ CXXFLAGS = @CXXFLAGS@ -I$(srcdir) LDFLAGS = @LDFLAGS@ -all: ivl verilog gverilog +all: ivl verilog gverilog iverilog cd vpi ; $(MAKE) all cd vvm ; $(MAKE) all cd ivlpp ; $(MAKE) all @@ -105,6 +105,9 @@ ivl: $O gverilog: gverilog.c $(CC) $(CPPFLAGS) -o gverilog -DLIBDIR='"@libdir@"' -DINCDIR='"@includedir@"' gverilog.c +iverilog: iverilog.c + $(CC) $(CPPFLAGS) -o iverilog -DIVL_ROOT='"@libdir@/ivl"' iverilog.c + %.o dep/%.d: %.cc @[ -d dep ] || mkdir dep $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MD -c $< -o $*.o @@ -128,7 +131,7 @@ lexor_keyword.cc: lexor_keyword.gperf gperf -o -i 7 -C -k 1-3,$$ -L ANSI-C -H keyword_hash -N check_identifier -t lexor_keyword.gperf > lexor_keyword.cc -install: all installdirs $(bindir)/verilog $(bindir)/gverilog $(libdir)/ivl/ivl $(mandir)/man1/verilog.1 +install: all installdirs $(bindir)/verilog $(bindir)/gverilog $(bindir)/iverilog $(libdir)/ivl/ivl $(mandir)/man1/verilog.1 cd vpi ; $(MAKE) install cd vvm ; $(MAKE) install cd ivlpp ; $(MAKE) install @@ -139,6 +142,9 @@ $(bindir)/verilog: ./verilog $(bindir)/gverilog: ./gverilog $(INSTALL_PROGRAM) ./gverilog $(bindir)/gverilog +$(bindir)/iverilog: ./iverilog + $(INSTALL_PROGRAM) ./iverilog $(bindir)/iverilog + $(libdir)/ivl/ivl: ./ivl $(INSTALL_PROGRAM) ./ivl $(libdir)/ivl/ivl $(STRIP) $(libdir)/ivl/ivl @@ -152,6 +158,8 @@ installdirs: mkinstalldirs uninstall: rm -f $(libdir)/ivl/ivl rm -f $(bindir)/verilog + rm -f $(bindir)/gverilog + rm -f $(bindir)/iverilog rm -f $(mandir)/man1/verilog.1 cd vpi ; $(MAKE) uninstall cd vvm ; $(MAKE) uninstall diff --git a/iverilog.c b/iverilog.c new file mode 100644 index 000000000..a34db9557 --- /dev/null +++ b/iverilog.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2000 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined(WINNT) +#ident "$Id: iverilog.c,v 1.1 2000/04/21 06:41:03 steve Exp $" +#endif + +#include +#include +#include +#include + +#ifndef IVL_ROOT +# define IVL_ROOT "." +#endif + +const char*base = IVL_ROOT; +const char*opath = "a.out"; +const char*targ = "vvm"; +int verbose_flag = 0; + +static char cmdline[4096]; + +/* + * This function handles the vvm target. After preprocessing, run the + * ivl translator to get C++, then run g++ to make an executable + * program out of that. + */ +static int t_vvm() +{ + int rc; + + strcat(cmdline, " | "); + strcat(cmdline, base); + strcat(cmdline, "/ivl -o "); + strcat(cmdline, opath); + strcat(cmdline, ".cc -tvvm -Fcprop -Fnodangle "); + strcat(cmdline, " -- -"); + if (verbose_flag) + printf("translate: %s\n", cmdline); + rc = system(cmdline); + + if (rc != 0) { + fprintf(stderr, "errors translating Verilog program.\n"); + return rc; + } + + sprintf(cmdline, "g++ -O -rdynamic -fno-exceptions -o %s -I%s " + "-L%s %s.cc -lvvm -ldl", opath, base, base, opath); + + if (verbose_flag) + printf("compile: %s\n", cmdline); + + rc = system(cmdline); + if (rc != 0) { + fprintf(stderr, "errors compiling translated program.\n"); + return rc; + } + + sprintf(cmdline, "%s.cc", opath); + unlink(cmdline); + + return 0; +} + +static int t_xnf() +{ + int rc; + + strcat(cmdline, " | "); + strcat(cmdline, base); + strcat(cmdline, "/ivl -o "); + strcat(cmdline, opath); + strcat(cmdline, " -txnf -Fcprop -Fsynth -Fnodangle -Fxnfio"); + strcat(cmdline, " -- -"); + if (verbose_flag) + printf("translate: %s\n", cmdline); + rc = system(cmdline); + + return rc; +} + +int main(int argc, char **argv) +{ + int e_flag = 0; + int opt, idx; + char*cp; + + while ((opt = getopt(argc, argv, "B:Eo:t:v")) != EOF) { + + switch (opt) { + case 'B': + base = optarg; + break; + case 'E': + e_flag = 1; + break; + case 'o': + opath = optarg; + break; + case 't': + targ = optarg; + break; + case 'v': + verbose_flag = 1; + break; + case '?': + default: + return 1; + } + } + + /* Now collect the verilog source files. */ + + strcpy(cmdline, base); + cp = cmdline + strlen(cmdline); + strcpy(cp, "/ivlpp"); + cp += strlen(cp); + if (verbose_flag) { + strcpy(cp, " -v"); + cp += strlen(cp); + } + + for (idx = optind ; idx < argc ; idx += 1) { + sprintf(cp, " %s", argv[idx]); + cp += strlen(cp); + } + + /* If the -E flag was given on the command line, then all we + do is run the preprocessor and put the output where the + user wants it. */ + if (e_flag) { + if (strcmp(opath,"-") != 0) { + sprintf(cp, " > %s", opath); + cp += strlen(cp); + } + if (verbose_flag) + printf("preprocess: %s\n", cmdline); + + return system(cmdline); + } + + if (strcmp(targ,"vvm") == 0) + return t_vvm(); + else if (strcmp(targ,"xnf") == 0) + return t_xnf(); + else { + fprintf(stderr, "Unknown target: %s\n", targ); + return 1; + } + + return 0; +} + +/* + * $Log: iverilog.c,v $ + * Revision 1.1 2000/04/21 06:41:03 steve + * Add the iverilog driver program. + * + */ +