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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
Reference in New Issue
Block a user