14#ifndef SIMICS_SYSTEMC_AWARENESS_MULTI_INITIATOR_SPY_FACTORY_H
15#define SIMICS_SYSTEMC_AWARENESS_MULTI_INITIATOR_SPY_FACTORY_H
22#include <tlm_utils/multi_socket_bases.h>
23#include <sysc/intc/communication/sc_export_spy.h>
33template <
typename TYPES,
typename IF>
34class MultiInitiatorSpyFactoryInterface {
36 typedef tlm::tlm_bw_transport_if<TYPES> BW_IF;
37 virtual void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *>
39 virtual std::map<BW_IF*, BW_IF*> *get_spies() = 0;
40 virtual MultiInitiatorSpyFactoryInterface<TYPES, IF> *create() = 0;
41 virtual TraverserInterface *traverser() = 0;
42 virtual ~MultiInitiatorSpyFactoryInterface() {}
45template <
typename IF,
typename HANDLER,
46 typename TYPES = tlm::tlm_base_protocol_types>
47class MultiInitiatorSpyFactory
48 :
public TraverserInterface,
49 public MultiInitiatorSpyFactoryInterface<TYPES, IF> {
51 using typename MultiInitiatorSpyFactoryInterface<TYPES, IF>::BW_IF;
52 typedef tlm::tlm_fw_transport_if<TYPES> FW_IF;
53 typedef typename tlm_utils::multi_init_base_if<TYPES> base;
54 MultiInitiatorSpyFactory() {}
55 MultiInitiatorSpyFactory(
const MultiInitiatorSpyFactory &f) {}
56 MultiInitiatorSpyFactory &operator = (
const MultiInitiatorSpyFactory &f) {}
57 void applyOn(sc_core::sc_object *sc_object)
override {
58 base *initiator =
dynamic_cast<base *
>(sc_object);
60 sockets_.push_back(initiator);
61 std::vector<tlm_utils::callback_binder_bw<TYPES>* > &binders
62 = initiator->get_binders();
63 for (
auto i : binders) {
64 HANDLER *handler =
new HANDLER(i);
65 handlers_.push_back(handler);
70 void done()
override {}
71 MultiInitiatorSpyFactoryInterface<TYPES, IF> *create()
override {
72 return new MultiInitiatorSpyFactory;
74 TraverserInterface *traverser()
override {
77 void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *> *spies)
override {
78 for (
auto i : sockets_) {
79 std::vector<FW_IF *> &targets = i->get_sockets();
80 for (
auto& j : targets) {
81 intc::sc_export_spy<IF> *spy = (*spies)[j];
83 j = spy->get_current_interface();
85 auto* fw =
dynamic_cast<
86 tlm_utils::callback_binder_fw<TYPES> *
>(j);
87 TlmMultiHandlerInterface *h =
88 TlmMultiHandlerRegistry::getHandler(fw);
90 j =
dynamic_cast<FW_IF *
>(h->firstHandler());
96 std::map<BW_IF*, BW_IF*> *get_spies()
override {
99 virtual ~MultiInitiatorSpyFactory() {
100 for (
auto i : handlers_)
104 std::vector<base *> sockets_;
105 std::vector<HANDLER *> handlers_;
106 std::map<BW_IF*, BW_IF*> spies_;