48 static unsigned int max_num = 0;
49 if (increment) ++max_num;
59 virtual void free() {
delete this; }
82 const static unsigned int ID;
114 #define TLM_BYTE_DISABLED 0x0
115 #define TLM_BYTE_ENABLED 0xff
136 , m_byte_enable_length(0)
137 , m_streaming_width(0)
153 , m_byte_enable_length(0)
154 , m_streaming_width(0)
162 void acquire(){assert(m_mm != 0); m_ref_count++;}
163 void release(){assert(m_mm != 0 && m_ref_count > 0);
if (--m_ref_count==0) m_mm->
free(
this);}
166 bool has_mm()
const {
return m_mm != 0; }
171 m_extensions.free_entire_cache();
188 , m_gp_option(x.m_gp_option)
192 for(
unsigned int i=0; i<m_extensions.size(); i++)
201 m_command = x.get_command();
202 m_address = x.get_address();
203 m_data = x.get_data_ptr();
204 m_length = x.get_data_length();
205 m_response_status = x.get_response_status();
206 m_byte_enable = x.get_byte_enable_ptr();
207 m_byte_enable_length = x.get_byte_enable_length();
208 m_streaming_width = x.get_streaming_width();
209 m_gp_option = x.get_gp_option();
210 m_dmi = x.is_dmi_allowed();
216 for(
unsigned int i=0; i<m_extensions.size(); i++)
218 m_extensions[i] = x.get_extension(i);
237 if(m_data && other.m_data)
239 memcpy(m_data, other.m_data, m_length);
243 if(m_byte_enable && other.m_byte_enable)
245 memcpy(m_byte_enable, other.m_byte_enable, m_byte_enable_length);
248 for(
unsigned int i=0; i<other.m_extensions.size(); i++)
250 if(other.m_extensions[i])
269 m_extensions[i]->copy_from(*other.m_extensions[i]);
281 bool use_byte_enable_on_read =
true)
295 if(
is_read() && m_data && other.m_data && m_data != other.m_data)
297 if (m_byte_enable && use_byte_enable_on_read)
299 if (m_byte_enable_length == 8 && m_length % 8 == 0 )
302 for (
unsigned int i = 0; i < m_length; i += 8)
305 *
reinterpret_cast<u
>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable);
306 *
reinterpret_cast<u
>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) &
307 *
reinterpret_cast<u
>(m_byte_enable);
310 else if (m_byte_enable_length == 4 && m_length % 4 == 0 )
313 for (
unsigned int i = 0; i < m_length; i += 4)
315 typedef unsigned int* u;
316 *
reinterpret_cast<u
>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable);
317 *
reinterpret_cast<u
>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) &
318 *
reinterpret_cast<u
>(m_byte_enable);
323 for (
unsigned int i = 0; i < m_length; i++)
324 if ( m_byte_enable[i % m_byte_enable_length] )
325 m_data[i] = other.m_data[i];
328 memcpy(m_data, other.m_data, m_length);
335 for(
unsigned int i=0; i<other.m_extensions.size(); i++)
337 if(other.m_extensions[i])
341 m_extensions[i]->copy_from(*other.m_extensions[i]);
351 m_extensions.free_entire_cache();
352 for(
unsigned int i=0; i<m_extensions.size(); i++)
356 m_extensions[i]->free();
365 for(
unsigned int i=0; i<m_extensions.size(); i++)
366 if(m_extensions[i]) m_extensions[i]->free();
398 {m_response_status = response_status;}
401 switch(m_response_status)
411 return "TLM_UNKNOWN_RESPONSE";
472 unsigned char* m_data;
473 unsigned int m_length;
476 unsigned char* m_byte_enable;
477 unsigned int m_byte_enable_length;
478 unsigned int m_streaming_width;
530 m_extensions[index] = ext;
546 m_extensions[index] = ext;
547 if (!tmp) m_extensions.insert_in_cache(&m_extensions[index]);
555 ext = get_extension<T>();
564 return m_extensions[index];
573 clear_extension<T>();
590 release_extension<T>();
612 m_extensions.insert_in_cache(&m_extensions[index]);
616 m_extensions[index]->free();
617 m_extensions[index] =
static_cast<tlm_extension_base*
>(0);
635 unsigned int m_ref_count;
tlm_extension_base * set_extension(unsigned int index, tlm_extension_base *ext)
unsigned int get_data_length() const
void set_byte_enable_length(const unsigned int byte_enable_length)
virtual ~tlm_generic_payload()
void free_all_extensions()
tlm_generic_payload(tlm_mm_interface *mm)
static const unsigned int ID
void set_byte_enable_ptr(unsigned char *byte_enable)
void set_dmi_allowed(bool dmi_allowed)
void update_extensions_from(const tlm_generic_payload &other)
unsigned int get_byte_enable_length() const
void set_streaming_width(const unsigned int streaming_width)
virtual ~tlm_mm_interface()
virtual void free(tlm_generic_payload *)=0
void set_response_status(const tlm_response_status response_status)
void set_gp_option(const tlm_gp_option gp_opt)
void get_extension(T *&ext) const
bool is_response_ok() const
static unsigned int register_extension()
tlm_extension_base * set_auto_extension(unsigned int index, tlm_extension_base *ext)
T * set_extension(T *ext)
int get_ref_count() const
void set_command(const tlm_command command)
tlm_response_status get_response_status() const
bool is_response_error() const
virtual tlm_extension_base * clone() const =0
unsigned int max_num_extensions(bool increment=false)
T * set_auto_extension(T *ext)
virtual ~tlm_extension_base()
unsigned char * get_byte_enable_ptr() const
void set_data_length(const unsigned int length)
tlm_extension_base * get_extension(unsigned int index) const
void release_extension(T *ext)
std::string get_response_string() const
virtual void copy_from(tlm_extension_base const &)=0
void set_address(const sc_dt::uint64 address)
unsigned char * get_data_ptr() const
unsigned int get_streaming_width() const
bool is_dmi_allowed() const
tlm_gp_option get_gp_option() const
tlm_command get_command() const
void set_mm(tlm_mm_interface *mm)
void deep_copy_from(const tlm_generic_payload &other)
virtual void copy_from(tlm_extension_base const &ext)=0
void update_original_from(const tlm_generic_payload &other, bool use_byte_enable_on_read=true)
void set_data_ptr(unsigned char *data)
void clear_extension(const T *ext)
T * get_extension() const
sc_dt::uint64 get_address() const
virtual tlm_extension_base * clone() const =0