Improve "show" handling of 0/1/X/Z padding
authorClifford Wolf <clifford@clifford.at>
Fri, 19 Apr 2019 22:37:43 +0000 (00:37 +0200)
committerClifford Wolf <clifford@clifford.at>
Fri, 19 Apr 2019 22:37:43 +0000 (00:37 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
passes/cmds/show.cc

index 58acd302d07ebde009addeb27614b18a59c84e4e..0eadd904a7b0ca2814ce743c37a5303a9a9a3925 100644 (file)
@@ -237,15 +237,34 @@ struct ShowWorker
                        int idx = single_idx_count++;
                        for (int rep, i = int(sig.chunks().size())-1; i >= 0; i -= rep) {
                                const RTLIL::SigChunk &c = sig.chunks().at(i);
-                               net = gen_signode_simple(c, false);
-                               log_assert(!net.empty());
+                               if (!driver && c.wire == nullptr) {
+                                       RTLIL::State s1 = c.data.front();
+                                       for (auto s2 : c.data)
+                                               if (s1 != s2)
+                                                       goto not_const_stream;
+                                       net.clear();
+                               } else {
+                       not_const_stream:
+                                       net = gen_signode_simple(c, false);
+                                       log_assert(!net.empty());
+                               }
                                for (rep = 1; i-rep >= 0 && c == sig.chunks().at(i-rep); rep++) {}
                                std::string repinfo = rep > 1 ? stringf("%dx ", rep) : "";
                                if (driver) {
+                                       log_assert(!net.empty());
                                        label_string += stringf("<s%d> %d:%d - %s%d:%d |", i, pos, pos-c.width+1, repinfo.c_str(), c.offset+c.width-1, c.offset);
                                        net_conn_map[net].in.insert(stringf("x%d:s%d", idx, i));
                                        net_conn_map[net].bits = rep*c.width;
                                        net_conn_map[net].color = nextColor(c, net_conn_map[net].color);
+                               } else
+                               if (net.empty()) {
+                                       log_assert(rep == 1);
+                                       label_string += stringf("%c -&gt; %d:%d |",
+                                                       c.data.front() == State::S0 ? '0' :
+                                                       c.data.front() == State::S1 ? '1' :
+                                                       c.data.front() == State::Sx ? 'X' :
+                                                       c.data.front() == State::Sz ? 'Z' : '?',
+                                                       pos, pos-rep*c.width+1);
                                } else {
                                        label_string += stringf("<s%d> %s%d:%d - %d:%d |", i, repinfo.c_str(), c.offset+c.width-1, c.offset, pos, pos-rep*c.width+1);
                                        net_conn_map[net].out.insert(stringf("x%d:s%d", idx, i));