diff --git a/Makefile.in b/Makefile.in index a603a5996..9e92fa070 100644 --- a/Makefile.in +++ b/Makefile.in @@ -174,7 +174,7 @@ lexor.cc: $(srcdir)/lexor.lex lexor_keyword.o: lexor_keyword.cc parse.h lexor_keyword.cc: lexor_keyword.gperf - gperf -o -i 7 -C -k 1-3,$$ -L ANSI-C -H keyword_hash -N check_identifier -t $(srcdir)/lexor_keyword.gperf > lexor_keyword.cc || (rm -f lexor_keyword.cc ; false) + gperf -o -i 7 -C -k 1-4,$$ -L ANSI-C -H keyword_hash -N check_identifier -t $(srcdir)/lexor_keyword.gperf > lexor_keyword.cc || (rm -f lexor_keyword.cc ; false) iverilog-vpi.ps: $(srcdir)/iverilog-vpi.man man -t $(srcdir)/iverilog-vpi.man > iverilog-vpi.ps @@ -217,7 +217,7 @@ endif XNF_INSTALL = $(libdir)/ivl/xnf.conf $(libdir)/ivl/xnf-s.conf -install: all installdirs $(libdir)/ivl/ivl@EXEEXT@ $(libdir)/ivl/include/constants.vams $(includedir)/ivl_target.h $(includedir)/_pli_types.h $(includedir)/vpi_user.h $(includedir)/acc_user.h $(includedir)/veriuser.h $(WIN32_INSTALL) $(INSTALL_DOC) +install: all installdirs $(libdir)/ivl/ivl@EXEEXT@ $(libdir)/ivl/include/constants.vams $(libdir)/ivl/include/disciplines.vams $(includedir)/ivl_target.h $(includedir)/_pli_types.h $(includedir)/vpi_user.h $(includedir)/acc_user.h $(includedir)/veriuser.h $(WIN32_INSTALL) $(INSTALL_DOC) for dir in $(SUBDIRS); do (cd $$dir ; $(MAKE) $@); done for dir in vpi ivlpp driver; \ do (cd $$dir ; $(MAKE) $@); done @@ -231,6 +231,9 @@ $(libdir)/ivl/ivl@EXEEXT@: ./ivl@EXEEXT@ $(libdir)/ivl/include/constants.vams: $(srcdir)/constants.vams $(INSTALL_DATA) $(srcdir)/constants.vams $@ +$(libdir)/ivl/include/disciplines.vams: $(srcdir)/disciplines.vams + $(INSTALL_DATA) $(srcdir)/disciplines.vams $@ + $(libdir)/ivl/xnf-s.conf: $(srcdir)/xnf-s.conf $(INSTALL_DATA) $(srcdir)/xnf-s.conf $(DESTDIR)$(libdir)/ivl/xnf-s.conf @@ -286,7 +289,7 @@ uninstall: for dir in $(SUBDIRS); do (cd $$dir ; $(MAKE) $@); done for dir in vpi ivlpp driver; \ do (cd $$dir ; $(MAKE) $@); done - for f in xnf.conf xnf-s.conf ivl@EXEEXT@ include/constants.vams; \ + for f in xnf.conf xnf-s.conf ivl@EXEEXT@ include/constants.vams include/disciplines.vams; \ do rm -f $(DESTDIR)$(libdir)/ivl/$$f; done -rmdir $(DESTDIR)$(libdir)/ivl/include -rmdir $(DESTDIR)$(libdir)/ivl diff --git a/disciplines.vams b/disciplines.vams new file mode 100644 index 000000000..f934a6e5a --- /dev/null +++ b/disciplines.vams @@ -0,0 +1,72 @@ + +// Standard definitions for Verilog-AMS +`ifdef DISCIPLINES_VAMS +`else +`define DISCIPLINES_VAMS 1 + +discipline \logic + domain discrete; +enddiscipline + +discipline ddiscrete + domain discrete; +enddiscipline + +nature Current + units = "A"; + access = I; + idt_nature = Charge; +`ifdef CURRENT_ABSTOL + abstol = `CURRENT_ABSTOL +`else + abstol = 1e-12; +`endif +endnature + +nature Charge + units = "coul"; + access = Q; + ddt_nature = Current; +`ifdef CHARGE_ABSTOL + abstol = `CHARGE_ABSTOL; +`else + abstol = 1e-14; +`endif +endnature + +nature Voltage + units = "V"; + access = V; + idt_nature = Flux; +`ifdef VOLTAGE_ABSTOL + abstol = `VOLTAGE_ABSTOL; +`else + abstol = 1e-6; +`endif +endnature + +nature Flux + units = "Wb"; + access = Phi; + ddt_nature = Voltage; +`ifdef FLUX_ABSTOL + abstol = `flux_ABSTOL; +`else + abstol = 1e-9; +`endif +endnature + +discipline electrical + potential Voltage; + flow Current; +enddiscipline + +discipline voltage + potential Voltage; +enddiscipline + +discipline current + flow Current; +enddiscipline + +`endif // !`ifdef DISCIPLINES_VAMS diff --git a/lexor_keyword.gperf b/lexor_keyword.gperf index 554089607..5d8c05035 100644 --- a/lexor_keyword.gperf +++ b/lexor_keyword.gperf @@ -12,9 +12,12 @@ struct lexor_keyword { const char*name; int mask; int tokenType; }; %% abs, GN_KEYWORDS_VAMS_2_3, K_abs +abstol, GN_KEYWORDS_VAMS_2_3, K_abstol +access, GN_KEYWORDS_VAMS_2_3, K_access acos, GN_KEYWORDS_VAMS_2_3, K_acos acosh, GN_KEYWORDS_VAMS_2_3, K_acosh always, GN_KEYWORDS_1364_1995, K_always +analog, GN_KEYWORDS_VAMS_2_3, K_analog and, GN_KEYWORDS_1364_1995, K_and asin, GN_KEYWORDS_VAMS_2_3, K_asin asinh, GN_KEYWORDS_VAMS_2_3, K_asinh @@ -32,36 +35,48 @@ casex, GN_KEYWORDS_1364_1995, K_casex casez, GN_KEYWORDS_1364_1995, K_casez ceil, GN_KEYWORDS_VAMS_2_3, K_ceil cmos, GN_KEYWORDS_1364_1995, K_cmos +continuous, GN_KEYWORDS_VAMS_2_3, K_continuous cos, GN_KEYWORDS_VAMS_2_3, K_cos cosh, GN_KEYWORDS_VAMS_2_3, K_cosh +ddt_nature, GN_KEYWORDS_VAMS_2_3, K_ddt_nature deassign, GN_KEYWORDS_1364_1995, K_deassign default, GN_KEYWORDS_1364_1995, K_default defparam, GN_KEYWORDS_1364_1995, K_defparam disable, GN_KEYWORDS_1364_1995, K_disable +discipline, GN_KEYWORDS_VAMS_2_3, K_discipline +discrete, GN_KEYWORDS_VAMS_2_3, K_discrete +domain, GN_KEYWORDS_VAMS_2_3, K_domain edge, GN_KEYWORDS_1364_1995, K_edge else, GN_KEYWORDS_1364_1995, K_else end, GN_KEYWORDS_1364_1995, K_end endcase, GN_KEYWORDS_1364_1995, K_endcase +enddiscipline, GN_KEYWORDS_VAMS_2_3, K_enddiscipline endfunction, GN_KEYWORDS_1364_1995, K_endfunction endgenerate, GN_KEYWORDS_1364_1995, K_endgenerate endmodule, GN_KEYWORDS_1364_1995, K_endmodule +endnature, GN_KEYWORDS_VAMS_2_3, K_endnature endprimitive, GN_KEYWORDS_1364_1995, K_endprimitive endspecify, GN_KEYWORDS_1364_1995, K_endspecify endtable, GN_KEYWORDS_1364_1995, K_endtable endtask, GN_KEYWORDS_1364_1995, K_endtask event, GN_KEYWORDS_1364_1995, K_event +exclude, GN_KEYWORDS_VAMS_2_3, K_exclude exp, GN_KEYWORDS_VAMS_2_3, K_exp floor, GN_KEYWORDS_VAMS_2_3, K_floor +flow, GN_KEYWORDS_VAMS_2_3, K_flow for, GN_KEYWORDS_1364_1995, K_for force, GN_KEYWORDS_1364_1995, K_force forever, GN_KEYWORDS_1364_1995, K_forever fork, GN_KEYWORDS_1364_1995, K_fork +from, GN_KEYWORDS_VAMS_2_3, K_from function, GN_KEYWORDS_1364_1995, K_function generate, GN_KEYWORDS_1364_2001, K_generate genvar, GN_KEYWORDS_1364_2001, K_genvar +ground, GN_KEYWORDS_VAMS_2_3, K_ground highz0, GN_KEYWORDS_1364_1995, K_highz0 highz1, GN_KEYWORDS_1364_1995, K_highz1 hypot, GN_KEYWORDS_VAMS_2_3, K_hypot +idt_nature, GN_KEYWORDS_VAMS_2_3, K_idt_nature if, GN_KEYWORDS_1364_1995, K_if ifnone, GN_KEYWORDS_1364_1995, K_ifnone initial, GN_KEYWORDS_1364_1995, K_initial @@ -80,6 +95,7 @@ medium, GN_KEYWORDS_1364_1995, K_medium min, GN_KEYWORDS_VAMS_2_3, K_min module, GN_KEYWORDS_1364_1995, K_module nand, GN_KEYWORDS_1364_1995, K_nand +nature, GN_KEYWORDS_VAMS_2_3, K_nature negedge, GN_KEYWORDS_1364_1995, K_negedge nmos, GN_KEYWORDS_1364_1995, K_nmos nor, GN_KEYWORDS_1364_1995, K_nor @@ -91,6 +107,7 @@ output, GN_KEYWORDS_1364_1995, K_output parameter, GN_KEYWORDS_1364_1995, K_parameter pmos, GN_KEYWORDS_1364_1995, K_pmos posedge, GN_KEYWORDS_1364_1995, K_posedge +potential, GN_KEYWORDS_VAMS_2_3, K_potential pow, GN_KEYWORDS_VAMS_2_3, K_pow primitive, GN_KEYWORDS_1364_1995, K_primitive pull0, GN_KEYWORDS_1364_1995, K_pull0 @@ -116,6 +133,7 @@ small, GN_KEYWORDS_1364_1995, K_small specify, GN_KEYWORDS_1364_1995, K_specify specparam, GN_KEYWORDS_1364_1995, K_specparam sqrt, GN_KEYWORDS_VAMS_2_3, K_sqrt +string, GN_KEYWORDS_VAMS_2_3, K_string strong0, GN_KEYWORDS_1364_1995, K_strong0 strong1, GN_KEYWORDS_1364_1995, K_strong1 supply0, GN_KEYWORDS_1364_1995, K_supply0 @@ -134,6 +152,7 @@ tri1, GN_KEYWORDS_1364_1995, K_tri1 triand, GN_KEYWORDS_1364_1995, K_triand trior, GN_KEYWORDS_1364_1995, K_trior trireg, GN_KEYWORDS_1364_1995, K_trireg +units, GN_KEYWORDS_VAMS_2_3, K_units vectored, GN_KEYWORDS_1364_1995, K_vectored wait, GN_KEYWORDS_1364_1995, K_wait wand, GN_KEYWORDS_1364_1995, K_wand diff --git a/parse.y b/parse.y index 9f3bdb3a5..38d716337 100644 --- a/parse.y +++ b/parse.y @@ -203,27 +203,33 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2) %token K_PO_POS K_PO_NEG K_POW %token K_PSTAR K_STARP %token K_LOR K_LAND K_NAND K_NOR K_NXOR K_TRIGGER -%token K_abs K_acos K_acosh K_asin K_asinh K_atan K_atanh K_atan2 +%token K_abs K_abstol K_access K_acos K_acosh K_asin K_analog K_asinh +%token K_atan K_atanh K_atan2 %token K_always K_and K_assign K_begin K_bool K_buf K_bufif0 K_bufif1 K_case -%token K_casex K_casez K_ceil K_cmos K_cos K_cosh -%token K_deassign K_default K_defparam K_disable -%token K_edge K_edge_descriptor -%token K_else K_end K_endcase K_endfunction K_endgenerate K_endmodule -%token K_endprimitive K_endspecify K_endtable K_endtask K_event K_exp K_floor +%token K_casex K_casez K_ceil K_cmos K_continuous K_cos K_cosh +%token K_ddt_nature K_deassign K_default K_defparam K_disable K_discrete +%token K_domain K_edge K_edge_descriptor K_discipline +%token K_else K_end K_endcase K_enddiscipline K_endfunction K_endgenerate +%token K_endmodule K_endnature +%token K_endprimitive K_endspecify K_endtable K_endtask K_event +%token K_exclude K_exp K_floor K_flow K_from %token K_for K_force K_forever K_fork K_function K_generate K_genvar -%token K_highz0 K_highz1 K_hypot K_if K_ifnone +%token K_ground K_highz0 K_highz1 K_hypot K_idt_nature K_if K_ifnone %token K_initial K_inout K_input K_integer K_join K_large K_ln K_localparam %token K_log K_logic K_macromodule K_max -%token K_medium K_min K_module K_nand K_negedge K_nmos K_nor K_not K_notif0 -%token K_notif1 K_or K_output K_parameter K_pmos K_posedge K_pow K_primitive +%token K_medium K_min K_module K_nand K_nature K_negedge +%token K_nmos K_nor K_not K_notif0 +%token K_notif1 K_or K_output K_parameter K_pmos K_posedge K_potential +%token K_pow K_primitive %token K_pull0 K_pull1 K_pulldown K_pullup K_rcmos K_real K_realtime %token K_reg K_release K_repeat %token K_rnmos K_rpmos K_rtran K_rtranif0 K_rtranif1 K_scalared %token K_signed K_sin K_sinh K_small K_specify -%token K_specparam K_sqrt K_strong0 K_strong1 K_supply0 K_supply1 K_table +%token K_specparam K_sqrt K_string K_strong0 K_strong1 K_supply0 K_supply1 +%token K_table %token K_tan K_tanh K_task %token K_time K_tran K_tranif0 K_tranif1 K_tri K_tri0 K_tri1 K_triand -%token K_trior K_trireg K_vectored K_wait K_wand K_weak0 K_weak1 +%token K_trior K_trireg K_units K_vectored K_wait K_wand K_weak0 K_weak1 %token K_while K_wire %token K_wone K_wor K_xnor K_xor %token K_Shold K_Speriod K_Srecovery K_Srecrem K_Ssetup K_Swidth K_Ssetuphold @@ -655,15 +661,58 @@ delay_value_simple ; description - : module - | udp_primitive - | KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' - { perm_string tmp3 = lex_strings.make($3); - pform_set_type_attrib(tmp3, $5, $7); - delete[]$3; - delete $5; - } - ; + : module + | udp_primitive + | nature_declaration + | discipline_declaration + | KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' + { perm_string tmp3 = lex_strings.make($3); + pform_set_type_attrib(tmp3, $5, $7); + delete[]$3; + delete $5; + } + ; + +discipline_declaration + : K_discipline IDENTIFIER discipline_items K_enddiscipline + { delete[]$2; } + ; + +discipline_items + : discipline_items discipline_item + | discipline_item + ; + +discipline_item + : K_domain K_discrete ';' + | K_domain K_continuous ';' + | K_potential IDENTIFIER ';' + { delete[] $2; } + | K_flow IDENTIFIER ';' + { delete[] $2; } + ; + +nature_declaration + : K_nature IDENTIFIER nature_items K_endnature + { delete[] $2; } + ; + +nature_items + : nature_items nature_item + | nature_item + ; + +nature_item + : K_units '=' STRING ';' + { delete[] $3; } + | K_abstol '=' expression ';' + | K_access '=' IDENTIFIER ';' + { delete[] $3; } + | K_idt_nature '=' IDENTIFIER ';' + { delete[] $3; } + | K_ddt_nature '=' IDENTIFIER ';' + { delete[] $3; } + ; drive_strength : '(' dr_strength0 ',' dr_strength1 ')'