Add additional check to SigSpec
authorClaire Xenia Wolf <claire@clairexen.net>
Fri, 10 Sep 2021 14:51:34 +0000 (16:51 +0200)
committerClaire Xenia Wolf <claire@clairexen.net>
Fri, 10 Sep 2021 14:51:34 +0000 (16:51 +0200)
Signed-off-by: Claire Xenia Wolf <claire@clairexen.net>
kernel/rtlil.cc
kernel/rtlil.h

index 40b9b761aa20b8835b4f4a3c0e17c97faa93ee4e..a05023c52936eb619b61221e1ce89d1cc5edf713 100644 (file)
@@ -1753,7 +1753,7 @@ void RTLIL::Module::check()
                log_assert(!it.second->type.empty());
                for (auto &it2 : it.second->connections()) {
                        log_assert(!it2.first.empty());
-                       it2.second.check();
+                       it2.second.check(this);
                }
                for (auto &it2 : it.second->attributes)
                        log_assert(!it2.first.empty());
@@ -1799,8 +1799,8 @@ void RTLIL::Module::check()
        for (auto &it : connections_) {
                log_assert(it.first.size() == it.second.size());
                log_assert(!it.first.has_const());
-               it.first.check();
-               it.second.check();
+               it.first.check(this);
+               it.second.check(this);
        }
 
        for (auto &it : attributes)
@@ -4130,7 +4130,7 @@ RTLIL::SigSpec RTLIL::SigSpec::repeat(int num) const
 }
 
 #ifndef NDEBUG
-void RTLIL::SigSpec::check() const
+void RTLIL::SigSpec::check(Module *mod) const
 {
        if (width_ > 64)
        {
@@ -4156,6 +4156,8 @@ void RTLIL::SigSpec::check() const
                                log_assert(chunk.width >= 0);
                                log_assert(chunk.offset + chunk.width <= chunk.wire->width);
                                log_assert(chunk.data.size() == 0);
+                               if (mod != nullptr)
+                                       log_assert(chunk.wire->module == mod);
                        }
                        w += chunk.width;
                }
@@ -4166,6 +4168,12 @@ void RTLIL::SigSpec::check() const
        {
                cover("kernel.rtlil.sigspec.check.unpacked");
 
+               if (mod != nullptr) {
+                       for (size_t i = 0; i < bits_.size(); i++)
+                               if (bits_[i].wire != nullptr)
+                                       log_assert(bits_[i].wire->module == mod);
+               }
+
                log_assert(width_ == GetSize(bits_));
                log_assert(chunks_.empty());
        }
index 50707c0aee4b7625ba6cd8f5c4580ad67bc1aac0..06198b26a6d1e6da6d7e4a1ad2612d1757728c50 100644 (file)
@@ -965,9 +965,9 @@ public:
        unsigned int hash() const { if (!hash_) updhash(); return hash_; };
 
 #ifndef NDEBUG
-       void check() const;
+       void check(Module *mod = nullptr) const;
 #else
-       void check() const { }
+       void check(Module *mod = nullptr) const { }
 #endif
 };