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 Reviewed-on: https://gem5-review.googlesource.com/c/13296 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -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 @@ sc_port_base::warn_unimpl(const char *func) const
|
||||
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(); }
|
||||
|
||||
|
||||
@@ -101,6 +101,8 @@ class sc_port_base : public sc_object
|
||||
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 @@ class sc_port_b : public sc_port_base
|
||||
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 @@ class sc_port_b : public sc_port_base
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user