14#ifndef SIMICS_SYSTEMC_AWARENESS_TLM_SPY_FACTORY_H
15#define SIMICS_SYSTEMC_AWARENESS_TLM_SPY_FACTORY_H
35class TlmSpyFactoryInterface {
37 virtual TlmSpyFactoryInterface *create() = 0;
38 virtual TraverserInterface *traverser() = 0;
39 virtual ~TlmSpyFactoryInterface() {}
42template <
typename TYPES = tlm::tlm_base_protocol_types,
43 typename INITIATORPORT = TlmFwTransportIfHandler<intc::sc_port_spy<
44 tlm::tlm_fw_transport_if<TYPES> >, TYPES >,
45 typename TARGETPORT = TlmBwTransportIfHandler<intc::sc_port_spy<
46 tlm::tlm_bw_transport_if<TYPES> >, TYPES >,
47 typename INITIATOREXPORT = TlmBwTransportIfHandler<
48 intc::sc_export_spy<tlm::tlm_bw_transport_if<TYPES> >, TYPES >,
49 typename TARGETEXPORT = TlmFwTransportIfHandler<intc::sc_export_spy<
50 tlm::tlm_fw_transport_if<TYPES> >, TYPES > >
51class TlmSpyFactory :
public TlmSpyFactoryInterface,
public MultiTraverser {
59 add(&multi_initiator_);
61 TlmSpyFactory(
const TlmSpyFactory &f) {
64 TlmSpyFactory &operator = (
const TlmSpyFactory &f) {
67 TlmSpyFactoryInterface *create()
override {
68 return new TlmSpyFactory(*
this);
70 TraverserInterface *traverser()
override {
73 void done()
override {
74 port_bw_.bindSpies(export_bw_.get_spies());
75 port_fw_.bindSpies(export_fw_.get_spies());
77 multi_target_.bind_spies(export_bw_.get_spies());
78 port_fw_.bindSpies(multi_target_.get_spies());
80 multi_initiator_.bind_spies(export_fw_.get_spies());
81 port_bw_.bindSpies(multi_initiator_.get_spies());
83 virtual ~TlmSpyFactory() =
default;
86 TlmSpyFactory &deep_copy(
const TlmSpyFactory &f) {
95 add(&multi_initiator_);
99 PortSpyFactory<tlm::tlm_fw_transport_if<TYPES>, INITIATORPORT> port_fw_;
100 ExportSpyFactory<tlm::tlm_bw_transport_if<TYPES>, INITIATOREXPORT>
102 PortSpyFactory<tlm::tlm_bw_transport_if<TYPES>, TARGETPORT> port_bw_;
103 ExportSpyFactory<tlm::tlm_fw_transport_if<TYPES>, TARGETEXPORT> export_fw_;
104 MultiTargetSpyFactory<tlm::tlm_bw_transport_if<TYPES>,
105 TARGETEXPORT, TYPES> multi_target_;
106 MultiInitiatorSpyFactory<tlm::tlm_fw_transport_if<TYPES>,
107 INITIATOREXPORT, TYPES> multi_initiator_;