write_verilog: dump zero width sigspecs correctly.
authorwhitequark <whitequark@whitequark.org>
Sat, 11 Dec 2021 12:01:52 +0000 (12:01 +0000)
committerwhitequark <whitequark@whitequark.org>
Sat, 11 Dec 2021 12:01:52 +0000 (12:01 +0000)
Before this commit, zero width sigspecs were dumped as "" (empty
string). Unfortunately, 1364-2005 5.2.3.3 indicates that an empty
string is equivalent to "\0", and is 8 bits wide, so that's wrong.

After this commit, a replication operation with a count of zero is
used instead, which is explicitly permitted per 1364-2005 5.1.14,
and is defined to have size zero. (Its operand has to have a non-zero
size for it to be legal, though.)

PR #1203 has addressed this issue before, but in an incomplete way.

backends/verilog/verilog_backend.cc

index 47ef1c479d97d01bcdceb8609ade8e006395adb7..13c78c526e7c63424cf39b07812d13455756109f 100644 (file)
@@ -358,7 +358,8 @@ void dump_sigchunk(std::ostream &f, const RTLIL::SigChunk &chunk, bool no_decima
 void dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig)
 {
        if (GetSize(sig) == 0) {
-               f << "\"\"";
+               // See IEEE 1364-2005 Clause 5.1.14.
+               f << "{0{1'b0}}";
                return;
        }
        if (sig.is_chunk()) {