aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwhitequark <whitequark@whitequark.org>2021-03-01 22:46:07 -0800
committerGitHub <noreply@github.com>2021-03-01 22:46:07 -0800
commit375af199ef4df45ccf02c66e0171b4282c6cf1eb (patch)
tree18e54f4b88b8cb4639da0a1d688d07200bacec3b
parent0e0f84299a4ae4d0a312c33039378e1ebb20709d (diff)
parent10a6bc9b81d1c2236e80a608778c904aebe54c28 (diff)
downloadyosys-375af199ef4df45ccf02c66e0171b4282c6cf1eb.tar.gz
yosys-375af199ef4df45ccf02c66e0171b4282c6cf1eb.tar.bz2
yosys-375af199ef4df45ccf02c66e0171b4282c6cf1eb.zip
Merge pull request #2620 from zachjs/port-int-types
verilog: fix sizing of ports with int types in module headers
-rw-r--r--frontends/verilog/verilog_parser.y5
-rw-r--r--tests/verilog/port_int_types.sv50
-rw-r--r--tests/verilog/port_int_types.ys11
3 files changed, 64 insertions, 2 deletions
diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y
index 476ee68ad..bcba9b76a 100644
--- a/frontends/verilog/verilog_parser.y
+++ b/frontends/verilog/verilog_parser.y
@@ -546,8 +546,9 @@ module_arg:
node->str = *$4;
SET_AST_NODE_LOC(node, @4, @4);
node->port_id = ++port_counter;
- if ($3 != NULL)
- node->children.push_back($3);
+ AstNode *range = checkRange(node, $3);
+ if (range != NULL)
+ node->children.push_back(range);
if (!node->is_input && !node->is_output)
frontend_verilog_yyerror("Module port `%s' is neither input nor output.", $4->c_str());
if (node->is_reg && node->is_input && !node->is_output && !sv_mode)
diff --git a/tests/verilog/port_int_types.sv b/tests/verilog/port_int_types.sv
new file mode 100644
index 000000000..40e2cf14a
--- /dev/null
+++ b/tests/verilog/port_int_types.sv
@@ -0,0 +1,50 @@
+`define INITS \
+ assign a = -1; \
+ assign b = -2; \
+ assign c = -3; \
+ assign d = -4; \
+ assign a_ext = a; \
+ assign b_ext = b; \
+ assign c_ext = c; \
+ assign d_ext = d;
+
+module gate_a(
+ output byte a,
+ output byte unsigned b,
+ output shortint c,
+ output shortint unsigned d,
+ output [31:0] a_ext,
+ output [31:0] b_ext,
+ output [31:0] c_ext,
+ output [31:0] d_ext
+);
+ `INITS
+endmodule
+
+module gate_b(
+ a, b, c, d,
+ a_ext, b_ext, c_ext, d_ext
+);
+ output byte a;
+ output byte unsigned b;
+ output shortint c;
+ output shortint unsigned d;
+ output [31:0] a_ext;
+ output [31:0] b_ext;
+ output [31:0] c_ext;
+ output [31:0] d_ext;
+ `INITS
+endmodule
+
+module gold(
+ output signed [7:0] a,
+ output unsigned [7:0] b,
+ output signed [15:0] c,
+ output unsigned [15:0] d,
+ output [31:0] a_ext,
+ output [31:0] b_ext,
+ output [31:0] c_ext,
+ output [31:0] d_ext
+);
+ `INITS
+endmodule
diff --git a/tests/verilog/port_int_types.ys b/tests/verilog/port_int_types.ys
new file mode 100644
index 000000000..75888e1a8
--- /dev/null
+++ b/tests/verilog/port_int_types.ys
@@ -0,0 +1,11 @@
+read_verilog -sv port_int_types.sv
+equiv_make gold gate_a equiv
+equiv_simple
+equiv_status -assert
+
+design -reset
+
+read_verilog -sv port_int_types.sv
+equiv_make gold gate_b equiv
+equiv_simple
+equiv_status -assert