17 #ifndef _TLM_NW_TLM_NETWROK_GP_H_
18 #define _TLM_NW_TLM_NETWROK_GP_H_
23 #include <tlm_h/tlm_generic_payload/tlm_gp.h>
25 #include <tlm_core/tlm_2/tlm_generic_payload/tlm_array.h>
26 #include <tlm_core/tlm_2/tlm_generic_payload/tlm_gp.h>
35 struct tlm_network_payload_base;
48 : m_extensions(max_num_extensions())
53 for(
unsigned int i = 0; i < m_extensions.size(); i++)
55 m_extensions[i]->free();
58 void reset() { m_extensions.free_entire_cache(); }
66 sc_assert(m_mm != 0 && m_ref_count > 0);
67 if(--m_ref_count == 0)
71 int get_ref_count()
const {
return m_ref_count; }
74 bool has_mm()
const {
return m_mm != 0; }
81 void free_all_extensions();
84 template <
typename T> T* set_extension(T* ext) {
return static_cast<T*
>(set_extension(T::ID, ext)); }
87 tlm_extension_base* set_extension(
unsigned int index, tlm_extension_base* ext);
91 template <
typename T> T* set_auto_extension(T* ext) {
return static_cast<T*
>(set_auto_extension(T::ID, ext)); }
94 tlm_extension_base* set_auto_extension(
unsigned int index, tlm_extension_base* ext);
97 template <
typename T>
void get_extension(T*& ext)
const { ext = get_extension<T>(); }
98 template <
typename T> T* get_extension()
const {
return static_cast<T*
>(get_extension(T::ID)); }
100 tlm_extension_base* get_extension(
unsigned int index)
const;
106 template <
typename T>
void clear_extension(
const T* ext) { clear_extension<T>(); }
112 template <
typename T>
void clear_extension() { clear_extension(T::ID); }
117 template <
typename T>
void release_extension(T* ext) { release_extension<T>(); }
122 template <
typename T>
void release_extension() { release_extension(T::ID); }
126 void clear_extension(
unsigned int index);
128 void release_extension(
unsigned int index);
136 void resize_extensions();
139 tlm::tlm_array<tlm_extension_base*> m_extensions;
141 unsigned int m_ref_count;
162 CMDENUM get_command()
const {
return m_command; }
163 void set_command(
const CMDENUM command) { m_command = command; }
165 std::vector<uint8_t>
const& get_data()
const {
return m_data; }
166 std::vector<uint8_t>& get_data() {
return m_data; }
167 void set_data(std::vector<uint8_t>
const& value) { m_data = value; }
170 bool is_response_ok()
const {
return (m_response_status > 0); }
171 bool is_response_error()
const {
return (m_response_status <= 0); }
172 tlm_response_status get_response_status()
const {
return m_response_status; }
173 void set_response_status(
const tlm_response_status response_status) { m_response_status = response_status; }
174 std::string get_response_string()
const;
179 auto ret = pool.front();
187 t->free_all_extensions();
196 std::deque<tlm_network_payload<CMDENUM>*> pool;
200 static thread_local
gp_mm mm;
206 std::vector<uint8_t> m_data;
207 tlm_response_status m_response_status;
212 template <
typename CMDENUM>
213 inline tlm_network_payload<CMDENUM>::tlm_network_payload()
214 : tlm_network_payload_base()
215 , m_command(static_cast<CMDENUM>(0))
216 , m_response_status(TLM_OK_RESPONSE) {}
218 template <
typename CMDENUM>
219 inline tlm_network_payload<CMDENUM>::tlm_network_payload(tlm_base_mm_interface* mm)
220 : tlm_network_payload_base(mm)
221 , m_command(static_cast<CMDENUM>(0))
222 , m_response_status(TLM_OK_RESPONSE) {}
224 inline void tlm_network_payload_base::free_all_extensions() {
225 m_extensions.free_entire_cache();
226 for(
unsigned int i = 0; i < m_extensions.size(); i++) {
227 if(m_extensions[i]) {
228 m_extensions[i]->free();
234 template <
typename CMDENUM>
void tlm_network_payload<CMDENUM>::deep_copy_from(
const tlm_network_payload& other) {
235 m_command = other.get_command();
236 m_response_status = other.get_response_status();
237 m_data = other.get_data();
238 copy_extensions_from(other);
241 template <
typename CMDENUM> std::string tlm_network_payload<CMDENUM>::get_response_string()
const {
242 switch(m_response_status) {
243 case TLM_OK_RESPONSE:
244 return "TLM_OK_RESPONSE";
245 case TLM_INCOMPLETE_RESPONSE:
246 return "TLM_INCOMPLETE_RESPONSE";
247 case TLM_GENERIC_ERROR_RESPONSE:
248 return "TLM_GENERIC_ERROR_RESPONSE";
249 case TLM_ADDRESS_ERROR_RESPONSE:
250 return "TLM_ADDRESS_ERROR_RESPONSE";
251 case TLM_COMMAND_ERROR_RESPONSE:
252 return "TLM_COMMAND_ERROR_RESPONSE";
253 case TLM_BURST_ERROR_RESPONSE:
254 return "TLM_BURST_ERROR_RESPONSE";
255 case TLM_BYTE_ENABLE_ERROR_RESPONSE:
256 return "TLM_BYTE_ENABLE_ERROR_RESPONSE";
258 return "TLM_UNKNOWN_RESPONSE";
261 inline tlm_extension_base* tlm_network_payload_base::set_extension(
unsigned int index, tlm_extension_base* ext) {
262 sc_assert(index < m_extensions.size());
263 tlm_extension_base* tmp = m_extensions[index];
264 m_extensions[index] = ext;
268 inline tlm_extension_base* tlm_network_payload_base::set_auto_extension(
unsigned int index, tlm_extension_base* ext) {
269 sc_assert(index < m_extensions.size());
270 tlm_extension_base* tmp = m_extensions[index];
271 m_extensions[index] = ext;
273 m_extensions.insert_in_cache(&m_extensions[index]);
274 sc_assert(m_mm != 0);
278 inline tlm_extension_base* tlm_network_payload_base::get_extension(
unsigned int index)
const {
279 sc_assert(index < m_extensions.size());
280 return m_extensions[index];
283 inline void tlm_network_payload_base::clear_extension(
unsigned int index) {
284 sc_assert(index < m_extensions.size());
285 m_extensions[index] =
static_cast<tlm_extension_base*
>(0);
288 inline void tlm_network_payload_base::release_extension(
unsigned int index) {
289 sc_assert(index < m_extensions.size());
291 m_extensions.insert_in_cache(&m_extensions[index]);
293 m_extensions[index]->free();
294 m_extensions[index] =
static_cast<tlm_extension_base*
>(0);
298 inline void tlm_network_payload_base::update_extensions_from(
const tlm_network_payload_base& other) {
300 sc_assert(m_extensions.size() <= other.m_extensions.size());
301 for(
unsigned int i = 0; i < m_extensions.size(); i++) {
302 if(other.m_extensions[i]) {
303 if(m_extensions[i]) {
304 m_extensions[i]->copy_from(*other.m_extensions[i]);
310 inline void tlm_network_payload_base::copy_extensions_from(
const tlm_network_payload_base& other) {
312 if(m_extensions.size() < other.m_extensions.size())
313 m_extensions.expand(other.m_extensions.size());
314 for(
unsigned int i = 0; i < other.m_extensions.size(); i++) {
315 if(other.m_extensions[i]) {
316 if(!m_extensions[i]) {
317 tlm_extension_base* ext = other.m_extensions[i]->clone();
320 set_auto_extension(i, ext);
322 set_extension(i, ext);
326 m_extensions[i]->copy_from(*other.m_extensions[i]);
332 inline void tlm_network_payload_base::resize_extensions() { m_extensions.expand(max_num_extensions()); }