SystemC Library API Reference Manual
Reference documentation for the Simics SystemC Library.
 
Loading...
Searching...
No Matches
gasket_factory.h
Go to the documentation of this file.
1// -*- mode: C++; c-file-style: "virtutech-c++" -*-
2
3/*
4 © 2013 Intel Corporation
5
6 This software and the related documents are Intel copyrighted materials, and
7 your use of them is governed by the express license under which they were
8 provided to you ("License"). Unless the License provides otherwise, you may
9 not use, modify, copy, publish, distribute, disclose or transmit this software
10 or the related documents without Intel's prior written permission.
11
12 This software and the related documents are provided as is, with no express or
13 implied warranties, other than those that are expressly stated in the License.
14*/
15
16#ifndef SIMICS_SYSTEMC_TLM2SIMICS_GASKET_FACTORY_H
17#define SIMICS_SYSTEMC_TLM2SIMICS_GASKET_FACTORY_H
18
19
20#include <tlm_utils/multi_passthrough_initiator_socket.h>
21
25
26#include <algorithm>
27#include <string>
28
29namespace simics {
30namespace systemc {
31namespace tlm2simics {
32
33namespace internal {
34
35template<unsigned int BUSWIDTH, typename TYPES>
36static Gasket<BUSWIDTH, TYPES> *createGasket(
37 const std::string& socket_name,
38 const simics::ConfObjectRef &simics_obj) {
39 std::string name = "gasket_" + socket_name;
40 std::replace(name.begin(), name.end(), '.', '_');
41
42 const char* char_name = name.c_str();
43 if (sc_core::sc_find_object(char_name))
44 char_name = sc_core::sc_gen_unique_name(char_name);
45
46 // The raw pointer is eventually managed by shared_ptr
47 return new Gasket<BUSWIDTH, TYPES>(char_name, simics_obj);
48}
49} // namespace internal
50
53
55template<unsigned int BUSWIDTH, typename TYPES,
56 int N, sc_core::sc_port_policy POL>
57static GasketInterface::Ptr createGasket(
58 tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL> *target_socket,
59 const simics::ConfObjectRef &simics_obj) {
60 FATAL_ERROR_IF(target_socket->name() == NULL,
61 "target socket not fully initialized, name missing");
62 auto gasket = internal::createGasket<BUSWIDTH, TYPES>(
63 target_socket->name(), simics_obj);
64 gasket->bind(*target_socket);
65 return GasketInterface::Ptr(gasket);
66}
67
69template<unsigned int BUSWIDTH, typename TYPES,
70 int N, sc_core::sc_port_policy POL>
71static GasketInterface::Ptr createGasket(
72 tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL> *initiator_socket,
73 const simics::ConfObjectRef &simics_obj) {
74 FATAL_ERROR_IF(initiator_socket->name() == NULL,
75 "initiator socket not fully initialized, name missing");
76 auto gasket = internal::createGasket<BUSWIDTH, TYPES>(
77 initiator_socket->name(), simics_obj);
78 gasket->bind(*initiator_socket);
79 return GasketInterface::Ptr(gasket);
80}
81
84template<unsigned int BUSWIDTH, typename TYPES,
85 int N, sc_core::sc_port_policy POL>
86static GasketInterface::Ptr createMultiGasket(
87 tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL> *initiator_socket,
88 const simics::ConfObjectRef &simics_obj) {
89 FATAL_ERROR_IF(initiator_socket->name() == NULL,
90 "initiator socket not fully initialized, name missing");
91 std::string name = "gasket_";
92 name += initiator_socket->name();
93 std::replace(name.begin(), name.end(), '.', '_');
94
95 const char* char_name = name.c_str();
96 if (sc_core::sc_find_object(char_name))
97 char_name = sc_core::sc_gen_unique_name(char_name);
98
100 initiator_socket, char_name, simics_obj);
101}
102
105template<typename MODULE, unsigned int BUSWIDTH, typename TYPES,
106 unsigned int N, sc_core::sc_port_policy POL>
107static GasketInterface::Ptr createGasket(
108 tlm_utils::multi_passthrough_initiator_socket<
109 MODULE, BUSWIDTH, TYPES, N, POL> *initiator_socket,
110 const simics::ConfObjectRef &simics_obj) {
111 FATAL_ERROR_IF(initiator_socket->name() == NULL,
112 "initiator socket not fully initialized, name missing");
113 auto gasket = internal::createGasket<BUSWIDTH, TYPES>(
114 initiator_socket->name(), simics_obj);
115 gasket->bind(*initiator_socket);
116 return GasketInterface::Ptr(gasket);
117}
118
120 const simics::ConfObjectRef &simics_obj);
121
123 public:
125 virtual GasketInterface::Ptr create(sc_core::sc_object *object,
126 const ConfObjectRef &simics_obj) = 0;
127};
128
129template <unsigned int BUSWIDTH, typename TYPES, int N = 1,
130 sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
131class GasketFactory : public Registrant<GasketFactoryInterface> {
132 public:
133 typedef tlm::tlm_base_initiator_socket<BUSWIDTH,
134 tlm::tlm_fw_transport_if<TYPES>,
135 tlm::tlm_bw_transport_if<TYPES>,
136 N, POL> Socket;
137
138 virtual GasketInterface::Ptr create(sc_core::sc_object *object,
139 const ConfObjectRef &simics_obj) {
140 Socket *socket = dynamic_cast<Socket *>(object);
141 if (!socket)
142 return NULL;
143
144 auto gasket = internal::createGasket<BUSWIDTH, TYPES>(
145 socket->name(), simics_obj);
146 gasket->bind(*socket);
147 return GasketInterface::Ptr(gasket);
148 }
149};
150
152
153} // namespace tlm2simics
154} // namespace systemc
155} // namespace simics
156
157#endif
Definition: registry.h:88
static GasketInterface::Ptr bind(tlm::tlm_initiator_socket< BUSWIDTH, TYPES, N, POL > *socket, const char *name, const simics::ConfObjectRef &simics_obj)
Definition: gasket_dispatcher.h:75
virtual ~GasketFactoryInterface()
Definition: gasket_factory.h:124
virtual GasketInterface::Ptr create(sc_core::sc_object *object, const ConfObjectRef &simics_obj)=0
Definition: gasket_factory.h:131
virtual GasketInterface::Ptr create(sc_core::sc_object *object, const ConfObjectRef &simics_obj)
Definition: gasket_factory.h:138
tlm::tlm_base_initiator_socket< BUSWIDTH, tlm::tlm_fw_transport_if< TYPES >, tlm::tlm_bw_transport_if< TYPES >, N, POL > Socket
Definition: gasket_factory.h:136
std::shared_ptr< GasketInterface > Ptr
Definition: gasket_interface.h:32
Implements core functionality for receiving a TLM2 transaction over a socket.
Definition: gasket.h:63
GasketInterface::Ptr createGasketByName(std::string socket_name, const simics::ConfObjectRef &simics_obj)
Definition: pci_bus_interface.h:24