14#ifndef SIMICS_SYSTEMC_AWARENESS_PORT_SPY_FACTORY_H
15#define SIMICS_SYSTEMC_AWARENESS_PORT_SPY_FACTORY_H
21#include <sysc/intc/communication/sc_port_spy.h>
31template <
typename IF,
typename HANDLER>
34 typedef typename std::vector<HANDLER *>::iterator iterator;
35 typedef typename std::map<IF*, intc::sc_port_spy<IF> *>::iterator
38 PortSpyFactory(
const PortSpyFactory &f) {}
39 PortSpyFactory &operator = (
const PortSpyFactory &f) {}
40 virtual ~PortSpyFactory() {
41 for (
auto *handler : handlers_)
43 for (
auto &spy : spies_)
46 void applyOn(sc_core::sc_object *sc_object)
override {
47 if (sc_core::sc_port<IF> *if_
48 =
dynamic_cast<sc_core::sc_port<IF> *
>(sc_object)) {
51 intc::sc_port_spy<IF> *spy =
new intc::sc_port_spy<IF>(if_);
52 HANDLER *handler =
new HANDLER(spy);
53 spy->set_spy_interface(handler);
54 handlers_.push_back(handler);
55 spies_[spy->get_interface()] = spy;
57 if (sc_core::sc_port<IF, 0> *if_
58 =
dynamic_cast<sc_core::sc_port<IF, 0> *
>(sc_object)) {
61 for (
int i = 0; i < if_->size(); ++i) {
62 intc::sc_port_spy<IF> *spy =
new intc::sc_port_spy<IF>(if_, i);
63 HANDLER *handler =
new HANDLER(spy);
64 handlers_.push_back(handler);
65 spy->set_spy_interface(handler);
66 spies_[spy->get_interface()] = spy;
70 void done()
override {}
71 void bindSpies(std::map<IF*, intc::sc_export_spy<IF> *> *exports) {
72 for (
auto &entry : spies_) {
73 if (intc::sc_export_spy<IF> *spy = (*exports)[entry.first]) {
74 entry.second->set_interface(spy->get_current_interface());
78 void bindSpies(std::map<IF*, IF *> *exports) {
79 for (
auto &entry : spies_) {
80 if (IF *spy = (*exports)[entry.first]) {
81 entry.second->set_interface(spy);
87 std::vector<HANDLER *> handlers_;
88 std::map<IF*, intc::sc_port_spy<IF> *> spies_;
Definition: traverser_interface.h:24