Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/13296

Change subject: systemc: Fill out some error reporting in sc_port.
......................................................................

systemc: Fill out some error reporting in sc_port.

Rather than just asserting some invariants are true, report errors if
they aren't.

Change-Id: Id361b8a13011e1a75289ddddb6b41c1d09dbf794
---
M src/systemc/core/sc_port.cc
M src/systemc/ext/core/sc_port.hh
2 files changed, 46 insertions(+), 9 deletions(-)



diff --git a/src/systemc/core/sc_port.cc b/src/systemc/core/sc_port.cc
index 50a67a3..60911f8 100644
--- a/src/systemc/core/sc_port.cc
+++ b/src/systemc/core/sc_port.cc
@@ -27,6 +27,8 @@
  * Authors: Gabe Black
  */

+#include <sstream>
+
 #include "base/logging.hh"
 #include "systemc/core/module.hh"
 #include "systemc/core/port.hh"
@@ -88,6 +90,16 @@
     warn("%s not implemented.\n", func);
 }

+void
+sc_port_base::report_error(const char *id, const char *add_msg) const
+{
+    std::ostringstream ss;
+    if (add_msg)
+        ss << add_msg << ": ";
+    ss << "port '" << name() << "' (" << kind() << ")";
+    SC_REPORT_ERROR(id, ss.str().c_str());
+}
+
 int sc_port_base::maxSize() const { return _gem5Port->maxSize(); }
 int sc_port_base::size() const { return _gem5Port->size(); }

diff --git a/src/systemc/ext/core/sc_port.hh b/src/systemc/ext/core/sc_port.hh
index 904d35b..915b11f 100644
--- a/src/systemc/ext/core/sc_port.hh
+++ b/src/systemc/ext/core/sc_port.hh
@@ -101,6 +101,8 @@
     virtual void start_of_simulation() = 0;
     virtual void end_of_simulation() = 0;

+    void report_error(const char *id, const char *add_msg) const;
+
   private:
     friend class ::sc_gem5::Port;
     friend class ::sc_gem5::Kernel;
@@ -125,39 +127,53 @@
     IF *
     operator -> ()
     {
-        sc_assert(!_interfaces.empty());
+        if (_interfaces.empty()) {
+ report_error("(E112) get interface failed", "port is not bound");
+            sc_abort();
+        }
         return _interfaces[0];
     }
     const IF *
     operator -> () const
     {
-        sc_assert(!_interfaces.empty());
+        if (_interfaces.empty()) {
+ report_error("(E112) get interface failed", "port is not bound");
+            sc_abort();
+        }
         return _interfaces[0];
     }

     IF *
     operator [] (int n)
     {
-        sc_assert(_interfaces.size() > n);
+        if (n < 0 || n >= size()) {
+ report_error("(E112) get interface failed", "index out of range");
+            return NULL;
+        }
         return _interfaces[n];
     }
     const IF *
     operator [] (int n) const
     {
-        sc_assert(_interfaces.size() > n);
+        if (n < 0 || n >= size()) {
+ report_error("(E112) get interface failed", "index out of range");
+            return NULL;
+        }
         return _interfaces[n];
     }

     sc_interface *
     get_interface()
     {
-        sc_assert(!_interfaces.empty());
+        if (_interfaces.empty())
+            return NULL;
         return _interfaces[0];
     }
     const sc_interface *
     get_interface() const
     {
-        sc_assert(!_interfaces.empty());
+        if (_interfaces.empty())
+            return NULL;
         return _interfaces[0];
     }

@@ -201,14 +217,23 @@
     sc_interface *
     _gem5Interface(int n) const
     {
-        sc_assert(_interfaces.size() > n);
+        if (n < 0 || n >= size()) {
+ report_error("(E112) get interface failed", "index out of range");
+            return NULL;
+        }
         return _interfaces[n];
     }
     void
-    _gem5AddInterface(sc_interface *i)
+    _gem5AddInterface(sc_interface *iface)
     {
-        IF *interface = dynamic_cast<IF *>(i);
+        IF *interface = dynamic_cast<IF *>(iface);
         sc_assert(interface);
+        for (int i = 0; i < _interfaces.size(); i++) {
+            if (interface == _interfaces[i]) {
+                report_error("(E107) bind interface to port failed",
+                        "interface already bound to port");
+            }
+        }
         _interfaces.push_back(interface);
     }


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/13296
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Id361b8a13011e1a75289ddddb6b41c1d09dbf794
Gerrit-Change-Number: 13296
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to