Add support for SystemVerilog-style `define to Verilog frontend
authorRupert Swarbrick <rswarbrick@lowrisc.org>
Tue, 17 Mar 2020 09:34:31 +0000 (09:34 +0000)
committerRupert Swarbrick <rswarbrick@gmail.com>
Fri, 27 Mar 2020 16:08:26 +0000 (16:08 +0000)
commit044ca9dde409e3c91542fe95513d6641110f8462
tree564c849ec0a8884171e22d89843e7e9c3e9115b0
parent4c38895fab3ca2426ffc23e40601f3042a953e47
Add support for SystemVerilog-style `define to Verilog frontend

This patch should support things like

  `define foo(a, b = 3, c)   a+b+c

  `foo(1, ,2)

which will evaluate to 1+3+2. It also spots mistakes like

  `foo(1)

(the 3rd argument doesn't have a default value, so a call site is
required to set it).

Most of the patch is a simple parser for the format in preproc.cc, but
I've also taken the opportunity to wrap up the "name -> definition"
map in a type, rather than use multiple std::map's.

Since this type needs to be visible to code that touches defines, I've
pulled it (and the frontend_verilog_preproc declaration) out into a
new file at frontends/verilog/preproc.h and included that where
necessary.

Finally, the patch adds a few tests in tests/various to check that we
are parsing everything correctly.
frontends/verilog/preproc.cc
frontends/verilog/preproc.h [new file with mode: 0644]
frontends/verilog/verilog_frontend.cc
frontends/verilog/verilog_frontend.h
kernel/rtlil.cc
kernel/rtlil.h
passes/cmds/design.cc
tests/various/sv_defines.ys [new file with mode: 0644]
tests/various/sv_defines_dup.ys [new file with mode: 0644]
tests/various/sv_defines_mismatch.ys [new file with mode: 0644]
tests/various/sv_defines_too_few.ys [new file with mode: 0644]