blob: eb487fd6cf4c671f5432a2a0593f97c9e88a231b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# Yosys aborts with exception in peephole optimizers pass
[ Fixed in [`b37c31e`](https://github.com/YosysHQ/yosys/commit/b37c31e2cb82343e363d39e4b35ebdb82f4f69a3) | [Issue 993](https://github.com/YosysHQ/yosys/issues/993) ]
## Affected versions
- Yosys 0.8+411
## Description
Yosys aborts with a `vector::_M_range_check` exception in the peephole optimizers pass (`PEEPOPT pass`). This happens with the verilog code below, which I have reduced as much as possible into an MCVE.
```verilog
module top(y, clk, wire1);
output wire [1:0] y;
input wire clk;
input wire [1:0] wire1;
reg [1:0] reg1 = 0;
reg [1:0] reg2 = 0;
always @(posedge clk) begin
reg1 <= wire1 == 1;
end
always @(posedge clk) begin
reg2 <= 1 >> reg1[1:1];
end
assign y = reg2;
endmodule
```
### Steps to reproduce the issue
Yosys version that this was tested with: `Yosys 0.8+411 (git sha1 70d0f389, clang 8.0.0 -fPIC -Os)`, which is the current master.
The following command was used to synthesise the design:
```
yosys -p 'read -formal rtl.v; synth; write_verilog rtl_yosys.v'
```
### Expected behavior
Synthesis without any exceptions.
```
=== top ===
Number of wires: 4
Number of wire bits: 8
Number of public wires: 4
Number of public wire bits: 8
Number of memories: 0
Number of memory bits: 0
Number of processes: 0
Number of cells: 1
$_ORNOT_ 1
2.27. Executing CHECK pass (checking for obvious problems).
checking module top..
found and reported 0 problems.
3. Executing Verilog backend.
Dumping module `\top'.
```
### Actual behavior
Yosys aborts with a `vector::_M_range_check` exception.
```
2.7. Executing WREDUCE pass (reducing word size of cells).
Removed top 1 bits (of 2) from port B of cell top.$eq$rtl.v:7$2 ($eq).
Removed cell top.$eq$rtl.v:7$2 ($eq).
Removed top 30 bits (of 32) from port A of cell top.$shr$rtl.v:10$4 ($shr).
2.8. Executing PEEPOPT pass (run peephole optimizers).
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 18446744073709551615) >= this->size() (which is 0)
zsh: abort (core dumped) yosys -p 'read -formal rtl.v; synth; write_verilog rtl_yosys.v'
```
|