sv: support wand and wor of data types
authorZachary Snow <zach@zachjs.com>
Sat, 14 Aug 2021 03:51:28 +0000 (20:51 -0700)
committerZachary Snow <zachary.j.snow@gmail.com>
Tue, 21 Sep 2021 18:52:28 +0000 (14:52 -0400)
This enables the usage of declarations of wand or wor with a base type
of logic, integer, or a typename. Note that declarations of nets with
2-state base types is still permitted, in violation of the spec.

CHANGELOG
frontends/verilog/verilog_parser.y
tests/verilog/net_types.sv [new file with mode: 0644]
tests/verilog/net_types.ys [new file with mode: 0644]

index dade2f0e93d4ed99fa5fd7199700506acbc970e2..ab41d689d6b72bfdd63cd2d01989e054de5f12d5 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -56,7 +56,7 @@ Yosys 0.9 .. Yosys 0.9-dev
     - Added "portlist" command
     - Added "check -mapped"
     - Added "check -allow-tbuf"
-    - Added "autoname" pass 
+    - Added "autoname" pass
     - Added "write_verilog -extmem"
     - Added "opt_mem" pass
     - Added "scratchpad" pass
@@ -94,6 +94,7 @@ Yosys 0.9 .. Yosys 0.9-dev
     - Added support for parsing the 'bind' construct
     - support declaration in procedural for initialization
     - support declaration in generate for initialization
+    - Support wand and wor of data types
 
  * Verific support
     - Added "verific -L"
index 91b1140e9e273fecdbcd58421152898ee080113b..80b40f9826f60c056ba60c8b929b40dc3c606ab8 100644 (file)
@@ -832,16 +832,10 @@ opt_wire_type_token:
        wire_type_token | %empty;
 
 wire_type_token:
-       TOK_WOR {
-               astbuf3->is_wor = true;
+       // nets
+       net_type {
        } |
-       TOK_WAND {
-               astbuf3->is_wand = true;
-       } |
-       // wires
-       TOK_WIRE {
-       } |
-       TOK_WIRE logic_type {
+       net_type logic_type {
        } |
        // regs
        TOK_REG {
@@ -868,6 +862,15 @@ wire_type_token:
                astbuf3->range_right = 0;
        };
 
+net_type:
+       TOK_WOR {
+               astbuf3->is_wor = true;
+       } |
+       TOK_WAND {
+               astbuf3->is_wand = true;
+       } |
+       TOK_WIRE;
+
 logic_type:
        TOK_LOGIC {
        } |
diff --git a/tests/verilog/net_types.sv b/tests/verilog/net_types.sv
new file mode 100644 (file)
index 0000000..7226a7e
--- /dev/null
@@ -0,0 +1,34 @@
+module top;
+    wire logic wire_logic_0; assign wire_logic_0 = 0;
+    wire logic wire_logic_1; assign wire_logic_1 = 1;
+    wand logic wand_logic_0; assign wand_logic_0 = 0; assign wand_logic_0 = 1;
+    wand logic wand_logic_1; assign wand_logic_1 = 1; assign wand_logic_1 = 1;
+    wor logic wor_logic_0; assign wor_logic_0 = 0; assign wor_logic_0 = 0;
+    wor logic wor_logic_1; assign wor_logic_1 = 1; assign wor_logic_1 = 0;
+
+    wire integer wire_integer; assign wire_integer = 4'b1001;
+    wand integer wand_integer; assign wand_integer = 4'b1001; assign wand_integer = 4'b1010;
+    wor integer wor_integer; assign wor_integer = 4'b1001; assign wor_integer = 4'b1010;
+
+    typedef logic [3:0] typename;
+    wire typename wire_typename; assign wire_typename = 4'b1001;
+    wand typename wand_typename; assign wand_typename = 4'b1001; assign wand_typename = 4'b1010;
+    wor typename wor_typename; assign wor_typename = 4'b1001; assign wor_typename = 4'b1010;
+
+    always @* begin
+        assert (wire_logic_0 == 0);
+        assert (wire_logic_1 == 1);
+        assert (wand_logic_0 == 0);
+        assert (wand_logic_1 == 1);
+        assert (wor_logic_0 == 0);
+        assert (wor_logic_1 == 1);
+
+        assert (wire_integer == 4'b1001);
+        assert (wand_integer == 4'b1000);
+        assert (wor_integer == 4'b1011);
+
+        assert (wire_typename == 4'b1001);
+        assert (wand_typename == 4'b1000);
+        assert (wor_typename == 4'b1011);
+    end
+endmodule
diff --git a/tests/verilog/net_types.ys b/tests/verilog/net_types.ys
new file mode 100644 (file)
index 0000000..9f75812
--- /dev/null
@@ -0,0 +1,5 @@
+read_verilog -sv net_types.sv
+hierarchy
+proc
+opt -full
+sat -verify -prove-asserts -show-all