16#ifndef SIMICS_SYSTEMC_AWARENESS_MULTI_INITIATOR_SPY_FACTORY_H
17#define SIMICS_SYSTEMC_AWARENESS_MULTI_INITIATOR_SPY_FACTORY_H
24#include <tlm_utils/multi_socket_bases.h>
25#include <sysc/intc/communication/sc_export_spy.h>
35template <
typename TYPES,
typename IF>
36class MultiInitiatorSpyFactoryInterface {
38 typedef tlm::tlm_bw_transport_if<TYPES> BW_IF;
39 virtual void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *>
41 virtual std::map<BW_IF*, BW_IF*> *get_spies() = 0;
42 virtual MultiInitiatorSpyFactoryInterface<TYPES, IF> *create() = 0;
43 virtual TraverserInterface *traverser() = 0;
44 virtual ~MultiInitiatorSpyFactoryInterface() {}
47template <
typename IF,
typename HANDLER,
48 typename TYPES = tlm::tlm_base_protocol_types>
49class MultiInitiatorSpyFactory
50 :
public TraverserInterface,
51 public MultiInitiatorSpyFactoryInterface<TYPES, IF> {
53 using typename MultiInitiatorSpyFactoryInterface<TYPES, IF>::BW_IF;
54 typedef tlm::tlm_fw_transport_if<TYPES> FW_IF;
55 typedef typename tlm_utils::multi_init_base_if<TYPES> base;
56 MultiInitiatorSpyFactory() {}
57 MultiInitiatorSpyFactory(
const MultiInitiatorSpyFactory &f) {}
58 MultiInitiatorSpyFactory &operator = (
const MultiInitiatorSpyFactory &f) {}
59 virtual void applyOn(sc_core::sc_object *sc_object) {
60 base *initiator =
dynamic_cast<base *
>(sc_object);
62 sockets_.push_back(initiator);
63 std::vector<tlm_utils::callback_binder_bw<TYPES>* > &binders
64 = initiator->get_binders();
65 for (
auto i : binders) {
66 HANDLER *handler =
new HANDLER(i);
67 handlers_.push_back(handler);
72 virtual void done() {}
73 virtual MultiInitiatorSpyFactoryInterface<TYPES, IF> *create() {
74 return new MultiInitiatorSpyFactory;
76 virtual TraverserInterface *traverser() {
79 void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *> *spies) {
80 for (
auto i : sockets_) {
81 std::vector<FW_IF *> &targets = i->get_sockets();
82 for (
auto& j : targets) {
83 intc::sc_export_spy<IF> *spy = (*spies)[j];
85 j = spy->get_current_interface();
87 auto* fw =
dynamic_cast<
88 tlm_utils::callback_binder_fw<TYPES> *
>(j);
89 TlmMultiHandlerInterface *h =
90 TlmMultiHandlerRegistry::getHandler(fw);
92 j =
dynamic_cast<FW_IF *
>(h->firstHandler());
98 virtual std::map<BW_IF*, BW_IF*> *get_spies() {
101 virtual ~MultiInitiatorSpyFactory() {
102 for (
auto i : handlers_)
106 std::vector<base *> sockets_;
107 std::vector<HANDLER *> handlers_;
108 std::map<BW_IF*, BW_IF*> spies_;
Definition: pci_bus_interface.h:24