From 224e28c32bb937f5ad37a31138a5fa4cae247871 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 4 Oct 2018 17:46:55 -0700 Subject: systemc: Implement port binding policies. Change-Id: I585e34c4a666103af16ff1675701b61122822b55 Reviewed-on: https://gem5-review.googlesource.com/c/13299 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/port.cc | 22 ++++++++++++++++++++++ src/systemc/ext/core/sc_port.hh | 3 +++ .../sc_port_policy/test03/expected_returncode | 1 + .../sc_port_policy/test04/expected_returncode | 1 + 4 files changed, 27 insertions(+) create mode 100644 src/systemc/tests/systemc/communication/sc_port_policy/test03/expected_returncode create mode 100644 src/systemc/tests/systemc/communication/sc_port_policy/test04/expected_returncode 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 @@ -299,6 +300,8 @@ class sc_port : public sc_port_b // Disabled sc_port(const sc_port &) {} sc_port &operator = (const sc_port &) { 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 -- cgit v1.2.3