diff --git a/Makefile.in b/Makefile.in index e7ba3965b..b9da0a825 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.19 1999/09/29 00:42:50 steve Exp $" +#ident "$Id: Makefile.in,v 1.20 1999/09/29 01:50:35 steve Exp $" # # SHELL = /bin/sh @@ -62,7 +62,7 @@ FF = nobufz.o propinit.o sigfold.o xnfio.o xnfsyn.o O = main.o cprop.o design_dump.o elaborate.o elab_expr.o emit.o eval.o \ eval_tree.o functor.o \ -lexor.o mangle.o netlist.o pad_to_width.o \ +lexor.o lexor_keyword.o mangle.o netlist.o pad_to_width.o \ parse.o parse_misc.o pform.o pform_dump.o \ set_width.o \ verinum.o verireal.o target.o targets.o Module.o PDelays.o PExpr.o PGate.o \ diff --git a/README.txt b/README.txt index 568d5c815..33e2a4d63 100644 --- a/README.txt +++ b/README.txt @@ -281,6 +281,7 @@ especially testing from many people, including (in alphabetical order): Ales Hvezda James Lee Peter Monta + Daniel H. Nelsen Stefan Petersen Jason Schonberg Stuart Sutherland diff --git a/lexor.lex b/lexor.lex index ac39baf31..bc1d3a91a 100644 --- a/lexor.lex +++ b/lexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: lexor.lex,v 1.34 1999/09/13 03:08:52 steve Exp $" +#ident "$Id: lexor.lex,v 1.35 1999/09/29 01:50:35 steve Exp $" #endif //# define YYSTYPE lexval @@ -41,7 +41,7 @@ extern YYLTYPE yylloc; static void reset_lexor(); static void line_directive(); -static int check_identifier(const char*name); +extern int check_identifier(const char*str, int len); static verinum*make_sized_binary(const char*txt); static verinum*make_sized_dec(const char*txt); static verinum*make_unsized_dec(const char*txt); @@ -128,7 +128,7 @@ W [ \t\b\f\r]+ [pPnN01\?\*\-] { return yytext[0]; } [a-zA-Z_][a-zA-Z0-9$_]* { - int rc = check_identifier(yytext); + int rc = check_identifier(yytext, yyleng); if (rc == IDENTIFIER) yylval.text = strdup(yytext); else @@ -305,118 +305,6 @@ void lex_end_table() BEGIN(INITIAL); } -static const struct { const char*name; int code; } key_table[] = { - { "always", K_always }, - { "and", K_and }, - { "assign", K_assign }, - { "begin", K_begin }, - { "buf", K_buf }, - { "bufif0", K_bufif0 }, - { "bufif1", K_bufif1 }, - { "case", K_case }, - { "casex", K_casex }, - { "casez", K_casez }, - { "cmos", K_cmos }, - { "deassign", K_deassign }, - { "default", K_default }, - { "defparam", K_defparam }, - { "disable", K_disable }, - { "edge", K_edge }, - { "else", K_else }, - { "end", K_end }, - { "endcase", K_endcase }, - { "endfunction", K_endfunction }, - { "endmodule", K_endmodule }, - { "endprimitive", K_endprimitive }, - { "endspecify", K_endspecify }, - { "endtable", K_endtable }, - { "endtask", K_endtask }, - { "event", K_event }, - { "for", K_for }, - { "force", K_force }, - { "forever", K_forever }, - { "fork", K_fork }, - { "function", K_function }, - { "highz0", K_highz0 }, - { "highz1", K_highz1 }, - { "if", K_if }, - { "initial", K_initial }, - { "inout", K_inout }, - { "input", K_input }, - { "integer", K_integer }, - { "join", K_join }, - { "large", K_large }, - { "macromodule", K_macromodule }, - { "medium", K_medium }, - { "module", K_module }, - { "nand", K_nand }, - { "negedge", K_negedge }, - { "nmos", K_nmos }, - { "nor", K_nor }, - { "not", K_not }, - { "notif0", K_notif0 }, - { "notif1", K_notif1 }, - { "or", K_or }, - { "output", K_output }, - { "parameter", K_parameter }, - { "pmos", K_pmos }, - { "posedge", K_posedge }, - { "primitive", K_primitive }, - { "pull0", K_pull0 }, - { "pull1", K_pull1 }, - { "pulldown", K_pulldown }, - { "pullup", K_pullup }, - { "rcmos", K_rcmos }, - { "reg", K_reg }, - { "release", K_release }, - { "repeat", K_repeat }, - { "rnmos", K_rnmos }, - { "rpmos", K_rpmos }, - { "rtran", K_rtran }, - { "rtranif0", K_rtranif0 }, - { "rtranif1", K_rtranif1 }, - { "scalered", K_scalered }, - { "small", K_small }, - { "specify", K_specify }, - { "specparam", K_specparam }, - { "strong0", K_strong0 }, - { "strong1", K_strong1 }, - { "supply0", K_supply0 }, - { "supply1", K_supply1 }, - { "table", K_table }, - { "task", K_task }, - { "time", K_time }, - { "tran", K_tran }, - { "tranif0", K_tranif0 }, - { "tranif1", K_tranif1 }, - { "tri", K_tri }, - { "tri0", K_tri0 }, - { "tri1", K_tri1 }, - { "triand", K_triand }, - { "trior", K_trior }, - { "trireg", K_trireg }, - { "vectored", K_vectored }, - { "wait", K_wait }, - { "wand", K_wand }, - { "weak0", K_weak0 }, - { "weak1", K_weak1 }, - { "while", K_while }, - { "wire", K_wire }, - { "wor", K_wor }, - { "xnor", K_xnor }, - { "xor", K_xor }, - { 0, IDENTIFIER } -}; - -static int check_identifier(const char*name) -{ - for (unsigned idx = 0 ; key_table[idx].name ; idx += 1) - if (strcmp(key_table[idx].name, name) == 0) - return key_table[idx].code; - - return IDENTIFIER; -} - static verinum*make_binary_with_size(unsigned size, bool fixed, const char*ptr) { assert(tolower(*ptr) == 'b'); diff --git a/lexor_keyword.cc b/lexor_keyword.cc new file mode 100644 index 000000000..07af2f464 --- /dev/null +++ b/lexor_keyword.cc @@ -0,0 +1,230 @@ +/* C code produced by gperf version 2.7 */ +/* Command-line: gperf -o -i 1 -C -k 1-3,$ -L C -H keyword_hash -N check_identifier -tT lexor_keyword.gperf > lexor_keyword.cc */ + +#include "parse_misc.h" +#include "parse.h" +#include + + +#define TOTAL_KEYWORDS 99 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 12 +#define MIN_HASH_VALUE 7 +#define MAX_HASH_VALUE 239 +/* maximum key range = 233, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#endif +static unsigned int +keyword_hash (const char *str, int len) +{ + static const unsigned char asso_values[] = + { + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 126, 66, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 31, 11, 81, + 1, 1, 81, 26, 11, 51, 11, 21, 81, 81, + 1, 46, 16, 240, 1, 1, 6, 11, 36, 46, + 21, 16, 6, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240 + }; + int hval = len; + + hval += asso_values[(unsigned char)str[len - 1]]; + hval += asso_values[(unsigned char)str[0]]; + hval += asso_values[(unsigned char)str[1]]; + + if (len > 2) + hval += asso_values[(unsigned char)str[2]]; + + return hval ; +} + +int +check_identifier (const char *str, int len) +{ + static const struct { const char *name; int tokenType; } wordlist[] = + { + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"end", K_end}, + {""}, {""}, {""}, + {"endcase", K_endcase}, + {"endtable", K_endtable}, + {"endmodule", K_endmodule}, + {"rtran", K_rtran}, + {"endfunction", K_endfunction}, + {"endprimitive", K_endprimitive}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"endspecify", K_endspecify}, + {"repeat", K_repeat}, + {"endtask", K_endtask}, + {""}, + {"edge", K_edge}, + {""}, {""}, + {"negedge", K_negedge}, + {"and", K_and}, + {"nand", K_nand}, + {""}, + {"assign", K_assign}, + {"specify", K_specify}, + {"deassign", K_deassign}, + {"tran", K_tran}, + {"begin", K_begin}, + {""}, {""}, {""}, {""}, + {"event", K_event}, + {"or", K_or}, + {""}, + {"nor", K_nor}, + {""}, + {"table", K_table}, + {""}, {""}, + {"reg", K_reg}, + {"parameter", K_parameter}, + {""}, {""}, + {"disable", K_disable}, + {"not", K_not}, + {"task", K_task}, + {"trior", K_trior}, + {"triand", K_triand}, + {"integer", K_integer}, + {""}, {""}, {""}, {""}, + {"posedge", K_posedge}, + {"xor", K_xor}, + {"xnor", K_xnor}, + {""}, + {"output", K_output}, + {""}, {""}, + {"primitive", K_primitive}, + {"input", K_input}, + {""}, + {"strong1", K_strong1}, + {"rtranif1", K_rtranif1}, + {"wand", K_wand}, + {""}, {""}, {""}, {""}, + {"else", K_else}, + {"rnmos", K_rnmos}, + {"trireg", K_trireg}, + {"release", K_release}, + {""}, {""}, {""}, {""}, + {"default", K_default}, + {"wor", K_wor}, + {""}, {""}, {""}, + {"supply1", K_supply1}, + {"function", K_function}, + {"wire", K_wire}, + {"rpmos", K_rpmos}, + {""}, {""}, {""}, + {"specparam", K_specparam}, + {"inout", K_inout}, + {""}, + {"tranif1", K_tranif1}, + {"tri", K_tri}, + {"join", K_join}, + {"while", K_while}, + {""}, {""}, + {"pulldown", K_pulldown}, + {"case", K_case}, + {"large", K_large}, + {""}, {""}, + {"scalered", K_scalered}, + {""}, + {"casez", K_casez}, + {"notif1", K_notif1}, + {""}, + {"vectored", K_vectored}, + {"tri1", K_tri1}, + {""}, + {"pullup", K_pullup}, + {""}, + {"for", K_for}, + {"nmos", K_nmos}, + {"force", K_force}, + {"module", K_module}, + {"forever", K_forever}, + {""}, + {"wait", K_wait}, + {"casex", K_casex}, + {""}, + {"strong0", K_strong0}, + {"rtranif0", K_rtranif0}, + {"time", K_time}, + {""}, {""}, {""}, {""}, + {"pmos", K_pmos}, + {"weak1", K_weak1}, + {""}, {""}, {""}, + {"fork", K_fork}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"highz1", K_highz1}, + {"supply0", K_supply0}, + {""}, {""}, {""}, + {"always", K_always}, + {""}, {""}, {""}, + {"rcmos", K_rcmos}, + {"medium", K_medium}, + {"tranif0", K_tranif0}, + {"defparam", K_defparam}, + {""}, {""}, + {"bufif1", K_bufif1}, + {""}, {""}, {""}, + {"pull1", K_pull1}, + {""}, {""}, {""}, {""}, {""}, + {"notif0", K_notif0}, + {""}, + {"buf", K_buf}, + {"tri0", K_tri0}, + {""}, {""}, + {"initial", K_initial}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"small", K_small}, + {""}, {""}, {""}, {""}, {""}, + {"macromodule", K_macromodule}, + {""}, {""}, {""}, + {"weak0", K_weak0}, + {""}, {""}, {""}, + {"cmos", K_cmos}, + {""}, + {"if", K_if}, + {""}, {""}, {""}, {""}, + {"highz0", K_highz0}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"bufif0", K_bufif0}, + {""}, {""}, {""}, + {"pull0", K_pull0} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + int key = keyword_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return wordlist[key].tokenType; + } + } + return IDENTIFIER; +} \ No newline at end of file diff --git a/lexor_keyword.gperf b/lexor_keyword.gperf new file mode 100644 index 000000000..d275f79f4 --- /dev/null +++ b/lexor_keyword.gperf @@ -0,0 +1,112 @@ +%{ +/* Command-line: gperf -o -i 1 -C -k 1-3,$ -L C -H keyword_hash -N check_identifier -tT lexor_keyword.gperf */ + +#include "parse_misc.h" +#include "parse.h" +#include + +%} +struct Keywords { + char *name; + int tokenType; +} Keywords; +%% +always, K_always +and, K_and +assign, K_assign +begin, K_begin +buf, K_buf +bufif0, K_bufif0 +bufif1, K_bufif1 +case, K_case +casex, K_casex +casez, K_casez +cmos, K_cmos +deassign, K_deassign +default, K_default +defparam, K_defparam +disable, K_disable +edge, K_edge +else, K_else +end, K_end +endcase, K_endcase +endfunction, K_endfunction +endmodule, K_endmodule +endprimitive, K_endprimitive +endspecify, K_endspecify +endtable, K_endtable +endtask, K_endtask +event, K_event +for, K_for +force, K_force +forever, K_forever +fork, K_fork +function, K_function +highz0, K_highz0 +highz1, K_highz1 +if, K_if +initial, K_initial +inout, K_inout +input, K_input +integer, K_integer +join, K_join +large, K_large +macromodule, K_macromodule +medium, K_medium +module, K_module +nand, K_nand +negedge, K_negedge +nmos, K_nmos +nor, K_nor +not, K_not +notif0, K_notif0 +notif1, K_notif1 +or, K_or +output, K_output +parameter, K_parameter +pmos, K_pmos +posedge, K_posedge +primitive, K_primitive +pull0, K_pull0 +pull1, K_pull1 +pulldown, K_pulldown +pullup, K_pullup +rcmos, K_rcmos +reg, K_reg +release, K_release +repeat, K_repeat +rnmos, K_rnmos +rpmos, K_rpmos +rtran, K_rtran +rtranif0, K_rtranif0 +rtranif1, K_rtranif1 +scalered, K_scalered +small, K_small +specify, K_specify +specparam, K_specparam +strong0, K_strong0 +strong1, K_strong1 +supply0, K_supply0 +supply1, K_supply1 +table, K_table +task, K_task +time, K_time +tran, K_tran +tranif0, K_tranif0 +tranif1, K_tranif1 +tri, K_tri +tri0, K_tri0 +tri1, K_tri1 +triand, K_triand +trior, K_trior +trireg, K_trireg +vectored, K_vectored +wait, K_wait +wand, K_wand +weak0, K_weak0 +weak1, K_weak1 +while, K_while +wire, K_wire +wor, K_wor +xnor, K_xnor +xor, K_xor \ No newline at end of file