16#ifndef SIMICS_SYSTEMC_AWARENESS_MULTI_TARGET_SPY_FACTORY_H
17#define SIMICS_SYSTEMC_AWARENESS_MULTI_TARGET_SPY_FACTORY_H
21#include <tlm_utils/multi_socket_bases.h>
34template <
typename IF,
typename TYPES>
35class MultiTargetSpyFactoryInterface {
37 typedef tlm::tlm_fw_transport_if<TYPES> FW_IF;
38 virtual void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *>
40 virtual std::map<FW_IF*, FW_IF*> *get_spies() = 0;
41 virtual MultiTargetSpyFactoryInterface<IF, TYPES> *create() = 0;
42 virtual TraverserInterface *traverser() = 0;
43 virtual ~MultiTargetSpyFactoryInterface() {}
46template <
typename IF,
typename HANDLER,
47 typename TYPES = tlm::tlm_base_protocol_types>
48class MultiTargetSpyFactory :
public TraverserInterface,
49 public MultiTargetSpyFactoryInterface<IF, TYPES> {
51 using typename MultiTargetSpyFactoryInterface<IF, TYPES>::FW_IF;
52 typedef tlm::tlm_bw_transport_if<TYPES> BW_IF;
53 typedef typename tlm_utils::multi_target_base_if<TYPES> base;
54 MultiTargetSpyFactory() {}
55 MultiTargetSpyFactory(
const MultiTargetSpyFactory &f) {}
56 MultiTargetSpyFactory &operator = (
const MultiTargetSpyFactory &f) {}
57 virtual ~MultiTargetSpyFactory() {
58 for (
auto i : handlers_)
61 virtual void applyOn(sc_core::sc_object *sc_object) {
62 base *target =
dynamic_cast<base *
> (sc_object);
64 sockets_.push_back(target);
65 std::vector<tlm_utils::callback_binder_fw<TYPES>* > &binders
66 = target->get_binders();
67 for (
auto i : binders) {
68 HANDLER *handler =
new HANDLER(i);
69 handlers_.push_back(handler);
74 virtual void done() {}
75 virtual void bind_spies(std::map<IF*, intc::sc_export_spy<IF> *> *spies) {
76 for (
auto i : sockets_) {
77 auto &binds = i->get_multi_binds();
78 for (
auto& j : binds) {
79 auto *h = TlmMultiHandlerRegistry::getHandler(j.second);
81 BW_IF *bw =
dynamic_cast<BW_IF *
>(h->firstHandler());
89 virtual MultiTargetSpyFactoryInterface<IF, TYPES> *create() {
90 return new MultiTargetSpyFactory;
92 virtual TraverserInterface *traverser() {
95 std::map<FW_IF*, FW_IF*> *get_spies() {
100 std::vector<base *> sockets_;
101 std::vector<HANDLER *> handlers_;
102 std::map<FW_IF*, FW_IF*> spies_;
Definition: pci_bus_interface.h:24