14#ifndef SIMICS_SYSTEMC_AWARENESS_MULTI_TARGET_SPY_FACTORY_H
15#define SIMICS_SYSTEMC_AWARENESS_MULTI_TARGET_SPY_FACTORY_H
19#include <tlm_utils/multi_socket_bases.h>
32template <
typename IF,
typename TYPES>
33class MultiTargetSpyFactoryInterface {
35 typedef tlm::tlm_fw_transport_if<TYPES> FW_IF;
36 virtual void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *>
38 virtual std::map<FW_IF*, FW_IF*> *get_spies() = 0;
39 virtual MultiTargetSpyFactoryInterface<IF, TYPES> *create() = 0;
40 virtual TraverserInterface *traverser() = 0;
41 virtual ~MultiTargetSpyFactoryInterface() {}
44template <
typename IF,
typename HANDLER,
45 typename TYPES = tlm::tlm_base_protocol_types>
46class MultiTargetSpyFactory :
public TraverserInterface,
47 public MultiTargetSpyFactoryInterface<IF, TYPES> {
49 using typename MultiTargetSpyFactoryInterface<IF, TYPES>::FW_IF;
50 typedef tlm::tlm_bw_transport_if<TYPES> BW_IF;
51 typedef typename tlm_utils::multi_target_base_if<TYPES> base;
52 MultiTargetSpyFactory() {}
53 MultiTargetSpyFactory(
const MultiTargetSpyFactory &f) {}
54 MultiTargetSpyFactory &operator = (
const MultiTargetSpyFactory &f) {}
55 virtual ~MultiTargetSpyFactory() {
56 for (
auto i : handlers_)
59 void applyOn(sc_core::sc_object *sc_object)
override {
60 base *target =
dynamic_cast<base *
> (sc_object);
62 sockets_.push_back(target);
63 std::vector<tlm_utils::callback_binder_fw<TYPES>* > &binders
64 = target->get_binders();
65 for (
auto i : binders) {
66 HANDLER *handler =
new HANDLER(i);
67 handlers_.push_back(handler);
72 void done()
override {}
73 void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *> *spies)
override {
74 for (
auto i : sockets_) {
75 auto &binds = i->get_multi_binds();
76 for (
auto& j : binds) {
77 auto *h = TlmMultiHandlerRegistry::getHandler(j.second);
79 BW_IF *bw =
dynamic_cast<BW_IF *
>(h->firstHandler());
87 MultiTargetSpyFactoryInterface<IF, TYPES> *create()
override {
88 return new MultiTargetSpyFactory;
90 TraverserInterface *traverser()
override {
93 std::map<FW_IF*, FW_IF*> *get_spies()
override {
98 std::vector<base *> sockets_;
99 std::vector<HANDLER *> handlers_;
100 std::map<FW_IF*, FW_IF*> spies_;