systemc: When sensitive to an event finder, find on all interfaces.

When a process is sensitive to an event finder and that finder is
attached to a port which is bound to multiple interfaces, the process
is supposed to be made sensitive to the event finder function's result
when called on each interface, not just the first one.

Change-Id: I92312e04e60fab7a7ea51c1ed687edabe9768205
Reviewed-on: https://gem5-review.googlesource.com/c/12444
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-08-29 23:02:21 -07:00
parent 8fdda3b2d8
commit 420ab42e02
3 changed files with 13 additions and 1 deletions

View File

@@ -37,6 +37,7 @@
#include "base/fiber.hh"
#include "sim/eventq.hh"
#include "systemc/core/bindinfo.hh"
#include "systemc/core/event.hh"
#include "systemc/core/list.hh"
#include "systemc/core/object.hh"
#include "systemc/core/sched_event.hh"
@@ -259,7 +260,13 @@ class PendingSensitivityFinder : public PendingSensitivity
void
finalize(Sensitivities &s) override
{
s.push_back(new SensitivityEvent(process, &finder->find_event()));
const ::sc_core::sc_port_base *port = finder->port();
int size = port->size();
for (int i = 0; i < size; i++) {
::sc_core::sc_interface *interface = port->_gem5Interface(i);
const ::sc_core::sc_event *event = &finder->find_event(interface);
s.push_back(new SensitivityEvent(process, event));
}
}
};

View File

@@ -64,6 +64,7 @@ class sc_event_finder
public:
// Should be "implementation defined" but used in the tests.
virtual const sc_event &find_event(sc_interface *if_p=NULL) const = 0;
virtual const sc_port_base *port() const = 0;
};
template <class IF>
@@ -80,6 +81,8 @@ class sc_event_finder_t : public sc_event_finder
virtual ~sc_event_finder_t() {}
const sc_port_base *port() const { return _port; }
const sc_event &
find_event(sc_interface *if_p=NULL) const override
{

View File

@@ -42,6 +42,7 @@ namespace sc_gem5
class BindInfo;
class Module;
class PendingSensitivityPort;
class PendingSensitivityFinder;
};
@@ -85,6 +86,7 @@ class sc_port_base : public sc_object
private:
friend class ::sc_gem5::PendingSensitivityPort;
friend class ::sc_gem5::PendingSensitivityFinder;
friend class ::sc_gem5::Kernel;
void _gem5Finalize();