diff options
author | Gabe Black <gabeblack@google.com> | 2018-10-04 17:46:55 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 00:55:15 +0000 |
commit | 224e28c32bb937f5ad37a31138a5fa4cae247871 (patch) | |
tree | c2c96f1fed557d646b573b559026b8a8e2cc7b27 /src/systemc | |
parent | 157d053bee4d17115e0ab03b1499f66862a087ea (diff) | |
download | gem5-224e28c32bb937f5ad37a31138a5fa4cae247871.tar.xz |
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>
Diffstat (limited to 'src/systemc')
4 files changed, 27 insertions, 0 deletions
diff --git a/src/systemc/core/port.cc b/src/systemc/core/port.cc index b7120efa4..c1d77d9d0 100644 --- a/src/systemc/core/port.cc +++ b/src/systemc/core/port.cc @@ -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 diff --git a/src/systemc/ext/core/sc_port.hh b/src/systemc/ext/core/sc_port.hh index 915b11f08..aa9a322b8 100644 --- a/src/systemc/ext/core/sc_port.hh +++ b/src/systemc/ext/core/sc_port.hh @@ -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 diff --git a/src/systemc/tests/systemc/communication/sc_port_policy/test03/expected_returncode b/src/systemc/tests/systemc/communication/sc_port_policy/test03/expected_returncode new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/src/systemc/tests/systemc/communication/sc_port_policy/test03/expected_returncode @@ -0,0 +1 @@ +1 diff --git a/src/systemc/tests/systemc/communication/sc_port_policy/test04/expected_returncode b/src/systemc/tests/systemc/communication/sc_port_policy/test04/expected_returncode new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/src/systemc/tests/systemc/communication/sc_port_policy/test04/expected_returncode @@ -0,0 +1 @@ +1 |