3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-07-24 21:27:00 +00:00

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.
This commit is contained in:
Rupert Swarbrick 2020-03-17 09:34:31 +00:00 committed by Rupert Swarbrick
parent 4c38895fab
commit 044ca9dde4
11 changed files with 636 additions and 151 deletions

View file

@ -0,0 +1,33 @@
# Check that basic macro expansions do what you'd expect
read_verilog <<EOT
`define empty_arglist() 123
`define one_arg(x) 123+x
`define opt_arg(x = 1) 123+x
`define two_args(x, y = (1+23)) x+y
`define nested_comma(x = {31'b0, 1'b1}, y=3) x+y
module top;
localparam a = `empty_arglist();
localparam b = `one_arg(10);
localparam c = `opt_arg(10);
localparam d = `opt_arg();
localparam e = `two_args(1,2);
localparam f = `two_args(1);
localparam g = `nested_comma(1, 2);
localparam h = `nested_comma({31'b0, (1'b0)});
localparam i = `nested_comma(, 1);
generate
if (a != 123) $error("a bad");
if (b != 133) $error("b bad");
if (c != 133) $error("c bad");
if (d != 124) $error("d bad");
if (e != 3) $error("e bad");
if (f != 25) $error("f bad");
if (g != 3) $error("g bad");
if (h != 3) $error("h bad");
if (i != 2) $error("i bad");
endgenerate
endmodule
EOT

View file

@ -0,0 +1,5 @@
# Check for duplicate arguments
logger -expect error "Duplicate macro arguments with name `x'" 1
read_verilog <<EOT
`define duplicate_arg(x, x)
EOT

View file

@ -0,0 +1,5 @@
# Check that we spot mismatched brackets
logger -expect error "Mismatched brackets in macro argument: \[ and }." 1
read_verilog <<EOT
`define foo(x=[1,2})
EOT

View file

@ -0,0 +1,7 @@
# Check that we don't allow passing too few arguments (and, while we're at it, check that passing "no"
# arguments actually passes 1 empty argument).
logger -expect error "Cannot expand macro `foo by giving only 1 argument \(argument 2 has no default\)." 1
read_verilog <<EOT
`define foo(x=1, y)
`foo()
EOT