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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
// SPDX-License-Identifier: Apache-2.0
package chiselTests.naming
import chisel3._
import chiselTests.{ChiselFlatSpec, Utils}
class ReflectiveNamingSpec extends ChiselFlatSpec with Utils {
behavior.of("Reflective naming")
private def emitChirrtl(gen: => RawModule): String = {
// Annoyingly need to emit files to use CLI
val targetDir = createTestDirectory(this.getClass.getSimpleName).toString
val args = Array("--warn:reflective-naming", "-td", targetDir)
(new chisel3.stage.ChiselStage).emitChirrtl(gen, args)
}
it should "NOT warn when no names are changed" in {
class Example extends Module {
val foo, bar = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(8.W)))
val sum = foo +& bar
out := sum
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should equal("")
chirrtl should include("node sum = add(foo, bar)")
}
it should "warn when changing the name of a node" in {
class Example extends Module {
val foo, bar = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(8.W)))
val sum = foo +& bar
val fuzz = sum
out := sum
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should include("'sum' is renamed by reflection to 'fuzz'")
chirrtl should include("node fuzz = add(foo, bar)")
}
// This also checks correct prefix reversing
it should "warn when changing the name of a node with a prefix in the name" in {
class Example extends Module {
val foo, bar = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(8.W)))
// This is sketch, don't do this
var fuzz = 0.U
out := {
val sum = {
val node = foo +& bar
fuzz = node
node +% 0.U
}
sum
}
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should include("'out_sum_node' is renamed by reflection to 'fuzz'")
chirrtl should include("node fuzz = add(foo, bar)")
}
it should "warn when changing the name of a Module instance" in {
import chisel3.util._
class Example extends Module {
val enq = IO(Flipped(Decoupled(UInt(8.W))))
val deq = IO(Decoupled(UInt(8.W)))
val q = Module(new Queue(UInt(8.W), 4))
q.io.enq <> enq
deq <> q.io.deq
val fuzz = q
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should include("'q' is renamed by reflection to 'fuzz'")
chirrtl should include("inst fuzz of Queue")
}
it should "warn when changing the name of an Instance" in {
import chisel3.experimental.hierarchy.{Definition, Instance}
import chiselTests.experimental.hierarchy.Examples.AddOne
class Example extends Module {
val defn = Definition(new AddOne)
val inst = Instance(defn)
val fuzz = inst
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should include("'inst' is renamed by reflection to 'fuzz'")
chirrtl should include("inst fuzz of AddOne")
}
it should "warn when changing the name of a Mem" in {
class Example extends Module {
val mem = SyncReadMem(8, UInt(8.W))
val fuzz = mem
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should include("'mem' is renamed by reflection to 'fuzz'")
chirrtl should include("smem fuzz")
}
it should "NOT warn when changing the name of a verification statement" in {
class Example extends Module {
val in = IO(Input(UInt(8.W)))
val z = chisel3.assert(in =/= 123.U)
val fuzz = z
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should equal("")
// But the name is actually changed
(chirrtl should include).regex("assert.*: fuzz")
}
it should "NOT warn when \"naming\" a literal" in {
class Example extends Module {
val out = IO(Output(UInt(8.W)))
val sum = 0.U
val fuzz = sum
out := sum
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should equal("")
chirrtl should include("out <= UInt")
}
it should "NOT warn when \"naming\" a field of an Aggregate" in {
class Example extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val in = io.in
val out = io.out
out := in
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should equal("")
chirrtl should include("io.out <= io.in")
}
it should "NOT warn when \"naming\" unbound Data" in {
class Example extends Module {
val in = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(8.W)))
val z = UInt(8.W)
val a = z
out := in
}
val (log, chirrtl) = grabLog(emitChirrtl(new Example))
log should equal("")
chirrtl should include("out <= in")
}
}
|