From 8cf1fd1820df515cd68c051f720a3405b06b94fe Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 13 Dec 2010 06:02:18 +0200 Subject: [PATCH] Introduce shell of vhdlpp program. Create the makefiles and configuration scripts to hold together the vhdlpp front-end program. Create a shell main. --- .gitignore | 7 +++ Makefile.in | 2 +- configure.in | 3 +- vhdlpp/Makefile.in | 102 +++++++++++++++++++++++++++++++++++++ vhdlpp/compiler.h | 24 +++++++++ vhdlpp/lexor.lex | 73 ++++++++++++++++++++++++++ vhdlpp/lexor_keyword.gperf | 34 +++++++++++++ vhdlpp/main.cc | 70 +++++++++++++++++++++++++ vhdlpp/parse.y | 64 +++++++++++++++++++++++ vhdlpp/parse_api.h | 38 ++++++++++++++ vhdlpp/vhdlpp_config.h.in | 40 +++++++++++++++ 11 files changed, 455 insertions(+), 2 deletions(-) create mode 100644 vhdlpp/Makefile.in create mode 100644 vhdlpp/compiler.h create mode 100644 vhdlpp/lexor.lex create mode 100644 vhdlpp/lexor_keyword.gperf create mode 100644 vhdlpp/main.cc create mode 100644 vhdlpp/parse.y create mode 100644 vhdlpp/parse_api.h create mode 100644 vhdlpp/vhdlpp_config.h.in diff --git a/.gitignore b/.gitignore index 21e8b33cb..f27cdac9d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,13 @@ dep /ivlpp/lexor.c +/vhdlpp/lexor.cc +/vhdlpp/lexor_keyword.cc +/vhdlpp/parse.cc +/vhdlpp/parse.h +/vhdlpp/vhdlpp_config.h +/vhdlpp/vhdlpp + /lexor.cc /lexor_keyword.cc /parse.cc diff --git a/Makefile.in b/Makefile.in index fcad472a3..50ca70ee6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -38,7 +38,7 @@ exec_prefix = @exec_prefix@ srcdir = @srcdir@ datarootdir = @datarootdir@ -SUBDIRS = ivlpp vvp vpi libveriuser cadpli tgt-null tgt-stub tgt-vvp \ +SUBDIRS = ivlpp vhdlpp vvp vpi libveriuser cadpli tgt-null tgt-stub tgt-vvp \ tgt-vhdl tgt-vlog95 driver # Only run distclean for these directories. NOTUSED = tgt-fpga tgt-pal tgt-verilog diff --git a/configure.in b/configure.in index edbcf90c9..d3ca2fdc9 100644 --- a/configure.in +++ b/configure.in @@ -2,6 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(netlist.h) AC_CONFIG_HEADER(config.h) AC_CONFIG_HEADER(_pli_types.h) +AC_CONFIG_HEADER(vhdlpp/vhdlpp_config.h) AC_CONFIG_HEADER(vvp/config.h) AC_CONFIG_HEADER(vpi/vpi_config.h) AC_CONFIG_HEADER(libveriuser/config.h) @@ -295,4 +296,4 @@ AC_MSG_RESULT(ok) # XXX disable tgt-fpga for the moment -AC_OUTPUT(Makefile ivlpp/Makefile vvp/Makefile vpi/Makefile driver/Makefile driver-vpi/Makefile cadpli/Makefile libveriuser/Makefile tgt-null/Makefile tgt-stub/Makefile tgt-vvp/Makefile tgt-vhdl/Makefile tgt-fpga/Makefile tgt-verilog/Makefile tgt-pal/Makefile tgt-vlog95/Makefile) +AC_OUTPUT(Makefile ivlpp/Makefile vhdlpp/Makefile vvp/Makefile vpi/Makefile driver/Makefile driver-vpi/Makefile cadpli/Makefile libveriuser/Makefile tgt-null/Makefile tgt-stub/Makefile tgt-vvp/Makefile tgt-vhdl/Makefile tgt-fpga/Makefile tgt-verilog/Makefile tgt-pal/Makefile tgt-vlog95/Makefile) diff --git a/vhdlpp/Makefile.in b/vhdlpp/Makefile.in new file mode 100644 index 000000000..55e272257 --- /dev/null +++ b/vhdlpp/Makefile.in @@ -0,0 +1,102 @@ +# +# This source code is free software; you can redistribute it +# and/or modify it in source code form under the terms of the GNU +# Library 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 Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 +# +SHELL = /bin/sh + +suffix = @install_suffix@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +srcdir = @srcdir@ + +VPATH = $(srcdir) + +bindir = @bindir@ +libdir = @libdir@ +includedir = $(prefix)/include + +CC = @CC@ +CXX = @CXX@ +INSTALL = @INSTALL@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +LEX = @LEX@ +YACC = @YACC@ + +ifeq (.,.) +INCLUDE_PATH = -I. -I.. +else +INCLUDE_PATH = -I. -I.. -I$(srcdir) -I$(srcdir)/.. +endif + +CPPFLAGS = $(INCLUDE_PATH) @CPPFLAGS@ @DEFS@ +CFLAGS = @WARNING_FLAGS@ @CFLAGS@ +CXXFLAGS = @WARNING_FLAGS@ @WARNING_FLAGS_CXX@ @CXXFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ @EXTRALIBS@ + +O = main.o lexor.o lexor_keyword.o parse.o + +all: dep vhdlpp@EXEEXT@ + +clean: + rm -f *.o *~ + rm -rf dep vhdlpp@EXEEXT@ + +distclean: clean + rm -f Makefile config.log + rm -f stamp-vhdlpp_config-h vhdlpp_config.h + +Makefile: $(srcdir)/Makefile.in + cd ..; ./config.status --file=vhdlpp/$@ + +dep: + mkdir dep + +vhdlpp@EXEEXT@: $O + $(CXX) -o vhdlpp@EXEEXT@ $(LDFLAGS) $O $(LIBS) + +%.o: %.cc vhdlpp_config.h + $(CXX) $(CPPFLAGS) $(CXXFLAGS) @DEPENDENCY_FLAG@ -c $< -o $*.o + mv $*.d dep/$*.d + +lexor.o: lexor.cc parse.h + +parse.o: parse.cc + +lexor.cc: $(srcdir)/lexor.lex + $(LEX) -s -olexor.cc $(srcdir)/lexor.lex + +parse.cc parse.h: $(srcdir)/parse.y + $(YACC) --verbose -t -d -o parse.cc $(srcdir)/parse.y + mv parse.cc.h parse.h 2>/dev/null || mv parse.hh parse.h + +lexor_keyword.o: lexor_keyword.cc parse.h + +lexor_keyword.cc: $(srcdir)/lexor_keyword.gperf + gperf -o -i 7 --ignore-case -C -k 1-4,6,9,$$ -L ANSI-C -H keyword_hash -N check_identifier -t $(srcdir)/lexor_keyword.gperf > lexor_keyword.cc || (rm -f lexor_keyword.cc ; false) + + +stamp-vhdlpp_config-h: $(srcdir)/vhdlpp_config.h.in ../config.status + @rm -f $@ + cd ..; ./config.status --header=vhdlpp/vhdlpp_config.h +vhplpp_config.h: stamp-vhdlpp_config-h + + +-include $(patsubst %.o, dep/%.d, $O) diff --git a/vhdlpp/compiler.h b/vhdlpp/compiler.h new file mode 100644 index 000000000..cf32453cd --- /dev/null +++ b/vhdlpp/compiler.h @@ -0,0 +1,24 @@ +#ifndef __compiler_H +#define __compiler_H +/* + * Copyright (c) 1999-2010 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 + */ + +const int GN_KEYWORD_2008 = 0x0001; + +#endif diff --git a/vhdlpp/lexor.lex b/vhdlpp/lexor.lex new file mode 100644 index 000000000..42ea32bda --- /dev/null +++ b/vhdlpp/lexor.lex @@ -0,0 +1,73 @@ + +%option never-interactive +%option nounput +%option noyywrap + +%{ +/* + * Copyright (c) 2011 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 + */ + +# include "parse_api.h" +# include "lexor_keyword.h" + +extern int lexor_keyword_code (const char*str, unsigned len); + +/* + * Lexical location information is passed in the yylloc variable to th + * parser. The file names, strings, are kept in a list so that I can + * re-use them. The set_file_name function will return a pointer to + * the name as it exists in the list (and delete the passed string.) + * If the name is new, it will be added to the list. + */ +YYLTYPE yylloc; + +static int comment_enter; + +%} + +%x CCOMMENT +%x LCOMMENT + +W [ \t\b\f\r]+ + +%% + +[ \t\b\f\r] { ; } +\n { yylloc.first_line += 1; } + + /* Single-line comments start with - - and run to the end of the + current line. These are very easy to handle. */ + +"--".* { comment_enter = YY_START; BEGIN(LCOMMENT); } +. { yymore(); } +\n { yylloc.first_line += 1; BEGIN(comment_enter); } + + + + /* The contents of C-style comments are ignored, like white space. */ + +"/*" { comment_enter = YY_START; BEGIN(CCOMMENT); } +. { ; } +\n { yylloc.first_line += 1; } +"*/" { BEGIN(comment_enter); } + +[a-zA-Z_][a-zA-Z0-9_]* { + int rc = lexor_keyword_code(yytext, yyleng); + return rc; + } diff --git a/vhdlpp/lexor_keyword.gperf b/vhdlpp/lexor_keyword.gperf new file mode 100644 index 000000000..69dd9d324 --- /dev/null +++ b/vhdlpp/lexor_keyword.gperf @@ -0,0 +1,34 @@ +/* + * We need this to prevent -Wextra (-W) from complaining that the mask and + * tokenType values are not initialized for the empty table entries. + */ +%define initializer-suffix ,0,0 + +%{ +/* Command-line: gperf -o -i 1 --ignore-case -C -k 1-3,$ -L C -H keyword_hash -N check_identifier -tT lexor_keyword.gperf */ + +#include "vhdlpp_config.h" +#include +#include "compiler.h" +#include "parse.h" + +%} +struct lexor_keyword { const char*name; int mask; int tokenType; }; +%% +abs, GN_KEYWORD_2008, K_abs +access, GN_KEYWORD_2008, K_access +architecture, GN_KEYWORD_2008, K_architecture +%% + +int lexor_keyword_mask = GN_KEYWORD_2008; + +int lexor_keyword_code(const char*str, unsigned nstr) +{ + const struct lexor_keyword*rc = check_identifier(str, nstr); + if (rc == 0) + return IDENTIFIER; + else if ((rc->mask & lexor_keyword_mask) == 0) + return IDENTIFIER; + else + return rc->tokenType; +} diff --git a/vhdlpp/main.cc b/vhdlpp/main.cc new file mode 100644 index 000000000..f42548fae --- /dev/null +++ b/vhdlpp/main.cc @@ -0,0 +1,70 @@ + +const char COPYRIGHT[] = + "Copyright (c) 2011 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 + */ +# include "vhdlpp_config.h" +# include "version_base.h" +# include "version_tag.h" + +const char NOTICE[] = +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n" +; + +# include +# include +#if defined(HAVE_GETOPT_H) +# include +#endif + +int main(int argc, char*argv[]) +{ + int opt; + + while ( (opt=getopt(argc, argv, "vV")) != EOF) switch (opt) { + + case 'v': + fprintf(stderr, "Icarus Verilog VHDL Parse version " + VERSION " (" VERSION_TAG ")\n\n"); + fprintf(stderr, "%s\n\n", COPYRIGHT); + fputs(NOTICE, stderr); + break; + + case 'V': + fprintf(stdout, "Icarus Verilog VHDL Parse version " + VERSION " (" VERSION_TAG ")\n\n"); + fprintf(stdout, "%s\n\n", COPYRIGHT); + fputs(NOTICE, stdout); + break; + + } + + return 0; +} diff --git a/vhdlpp/parse.y b/vhdlpp/parse.y new file mode 100644 index 000000000..c05e13ea5 --- /dev/null +++ b/vhdlpp/parse.y @@ -0,0 +1,64 @@ + +%{ +/* + * Copyright (c) 2011 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 + */ + +# include "vhdlpp_config.h" +# include "parse_api.h" + +static void yyerror(const char*msg); + +%} + + /* The keywords are all tokens. */ +%token K_abs K_access K_after K_alias K_all K_and K_architecture +%token K_array K_assert K_assume K_assume_guarantee K_attribute +%token K_begin K_block K_body K_buffer K_bus +%token K_case K_component K_configuration K_constant K_context K_cover +%token K_default K_disconect K_downto +%token K_else K_elsif K_end K_entity K_exit +%token K_fairness K_file K_for K_force K_function +%token K_generate K_generic K_group K_guarded +%token K_if K_impure K_in K_internal K_inout K_is +%token K_label K_library K_linkage K_literal K_loop +%token K_map K_mod +%token K_nand K_new K_next K_nor K_not K_null +%token K_of K_on K_open K_or K_others K_out +%token K_package K_parameter K_port K_postponed K_procedure K_process +%token K_property K_protected K_pure +%token K_range K_record K_register K_reject K_release K_rem K_report +%token K_restrict K_restrict_guarantee K_return K_rol K_ror +%token K_select K_sequence K_seerity K_signal K_shared +%token K_sla K_sll K_sra K_srl K_string K_subtype +%token K_then K_to K_transport K_type +%token K_unaffected K_units K_until K_use +%token K_variable K_vmode K_vprop K_vunit +%token K_wait K_when K_while K_with +%token K_xnor K_xor + /* Identifiers that are not keywords are identifiers. */ +%token IDENTIFIER +%% + +main : ; + +%% + +static void yyerror(const char*msg) +{ +} diff --git a/vhdlpp/parse_api.h b/vhdlpp/parse_api.h new file mode 100644 index 000000000..31d528dce --- /dev/null +++ b/vhdlpp/parse_api.h @@ -0,0 +1,38 @@ +#ifndef __parse_api_H +#define __parse_api_H +/* + * Copyright (c) 2011 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 + */ + +/* + * The vlltype supports the passing of detailed source file location + * information between the lexical analyzer and the parser. Defining + * YYLTYPE compels the lexor to use this type and not something other. + */ +struct yyltype { + unsigned first_line; + unsigned first_column; + unsigned last_line; + unsigned last_column; + const char*text; +}; +# define YYLTYPE struct yyltype + +extern int yylex(void); + +#endif diff --git a/vhdlpp/vhdlpp_config.h.in b/vhdlpp/vhdlpp_config.h.in new file mode 100644 index 000000000..b48d2caef --- /dev/null +++ b/vhdlpp/vhdlpp_config.h.in @@ -0,0 +1,40 @@ +#ifndef __vhdlpp_config_H /* -*- c++ -*- */ +#define __vhdlpp_config_H +/* + * Copyright (c) 2011 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(__cplusplus) +# if !defined(__GNUC__) + using namespace std; +# elif (__GNUC__ == 3) + using namespace std; +# endif +#endif + +# undef HAVE_GETOPT_H +# undef HAVE_INTTYPES_H +# undef HAVE_LIBIBERTY_H +# undef HAVE_FCHMOD +# undef HAVE_SYS_WAIT_H + +#ifdef HAVE_INTTYPES_H +# include +#endif + +#endif /* __config_H */