systemc: Implement port binding policies.

Change-Id: I585e34c4a666103af16ff1675701b61122822b55
Reviewed-on: https://gem5-review.googlesource.com/c/13299
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-10-04 17:46:55 -07:00
parent 157d053bee
commit 224e28c32b
4 changed files with 27 additions and 0 deletions

View File

@@ -29,6 +29,7 @@
#include "systemc/core/port.hh"
#include "base/logging.hh"
#include "systemc/core/process.hh"
#include "systemc/core/sensitivity.hh"
#include "systemc/ext/channel/sc_signal_in_if.hh"
@@ -123,6 +124,27 @@ Port::finalize()
finalizeReset(r);
resets.clear();
switch (portBase->_portPolicy()) {
case sc_core::SC_ONE_OR_MORE_BOUND:
if (size() == 0)
portBase->report_error(
"(E109) complete binding failed", "port not bound");
break;
case sc_core::SC_ALL_BOUND:
if (size() < maxSize() || size() < 1) {
std::stringstream ss;
ss << size() << " actual binds is less than required " <<
maxSize();
portBase->report_error(
"(E109) complete binding failed", ss.str().c_str());
}
break;
case sc_core::SC_ZERO_OR_MORE_BOUND:
break;
default:
panic("Unrecognized port policy %d.", portBase->_portPolicy());
}
}
void

View File

@@ -112,6 +112,7 @@ class sc_port_base : public sc_object
::sc_gem5::Port *_gem5Port;
virtual const char *_ifTypeName() const = 0;
virtual sc_port_policy _portPolicy() const = 0;
};
template <class IF>
@@ -299,6 +300,8 @@ class sc_port : public sc_port_b<IF>
// Disabled
sc_port(const sc_port<IF, N, P> &) {}
sc_port<IF, N, P> &operator = (const sc_port<IF, N, P> &) { return *this; }
virtual sc_port_policy _portPolicy() const { return P; }
};
} // namespace sc_core