112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de// 12-Jan-2009 John Aynsley Bug fix. has_mm() and get_ref_count() should both be const 2112027Sjungma@eit.uni-kl.de// 23-Mar-2009 John Aynsley Add method update_original_from() 2212027Sjungma@eit.uni-kl.de// 20-Apr-2009 John Aynsley Bug fix for 64-bit machines: unsigned long int -> unsigned int 2312027Sjungma@eit.uni-kl.de// 5-May-2011 JA and Philipp Hartmann Add tlm_gp_option, set_gp_option, get_gp_option 2412027Sjungma@eit.uni-kl.de// 11-May-2011 John Aynsley Add run-time check to release() 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de#ifndef __TLM_GP_H__ 2812027Sjungma@eit.uni-kl.de#define __TLM_GP_H__ 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de#include <systemc> 3112027Sjungma@eit.uni-kl.de#include "tlm_core/tlm_2/tlm_generic_payload/tlm_array.h" 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.denamespace tlm { 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.declass 3612027Sjungma@eit.uni-kl.detlm_generic_payload; 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.declass tlm_mm_interface { 3912027Sjungma@eit.uni-kl.depublic: 4012027Sjungma@eit.uni-kl.de virtual void free(tlm_generic_payload*) = 0; 4112027Sjungma@eit.uni-kl.de virtual ~tlm_mm_interface() {} 4212027Sjungma@eit.uni-kl.de}; 4312027Sjungma@eit.uni-kl.de 4412027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 4512027Sjungma@eit.uni-kl.de// Classes and helper functions for the extension mechanism 4612027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 4712027Sjungma@eit.uni-kl.de// Helper function: 4812027Sjungma@eit.uni-kl.deinline unsigned int max_num_extensions(bool increment=false) 4912027Sjungma@eit.uni-kl.de{ 5012027Sjungma@eit.uni-kl.de static unsigned int max_num = 0; 5112027Sjungma@eit.uni-kl.de if (increment) ++max_num; 5212027Sjungma@eit.uni-kl.de return max_num; 5312027Sjungma@eit.uni-kl.de} 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.de// This class can be used for storing pointers to the extension classes, used 5612027Sjungma@eit.uni-kl.de// in tlm_generic_payload: 5712027Sjungma@eit.uni-kl.declass tlm_extension_base 5812027Sjungma@eit.uni-kl.de{ 5912027Sjungma@eit.uni-kl.depublic: 6012027Sjungma@eit.uni-kl.de virtual tlm_extension_base* clone() const = 0; 6112027Sjungma@eit.uni-kl.de virtual void free() { delete this; } 6212027Sjungma@eit.uni-kl.de virtual void copy_from(tlm_extension_base const &) = 0; 6312027Sjungma@eit.uni-kl.deprotected: 6412027Sjungma@eit.uni-kl.de virtual ~tlm_extension_base() {} 6512027Sjungma@eit.uni-kl.de static unsigned int register_extension() 6612027Sjungma@eit.uni-kl.de { 6712027Sjungma@eit.uni-kl.de return (max_num_extensions(true) - 1); 6812027Sjungma@eit.uni-kl.de }; 6912027Sjungma@eit.uni-kl.de}; 7012027Sjungma@eit.uni-kl.de 7112027Sjungma@eit.uni-kl.de// Base class for all extension classes, derive your extension class in 7212027Sjungma@eit.uni-kl.de// the following way: 7312027Sjungma@eit.uni-kl.de// class my_extension : public tlm_extension<my_extension> { ... 7412027Sjungma@eit.uni-kl.de// This triggers proper extension registration during C++ static 7512027Sjungma@eit.uni-kl.de// contruction time. my_extension::ID will hold the unique index in the 7612027Sjungma@eit.uni-kl.de// tlm_generic_payload::m_extensions array. 7712027Sjungma@eit.uni-kl.detemplate <typename T> 7812027Sjungma@eit.uni-kl.declass tlm_extension : public tlm_extension_base 7912027Sjungma@eit.uni-kl.de{ 8012027Sjungma@eit.uni-kl.depublic: 8112027Sjungma@eit.uni-kl.de virtual tlm_extension_base* clone() const = 0; 8212027Sjungma@eit.uni-kl.de virtual void copy_from(tlm_extension_base const &ext) = 0; //{assert(typeid(this)==typeid(ext)); assert(ID === ext.ID); assert(0);} 8312027Sjungma@eit.uni-kl.de virtual ~tlm_extension() {} 8412027Sjungma@eit.uni-kl.de const static unsigned int ID; 8512027Sjungma@eit.uni-kl.de}; 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.detemplate <typename T> 8812027Sjungma@eit.uni-kl.deconst 8912027Sjungma@eit.uni-kl.deunsigned int tlm_extension<T>::ID = tlm_extension_base::register_extension(); 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 9212027Sjungma@eit.uni-kl.de// enumeration types 9312027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 9412027Sjungma@eit.uni-kl.deenum tlm_command { 9512027Sjungma@eit.uni-kl.de TLM_READ_COMMAND, 9612027Sjungma@eit.uni-kl.de TLM_WRITE_COMMAND, 9712027Sjungma@eit.uni-kl.de TLM_IGNORE_COMMAND 9812027Sjungma@eit.uni-kl.de}; 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.deenum tlm_response_status { 10112027Sjungma@eit.uni-kl.de TLM_OK_RESPONSE = 1, 10212027Sjungma@eit.uni-kl.de TLM_INCOMPLETE_RESPONSE = 0, 10312027Sjungma@eit.uni-kl.de TLM_GENERIC_ERROR_RESPONSE = -1, 10412027Sjungma@eit.uni-kl.de TLM_ADDRESS_ERROR_RESPONSE = -2, 10512027Sjungma@eit.uni-kl.de TLM_COMMAND_ERROR_RESPONSE = -3, 10612027Sjungma@eit.uni-kl.de TLM_BURST_ERROR_RESPONSE = -4, 10712027Sjungma@eit.uni-kl.de TLM_BYTE_ENABLE_ERROR_RESPONSE = -5 10812027Sjungma@eit.uni-kl.de}; 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.deenum tlm_gp_option { 11112027Sjungma@eit.uni-kl.de TLM_MIN_PAYLOAD, 11212027Sjungma@eit.uni-kl.de TLM_FULL_PAYLOAD, 11312027Sjungma@eit.uni-kl.de TLM_FULL_PAYLOAD_ACCEPTED 11412027Sjungma@eit.uni-kl.de}; 11512027Sjungma@eit.uni-kl.de 11612027Sjungma@eit.uni-kl.de#define TLM_BYTE_DISABLED 0x0 11712027Sjungma@eit.uni-kl.de#define TLM_BYTE_ENABLED 0xff 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 12012027Sjungma@eit.uni-kl.de// The generic payload class: 12112027Sjungma@eit.uni-kl.de//--------------------------------------------------------------------------- 12212027Sjungma@eit.uni-kl.declass tlm_generic_payload { 12312027Sjungma@eit.uni-kl.de 12412027Sjungma@eit.uni-kl.depublic: 12512027Sjungma@eit.uni-kl.de //--------------- 12612027Sjungma@eit.uni-kl.de // Constructors 12712027Sjungma@eit.uni-kl.de //--------------- 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.de // Default constructor 13012027Sjungma@eit.uni-kl.de tlm_generic_payload() 13112027Sjungma@eit.uni-kl.de : m_address(0) 13212027Sjungma@eit.uni-kl.de , m_command(TLM_IGNORE_COMMAND) 13312027Sjungma@eit.uni-kl.de , m_data(0) 13412027Sjungma@eit.uni-kl.de , m_length(0) 13512027Sjungma@eit.uni-kl.de , m_response_status(TLM_INCOMPLETE_RESPONSE) 13612027Sjungma@eit.uni-kl.de , m_dmi(false) 13712027Sjungma@eit.uni-kl.de , m_byte_enable(0) 13812027Sjungma@eit.uni-kl.de , m_byte_enable_length(0) 13912027Sjungma@eit.uni-kl.de , m_streaming_width(0) 14012027Sjungma@eit.uni-kl.de , m_gp_option(TLM_MIN_PAYLOAD) 14112027Sjungma@eit.uni-kl.de , m_extensions(max_num_extensions()) 14212027Sjungma@eit.uni-kl.de , m_mm(0) 14312027Sjungma@eit.uni-kl.de , m_ref_count(0) 14412027Sjungma@eit.uni-kl.de { 14512027Sjungma@eit.uni-kl.de } 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de explicit tlm_generic_payload(tlm_mm_interface* mm) 14812027Sjungma@eit.uni-kl.de : m_address(0) 14912027Sjungma@eit.uni-kl.de , m_command(TLM_IGNORE_COMMAND) 15012027Sjungma@eit.uni-kl.de , m_data(0) 15112027Sjungma@eit.uni-kl.de , m_length(0) 15212027Sjungma@eit.uni-kl.de , m_response_status(TLM_INCOMPLETE_RESPONSE) 15312027Sjungma@eit.uni-kl.de , m_dmi(false) 15412027Sjungma@eit.uni-kl.de , m_byte_enable(0) 15512027Sjungma@eit.uni-kl.de , m_byte_enable_length(0) 15612027Sjungma@eit.uni-kl.de , m_streaming_width(0) 15712027Sjungma@eit.uni-kl.de , m_gp_option(TLM_MIN_PAYLOAD) 15812027Sjungma@eit.uni-kl.de , m_extensions(max_num_extensions()) 15912027Sjungma@eit.uni-kl.de , m_mm(mm) 16012027Sjungma@eit.uni-kl.de , m_ref_count(0) 16112027Sjungma@eit.uni-kl.de { 16212027Sjungma@eit.uni-kl.de } 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.de void acquire(){assert(m_mm != 0); m_ref_count++;} 16512027Sjungma@eit.uni-kl.de void release(){assert(m_mm != 0 && m_ref_count > 0); if (--m_ref_count==0) m_mm->free(this);} 16612027Sjungma@eit.uni-kl.de int get_ref_count() const {return m_ref_count;} 16712027Sjungma@eit.uni-kl.de void set_mm(tlm_mm_interface* mm) { m_mm = mm; } 16812027Sjungma@eit.uni-kl.de bool has_mm() const { return m_mm != 0; } 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.de void reset(){ 17112027Sjungma@eit.uni-kl.de //should the other members be reset too? 17212027Sjungma@eit.uni-kl.de m_gp_option = TLM_MIN_PAYLOAD; 17312027Sjungma@eit.uni-kl.de m_extensions.free_entire_cache(); 17412027Sjungma@eit.uni-kl.de }; 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.deprivate: 17812027Sjungma@eit.uni-kl.de //disabled copy ctor and assignment operator. 17912027Sjungma@eit.uni-kl.de // Copy constructor 18012027Sjungma@eit.uni-kl.de tlm_generic_payload(const tlm_generic_payload& x) 18112027Sjungma@eit.uni-kl.de : m_address(x.get_address()) 18212027Sjungma@eit.uni-kl.de , m_command(x.get_command()) 18312027Sjungma@eit.uni-kl.de , m_data(x.get_data_ptr()) 18412027Sjungma@eit.uni-kl.de , m_length(x.get_data_length()) 18512027Sjungma@eit.uni-kl.de , m_response_status(x.get_response_status()) 18612027Sjungma@eit.uni-kl.de , m_dmi(x.is_dmi_allowed()) 18712027Sjungma@eit.uni-kl.de , m_byte_enable(x.get_byte_enable_ptr()) 18812027Sjungma@eit.uni-kl.de , m_byte_enable_length(x.get_byte_enable_length()) 18912027Sjungma@eit.uni-kl.de , m_streaming_width(x.get_streaming_width()) 19012027Sjungma@eit.uni-kl.de , m_gp_option(x.m_gp_option) 19112027Sjungma@eit.uni-kl.de , m_extensions(max_num_extensions()) 19212027Sjungma@eit.uni-kl.de { 19312027Sjungma@eit.uni-kl.de // copy all extensions 19412027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<m_extensions.size(); i++) 19512027Sjungma@eit.uni-kl.de { 19612027Sjungma@eit.uni-kl.de m_extensions[i] = x.get_extension(i); 19712027Sjungma@eit.uni-kl.de } 19812027Sjungma@eit.uni-kl.de } 19912027Sjungma@eit.uni-kl.de 20012027Sjungma@eit.uni-kl.de // Assignment operator 20112027Sjungma@eit.uni-kl.de tlm_generic_payload& operator= (const tlm_generic_payload& x) 20212027Sjungma@eit.uni-kl.de { 20312027Sjungma@eit.uni-kl.de m_command = x.get_command(); 20412027Sjungma@eit.uni-kl.de m_address = x.get_address(); 20512027Sjungma@eit.uni-kl.de m_data = x.get_data_ptr(); 20612027Sjungma@eit.uni-kl.de m_length = x.get_data_length(); 20712027Sjungma@eit.uni-kl.de m_response_status = x.get_response_status(); 20812027Sjungma@eit.uni-kl.de m_byte_enable = x.get_byte_enable_ptr(); 20912027Sjungma@eit.uni-kl.de m_byte_enable_length = x.get_byte_enable_length(); 21012027Sjungma@eit.uni-kl.de m_streaming_width = x.get_streaming_width(); 21112027Sjungma@eit.uni-kl.de m_gp_option = x.get_gp_option(); 21212027Sjungma@eit.uni-kl.de m_dmi = x.is_dmi_allowed(); 21312027Sjungma@eit.uni-kl.de 21412027Sjungma@eit.uni-kl.de // extension copy: all extension arrays must be of equal size by 21512027Sjungma@eit.uni-kl.de // construction (i.e. it must either be constructed after C++ 21612027Sjungma@eit.uni-kl.de // static construction time, or the resize_extensions() method must 21712027Sjungma@eit.uni-kl.de // have been called prior to using the object) 21812027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<m_extensions.size(); i++) 21912027Sjungma@eit.uni-kl.de { 22012027Sjungma@eit.uni-kl.de m_extensions[i] = x.get_extension(i); 22112027Sjungma@eit.uni-kl.de } 22212027Sjungma@eit.uni-kl.de return (*this); 22312027Sjungma@eit.uni-kl.de } 22412027Sjungma@eit.uni-kl.depublic: 22512027Sjungma@eit.uni-kl.de // non-virtual deep-copying of the object 22612027Sjungma@eit.uni-kl.de void deep_copy_from(const tlm_generic_payload & other) 22712027Sjungma@eit.uni-kl.de { 22812027Sjungma@eit.uni-kl.de m_command = other.get_command(); 22912027Sjungma@eit.uni-kl.de m_address = other.get_address(); 23012027Sjungma@eit.uni-kl.de m_length = other.get_data_length(); 23112027Sjungma@eit.uni-kl.de m_response_status = other.get_response_status(); 23212027Sjungma@eit.uni-kl.de m_byte_enable_length = other.get_byte_enable_length(); 23312027Sjungma@eit.uni-kl.de m_streaming_width = other.get_streaming_width(); 23412027Sjungma@eit.uni-kl.de m_gp_option = other.get_gp_option(); 23512027Sjungma@eit.uni-kl.de m_dmi = other.is_dmi_allowed(); 23612027Sjungma@eit.uni-kl.de 23712027Sjungma@eit.uni-kl.de // deep copy data 23812027Sjungma@eit.uni-kl.de // there must be enough space in the target transaction! 23912027Sjungma@eit.uni-kl.de if(m_data && other.m_data) 24012027Sjungma@eit.uni-kl.de { 24112027Sjungma@eit.uni-kl.de memcpy(m_data, other.m_data, m_length); 24212027Sjungma@eit.uni-kl.de } 24312027Sjungma@eit.uni-kl.de // deep copy byte enables 24412027Sjungma@eit.uni-kl.de // there must be enough space in the target transaction! 24512027Sjungma@eit.uni-kl.de if(m_byte_enable && other.m_byte_enable) 24612027Sjungma@eit.uni-kl.de { 24712027Sjungma@eit.uni-kl.de memcpy(m_byte_enable, other.m_byte_enable, m_byte_enable_length); 24812027Sjungma@eit.uni-kl.de } 24912027Sjungma@eit.uni-kl.de // deep copy extensions (sticky and non-sticky) 25012027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<other.m_extensions.size(); i++) 25112027Sjungma@eit.uni-kl.de { 25212027Sjungma@eit.uni-kl.de if(other.m_extensions[i]) 25312027Sjungma@eit.uni-kl.de { //original has extension i 25412027Sjungma@eit.uni-kl.de if(!m_extensions[i]) 25512027Sjungma@eit.uni-kl.de { //We don't: clone. 25612027Sjungma@eit.uni-kl.de tlm_extension_base *ext = other.m_extensions[i]->clone(); 25712027Sjungma@eit.uni-kl.de if(ext) //extension may not be clonable. 25812027Sjungma@eit.uni-kl.de { 25912027Sjungma@eit.uni-kl.de if(has_mm()) 26012027Sjungma@eit.uni-kl.de { //mm can take care of removing cloned extensions 26112027Sjungma@eit.uni-kl.de set_auto_extension(i, ext); 26212027Sjungma@eit.uni-kl.de } 26312027Sjungma@eit.uni-kl.de else 26412027Sjungma@eit.uni-kl.de { // no mm, user will call free_all_extensions(). 26512027Sjungma@eit.uni-kl.de set_extension(i, ext); 26612027Sjungma@eit.uni-kl.de } 26712027Sjungma@eit.uni-kl.de } 26812027Sjungma@eit.uni-kl.de } 26912027Sjungma@eit.uni-kl.de else 27012027Sjungma@eit.uni-kl.de { //We already have such extension. Copy original over it. 27112027Sjungma@eit.uni-kl.de m_extensions[i]->copy_from(*other.m_extensions[i]); 27212027Sjungma@eit.uni-kl.de } 27312027Sjungma@eit.uni-kl.de } 27412027Sjungma@eit.uni-kl.de } 27512027Sjungma@eit.uni-kl.de } 27612027Sjungma@eit.uni-kl.de 27712027Sjungma@eit.uni-kl.de // To update the state of the original generic payload from a deep copy 27812027Sjungma@eit.uni-kl.de // Assumes that "other" was created from the original by calling deep_copy_from 27912027Sjungma@eit.uni-kl.de // Argument use_byte_enable_on_read determines whether to use or ignores byte enables 28012027Sjungma@eit.uni-kl.de // when copying back the data array on a read command 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.de void update_original_from(const tlm_generic_payload & other, 28312027Sjungma@eit.uni-kl.de bool use_byte_enable_on_read = true) 28412027Sjungma@eit.uni-kl.de { 28512027Sjungma@eit.uni-kl.de // Copy back extensions that are present on the original 28612027Sjungma@eit.uni-kl.de update_extensions_from(other); 28712027Sjungma@eit.uni-kl.de 28812027Sjungma@eit.uni-kl.de // Copy back the response status and DMI hint attributes 28912027Sjungma@eit.uni-kl.de m_response_status = other.get_response_status(); 29012027Sjungma@eit.uni-kl.de m_dmi = other.is_dmi_allowed(); 29112027Sjungma@eit.uni-kl.de 29212027Sjungma@eit.uni-kl.de // Copy back the data array for a read command only 29312027Sjungma@eit.uni-kl.de // deep_copy_from allowed null pointers, and so will we 29412027Sjungma@eit.uni-kl.de // We assume the arrays are the same size 29512027Sjungma@eit.uni-kl.de // We test for equal pointers in case the original and the copy share the same array 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.de if(is_read() && m_data && other.m_data && m_data != other.m_data) 29812027Sjungma@eit.uni-kl.de { 29912027Sjungma@eit.uni-kl.de if (m_byte_enable && use_byte_enable_on_read) 30012027Sjungma@eit.uni-kl.de { 30112027Sjungma@eit.uni-kl.de if (m_byte_enable_length == 8 && m_length % 8 == 0 ) 30212027Sjungma@eit.uni-kl.de { 30312027Sjungma@eit.uni-kl.de // Optimized implementation copies 64-bit words by masking 30412027Sjungma@eit.uni-kl.de for (unsigned int i = 0; i < m_length; i += 8) 30512027Sjungma@eit.uni-kl.de { 30612027Sjungma@eit.uni-kl.de typedef sc_dt::uint64* u; 30712027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable); 30812027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) & 30912027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(m_byte_enable); 31012027Sjungma@eit.uni-kl.de } 31112027Sjungma@eit.uni-kl.de } 31212027Sjungma@eit.uni-kl.de else if (m_byte_enable_length == 4 && m_length % 4 == 0 ) 31312027Sjungma@eit.uni-kl.de { 31412027Sjungma@eit.uni-kl.de // Optimized implementation copies 32-bit words by masking 31512027Sjungma@eit.uni-kl.de for (unsigned int i = 0; i < m_length; i += 4) 31612027Sjungma@eit.uni-kl.de { 31712027Sjungma@eit.uni-kl.de typedef unsigned int* u; 31812027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable); 31912027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) & 32012027Sjungma@eit.uni-kl.de *reinterpret_cast<u>(m_byte_enable); 32112027Sjungma@eit.uni-kl.de } 32212027Sjungma@eit.uni-kl.de } 32312027Sjungma@eit.uni-kl.de else 32412027Sjungma@eit.uni-kl.de // Unoptimized implementation 32512027Sjungma@eit.uni-kl.de for (unsigned int i = 0; i < m_length; i++) 32612027Sjungma@eit.uni-kl.de if ( m_byte_enable[i % m_byte_enable_length] ) 32712027Sjungma@eit.uni-kl.de m_data[i] = other.m_data[i]; 32812027Sjungma@eit.uni-kl.de } 32912027Sjungma@eit.uni-kl.de else 33012027Sjungma@eit.uni-kl.de memcpy(m_data, other.m_data, m_length); 33112027Sjungma@eit.uni-kl.de } 33212027Sjungma@eit.uni-kl.de } 33312027Sjungma@eit.uni-kl.de 33412027Sjungma@eit.uni-kl.de void update_extensions_from(const tlm_generic_payload & other) 33512027Sjungma@eit.uni-kl.de { 33612027Sjungma@eit.uni-kl.de // deep copy extensions that are already present 33712027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<other.m_extensions.size(); i++) 33812027Sjungma@eit.uni-kl.de { 33912027Sjungma@eit.uni-kl.de if(other.m_extensions[i]) 34012027Sjungma@eit.uni-kl.de { //original has extension i 34112027Sjungma@eit.uni-kl.de if(m_extensions[i]) 34212027Sjungma@eit.uni-kl.de { //We have it too. copy. 34312027Sjungma@eit.uni-kl.de m_extensions[i]->copy_from(*other.m_extensions[i]); 34412027Sjungma@eit.uni-kl.de } 34512027Sjungma@eit.uni-kl.de } 34612027Sjungma@eit.uni-kl.de } 34712027Sjungma@eit.uni-kl.de } 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.de // Free all extensions. Useful when reusing a cloned transaction that doesn't have memory manager. 35012027Sjungma@eit.uni-kl.de // normal and sticky extensions are freed and extension array cleared. 35112027Sjungma@eit.uni-kl.de void free_all_extensions() 35212027Sjungma@eit.uni-kl.de { 35312027Sjungma@eit.uni-kl.de m_extensions.free_entire_cache(); 35412027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<m_extensions.size(); i++) 35512027Sjungma@eit.uni-kl.de { 35612027Sjungma@eit.uni-kl.de if(m_extensions[i]) 35712027Sjungma@eit.uni-kl.de { 35812027Sjungma@eit.uni-kl.de m_extensions[i]->free(); 35912027Sjungma@eit.uni-kl.de m_extensions[i] = 0; 36012027Sjungma@eit.uni-kl.de } 36112027Sjungma@eit.uni-kl.de } 36212027Sjungma@eit.uni-kl.de } 36312027Sjungma@eit.uni-kl.de //-------------- 36412027Sjungma@eit.uni-kl.de // Destructor 36512027Sjungma@eit.uni-kl.de //-------------- 36612027Sjungma@eit.uni-kl.de virtual ~tlm_generic_payload() { 36712027Sjungma@eit.uni-kl.de for(unsigned int i=0; i<m_extensions.size(); i++) 36812027Sjungma@eit.uni-kl.de if(m_extensions[i]) m_extensions[i]->free(); 36912027Sjungma@eit.uni-kl.de } 37012027Sjungma@eit.uni-kl.de 37112027Sjungma@eit.uni-kl.de //---------------- 37212027Sjungma@eit.uni-kl.de // API (including setters & getters) 37312027Sjungma@eit.uni-kl.de //--------------- 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de // Command related method 37612027Sjungma@eit.uni-kl.de bool is_read() const {return (m_command == TLM_READ_COMMAND);} 37712027Sjungma@eit.uni-kl.de void set_read() {m_command = TLM_READ_COMMAND;} 37812027Sjungma@eit.uni-kl.de bool is_write() const {return (m_command == TLM_WRITE_COMMAND);} 37912027Sjungma@eit.uni-kl.de void set_write() {m_command = TLM_WRITE_COMMAND;} 38012027Sjungma@eit.uni-kl.de tlm_command get_command() const {return m_command;} 38112027Sjungma@eit.uni-kl.de void set_command(const tlm_command command) {m_command = command;} 38212027Sjungma@eit.uni-kl.de 38312027Sjungma@eit.uni-kl.de // Address related methods 38412027Sjungma@eit.uni-kl.de sc_dt::uint64 get_address() const {return m_address;} 38512027Sjungma@eit.uni-kl.de void set_address(const sc_dt::uint64 address) {m_address = address;} 38612027Sjungma@eit.uni-kl.de 38712027Sjungma@eit.uni-kl.de // Data related methods 38812027Sjungma@eit.uni-kl.de unsigned char* get_data_ptr() const {return m_data;} 38912027Sjungma@eit.uni-kl.de void set_data_ptr(unsigned char* data) {m_data = data;} 39012027Sjungma@eit.uni-kl.de 39112027Sjungma@eit.uni-kl.de // Transaction length (in bytes) related methods 39212027Sjungma@eit.uni-kl.de unsigned int get_data_length() const {return m_length;} 39312027Sjungma@eit.uni-kl.de void set_data_length(const unsigned int length) {m_length = length;} 39412027Sjungma@eit.uni-kl.de 39512027Sjungma@eit.uni-kl.de // Response status related methods 39612027Sjungma@eit.uni-kl.de bool is_response_ok() const {return (m_response_status > 0);} 39712027Sjungma@eit.uni-kl.de bool is_response_error() const {return (m_response_status <= 0);} 39812027Sjungma@eit.uni-kl.de tlm_response_status get_response_status() const {return m_response_status;} 39912027Sjungma@eit.uni-kl.de void set_response_status(const tlm_response_status response_status) 40012027Sjungma@eit.uni-kl.de {m_response_status = response_status;} 40112027Sjungma@eit.uni-kl.de std::string get_response_string() const 40212027Sjungma@eit.uni-kl.de { 40312027Sjungma@eit.uni-kl.de switch(m_response_status) 40412027Sjungma@eit.uni-kl.de { 40512027Sjungma@eit.uni-kl.de case TLM_OK_RESPONSE: return "TLM_OK_RESPONSE"; 40612027Sjungma@eit.uni-kl.de case TLM_INCOMPLETE_RESPONSE: return "TLM_INCOMPLETE_RESPONSE"; 40712027Sjungma@eit.uni-kl.de case TLM_GENERIC_ERROR_RESPONSE: return "TLM_GENERIC_ERROR_RESPONSE"; 40812027Sjungma@eit.uni-kl.de case TLM_ADDRESS_ERROR_RESPONSE: return "TLM_ADDRESS_ERROR_RESPONSE"; 40912027Sjungma@eit.uni-kl.de case TLM_COMMAND_ERROR_RESPONSE: return "TLM_COMMAND_ERROR_RESPONSE"; 41012027Sjungma@eit.uni-kl.de case TLM_BURST_ERROR_RESPONSE: return "TLM_BURST_ERROR_RESPONSE"; 41112027Sjungma@eit.uni-kl.de case TLM_BYTE_ENABLE_ERROR_RESPONSE: return "TLM_BYTE_ENABLE_ERROR_RESPONSE"; 41212027Sjungma@eit.uni-kl.de } 41312027Sjungma@eit.uni-kl.de return "TLM_UNKNOWN_RESPONSE"; 41412027Sjungma@eit.uni-kl.de } 41512027Sjungma@eit.uni-kl.de 41612027Sjungma@eit.uni-kl.de // Streaming related methods 41712027Sjungma@eit.uni-kl.de unsigned int get_streaming_width() const {return m_streaming_width;} 41812027Sjungma@eit.uni-kl.de void set_streaming_width(const unsigned int streaming_width) {m_streaming_width = streaming_width; } 41912027Sjungma@eit.uni-kl.de 42012027Sjungma@eit.uni-kl.de // Byte enable related methods 42112027Sjungma@eit.uni-kl.de unsigned char* get_byte_enable_ptr() const {return m_byte_enable;} 42212027Sjungma@eit.uni-kl.de void set_byte_enable_ptr(unsigned char* byte_enable){m_byte_enable = byte_enable;} 42312027Sjungma@eit.uni-kl.de unsigned int get_byte_enable_length() const {return m_byte_enable_length;} 42412027Sjungma@eit.uni-kl.de void set_byte_enable_length(const unsigned int byte_enable_length){m_byte_enable_length = byte_enable_length;} 42512027Sjungma@eit.uni-kl.de 42612027Sjungma@eit.uni-kl.de // This is the "DMI-hint" a slave can set this to true if it 42712027Sjungma@eit.uni-kl.de // wants to indicate that a DMI request would be supported: 42812027Sjungma@eit.uni-kl.de void set_dmi_allowed(bool dmi_allowed) { m_dmi = dmi_allowed; } 42912027Sjungma@eit.uni-kl.de bool is_dmi_allowed() const { return m_dmi; } 43012027Sjungma@eit.uni-kl.de 43112027Sjungma@eit.uni-kl.de // Use full set of attributes in DMI/debug? 43212027Sjungma@eit.uni-kl.de tlm_gp_option get_gp_option() const { return m_gp_option; } 43312027Sjungma@eit.uni-kl.de void set_gp_option( const tlm_gp_option gp_opt ) { m_gp_option = gp_opt; } 43412027Sjungma@eit.uni-kl.de 43512027Sjungma@eit.uni-kl.deprivate: 43612027Sjungma@eit.uni-kl.de 43712027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 43812027Sjungma@eit.uni-kl.de /* Generic Payload attributes: */ 43912027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 44012027Sjungma@eit.uni-kl.de /* - m_command : Type of transaction. Three values supported: */ 44112027Sjungma@eit.uni-kl.de /* - TLM_WRITE_COMMAND */ 44212027Sjungma@eit.uni-kl.de /* - TLM_READ_COMMAND */ 44312027Sjungma@eit.uni-kl.de /* - TLM_IGNORE_COMMAND */ 44412027Sjungma@eit.uni-kl.de /* - m_address : Transaction base address (byte-addressing). */ 44512027Sjungma@eit.uni-kl.de /* - m_data : When m_command = TLM_WRITE_COMMAND contains a */ 44612027Sjungma@eit.uni-kl.de /* pointer to the data to be written in the target.*/ 44712027Sjungma@eit.uni-kl.de /* When m_command = TLM_READ_COMMAND contains a */ 44812027Sjungma@eit.uni-kl.de /* pointer where to copy the data read from the */ 44912027Sjungma@eit.uni-kl.de /* target. */ 45012027Sjungma@eit.uni-kl.de /* - m_length : Total number of bytes of the transaction. */ 45112027Sjungma@eit.uni-kl.de /* - m_response_status : This attribute indicates whether an error has */ 45212027Sjungma@eit.uni-kl.de /* occurred during the transaction. */ 45312027Sjungma@eit.uni-kl.de /* Values supported are: */ 45412027Sjungma@eit.uni-kl.de /* - TLM_OK_RESP */ 45512027Sjungma@eit.uni-kl.de /* - TLM_INCOMPLETE_RESP */ 45612027Sjungma@eit.uni-kl.de /* - TLM_GENERIC_ERROR_RESP */ 45712027Sjungma@eit.uni-kl.de /* - TLM_ADDRESS_ERROR_RESP */ 45812027Sjungma@eit.uni-kl.de /* - TLM_COMMAND_ERROR_RESP */ 45912027Sjungma@eit.uni-kl.de /* - TLM_BURST_ERROR_RESP */ 46012027Sjungma@eit.uni-kl.de /* - TLM_BYTE_ENABLE_ERROR_RESP */ 46112027Sjungma@eit.uni-kl.de /* */ 46212027Sjungma@eit.uni-kl.de /* - m_byte_enable : It can be used to create burst transfers where */ 46312027Sjungma@eit.uni-kl.de /* the address increment between each beat is greater */ 46412027Sjungma@eit.uni-kl.de /* than the word length of each beat, or to place */ 46512027Sjungma@eit.uni-kl.de /* words in selected byte lanes of a bus. */ 46612027Sjungma@eit.uni-kl.de /* - m_byte_enable_length : For a read or a write command, the target */ 46712027Sjungma@eit.uni-kl.de /* interpret the byte enable length attribute as the */ 46812027Sjungma@eit.uni-kl.de /* number of elements in the bytes enable array. */ 46912027Sjungma@eit.uni-kl.de /* - m_streaming_width : */ 47012027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 47112027Sjungma@eit.uni-kl.de 47212027Sjungma@eit.uni-kl.de sc_dt::uint64 m_address; 47312027Sjungma@eit.uni-kl.de tlm_command m_command; 47412027Sjungma@eit.uni-kl.de unsigned char* m_data; 47512027Sjungma@eit.uni-kl.de unsigned int m_length; 47612027Sjungma@eit.uni-kl.de tlm_response_status m_response_status; 47712027Sjungma@eit.uni-kl.de bool m_dmi; 47812027Sjungma@eit.uni-kl.de unsigned char* m_byte_enable; 47912027Sjungma@eit.uni-kl.de unsigned int m_byte_enable_length; 48012027Sjungma@eit.uni-kl.de unsigned int m_streaming_width; 48112027Sjungma@eit.uni-kl.de tlm_gp_option m_gp_option; 48212027Sjungma@eit.uni-kl.de 48312027Sjungma@eit.uni-kl.depublic: 48412027Sjungma@eit.uni-kl.de 48512027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 48612027Sjungma@eit.uni-kl.de /* Dynamic extension mechanism: */ 48712027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 48812027Sjungma@eit.uni-kl.de /* The extension mechanism is intended to enable initiator modules to */ 48912027Sjungma@eit.uni-kl.de /* optionally and transparently add data fields to the */ 49012027Sjungma@eit.uni-kl.de /* tlm_generic_payload. Target modules are free to check for extensions */ 49112027Sjungma@eit.uni-kl.de /* and may or may not react to the data in the extension fields. The */ 49212027Sjungma@eit.uni-kl.de /* definition of the extensions' semantics is solely in the */ 49312027Sjungma@eit.uni-kl.de /* responsibility of the user. */ 49412027Sjungma@eit.uni-kl.de /* */ 49512027Sjungma@eit.uni-kl.de /* The following rules apply: */ 49612027Sjungma@eit.uni-kl.de /* */ 49712027Sjungma@eit.uni-kl.de /* - Every extension class must be derived from tlm_extension, e.g.: */ 49812027Sjungma@eit.uni-kl.de /* class my_extension : public tlm_extension<my_extension> { ... } */ 49912027Sjungma@eit.uni-kl.de /* */ 50012027Sjungma@eit.uni-kl.de /* - A tlm_generic_payload object should be constructed after C++ */ 50112027Sjungma@eit.uni-kl.de /* static initialization time. This way it is guaranteed that the */ 50212027Sjungma@eit.uni-kl.de /* extension array is of sufficient size to hold all possible */ 50312027Sjungma@eit.uni-kl.de /* extensions. Alternatively, the initiator module can enforce a valid */ 50412027Sjungma@eit.uni-kl.de /* extension array size by calling the resize_extensions() method */ 50512027Sjungma@eit.uni-kl.de /* once before the first transaction with the payload object is */ 50612027Sjungma@eit.uni-kl.de /* initiated. */ 50712027Sjungma@eit.uni-kl.de /* */ 50812027Sjungma@eit.uni-kl.de /* - Initiators should use the the set_extension(e) or clear_extension(e)*/ 50912027Sjungma@eit.uni-kl.de /* methods for manipulating the extension array. The type of the */ 51012027Sjungma@eit.uni-kl.de /* argument must be a pointer to the specific registered extension */ 51112027Sjungma@eit.uni-kl.de /* type (my_extension in the above example) and is used to */ 51212027Sjungma@eit.uni-kl.de /* automatically locate the appropriate index in the array. */ 51312027Sjungma@eit.uni-kl.de /* */ 51412027Sjungma@eit.uni-kl.de /* - Targets can check for a specific extension by calling */ 51512027Sjungma@eit.uni-kl.de /* get_extension(e). e will point to zero if the extension is not */ 51612027Sjungma@eit.uni-kl.de /* present. */ 51712027Sjungma@eit.uni-kl.de /* */ 51812027Sjungma@eit.uni-kl.de /* --------------------------------------------------------------------- */ 51912027Sjungma@eit.uni-kl.de 52012027Sjungma@eit.uni-kl.de // Stick the pointer to an extension into the vector, return the 52112027Sjungma@eit.uni-kl.de // previous value: 52212027Sjungma@eit.uni-kl.de template <typename T> T* set_extension(T* ext) 52312027Sjungma@eit.uni-kl.de { 52412027Sjungma@eit.uni-kl.de return static_cast<T*>(set_extension(T::ID, ext)); 52512027Sjungma@eit.uni-kl.de } 52612027Sjungma@eit.uni-kl.de 52712027Sjungma@eit.uni-kl.de // non-templatized version with manual index: 52812027Sjungma@eit.uni-kl.de tlm_extension_base* set_extension(unsigned int index, 52912027Sjungma@eit.uni-kl.de tlm_extension_base* ext) 53012027Sjungma@eit.uni-kl.de { 53112027Sjungma@eit.uni-kl.de tlm_extension_base* tmp = m_extensions[index]; 53212027Sjungma@eit.uni-kl.de m_extensions[index] = ext; 53312027Sjungma@eit.uni-kl.de return tmp; 53412027Sjungma@eit.uni-kl.de } 53512027Sjungma@eit.uni-kl.de 53612027Sjungma@eit.uni-kl.de // Stick the pointer to an extension into the vector, return the 53712027Sjungma@eit.uni-kl.de // previous value and schedule its release 53812027Sjungma@eit.uni-kl.de template <typename T> T* set_auto_extension(T* ext) 53912027Sjungma@eit.uni-kl.de { 54012027Sjungma@eit.uni-kl.de return static_cast<T*>(set_auto_extension(T::ID, ext)); 54112027Sjungma@eit.uni-kl.de } 54212027Sjungma@eit.uni-kl.de 54312027Sjungma@eit.uni-kl.de // non-templatized version with manual index: 54412027Sjungma@eit.uni-kl.de tlm_extension_base* set_auto_extension(unsigned int index, 54512027Sjungma@eit.uni-kl.de tlm_extension_base* ext) 54612027Sjungma@eit.uni-kl.de { 54712027Sjungma@eit.uni-kl.de tlm_extension_base* tmp = m_extensions[index]; 54812027Sjungma@eit.uni-kl.de m_extensions[index] = ext; 54912027Sjungma@eit.uni-kl.de if (!tmp) m_extensions.insert_in_cache(&m_extensions[index]); 55012027Sjungma@eit.uni-kl.de assert(m_mm != 0); 55112027Sjungma@eit.uni-kl.de return tmp; 55212027Sjungma@eit.uni-kl.de } 55312027Sjungma@eit.uni-kl.de 55412027Sjungma@eit.uni-kl.de // Check for an extension, ext will point to 0 if not present 55512027Sjungma@eit.uni-kl.de template <typename T> void get_extension(T*& ext) const 55612027Sjungma@eit.uni-kl.de { 55712027Sjungma@eit.uni-kl.de ext = get_extension<T>(); 55812027Sjungma@eit.uni-kl.de } 55912027Sjungma@eit.uni-kl.de template <typename T> T* get_extension() const 56012027Sjungma@eit.uni-kl.de { 56112027Sjungma@eit.uni-kl.de return static_cast<T*>(get_extension(T::ID)); 56212027Sjungma@eit.uni-kl.de } 56312027Sjungma@eit.uni-kl.de // Non-templatized version with manual index: 56412027Sjungma@eit.uni-kl.de tlm_extension_base* get_extension(unsigned int index) const 56512027Sjungma@eit.uni-kl.de { 56612027Sjungma@eit.uni-kl.de return m_extensions[index]; 56712027Sjungma@eit.uni-kl.de } 56812027Sjungma@eit.uni-kl.de 56912027Sjungma@eit.uni-kl.de //this call just removes the extension from the txn but does not 57012027Sjungma@eit.uni-kl.de // call free() or tells the MM to do so 57112027Sjungma@eit.uni-kl.de // it return false if there was active MM so you are now in an unsafe situation 57212027Sjungma@eit.uni-kl.de // recommended use: when 100% sure there is no MM 57312027Sjungma@eit.uni-kl.de template <typename T> void clear_extension(const T* ext) 57412027Sjungma@eit.uni-kl.de { 57512027Sjungma@eit.uni-kl.de clear_extension<T>(); 57612027Sjungma@eit.uni-kl.de } 57712027Sjungma@eit.uni-kl.de 57812027Sjungma@eit.uni-kl.de //this call just removes the extension from the txn but does not 57912027Sjungma@eit.uni-kl.de // call free() or tells the MM to do so 58012027Sjungma@eit.uni-kl.de // it return false if there was active MM so you are now in an unsafe situation 58112027Sjungma@eit.uni-kl.de // recommended use: when 100% sure there is no MM 58212027Sjungma@eit.uni-kl.de template <typename T> void clear_extension() 58312027Sjungma@eit.uni-kl.de { 58412027Sjungma@eit.uni-kl.de clear_extension(T::ID); 58512027Sjungma@eit.uni-kl.de } 58612027Sjungma@eit.uni-kl.de 58712027Sjungma@eit.uni-kl.de //this call removes the extension from the txn and does 58812027Sjungma@eit.uni-kl.de // call free() or tells the MM to do so when the txn is finally done 58912027Sjungma@eit.uni-kl.de // recommended use: when not sure there is no MM 59012027Sjungma@eit.uni-kl.de template <typename T> void release_extension(T* ext) 59112027Sjungma@eit.uni-kl.de { 59212027Sjungma@eit.uni-kl.de release_extension<T>(); 59312027Sjungma@eit.uni-kl.de } 59412027Sjungma@eit.uni-kl.de 59512027Sjungma@eit.uni-kl.de //this call removes the extension from the txn and does 59612027Sjungma@eit.uni-kl.de // call free() or tells the MM to do so when the txn is finally done 59712027Sjungma@eit.uni-kl.de // recommended use: when not sure there is no MM 59812027Sjungma@eit.uni-kl.de template <typename T> void release_extension() 59912027Sjungma@eit.uni-kl.de { 60012027Sjungma@eit.uni-kl.de release_extension(T::ID); 60112027Sjungma@eit.uni-kl.de } 60212027Sjungma@eit.uni-kl.de 60312027Sjungma@eit.uni-kl.deprivate: 60412027Sjungma@eit.uni-kl.de // Non-templatized version with manual index 60512027Sjungma@eit.uni-kl.de void clear_extension(unsigned int index) 60612027Sjungma@eit.uni-kl.de { 60712027Sjungma@eit.uni-kl.de m_extensions[index] = static_cast<tlm_extension_base*>(0); 60812027Sjungma@eit.uni-kl.de } 60912027Sjungma@eit.uni-kl.de // Non-templatized version with manual index 61012027Sjungma@eit.uni-kl.de void release_extension(unsigned int index) 61112027Sjungma@eit.uni-kl.de { 61212027Sjungma@eit.uni-kl.de if (m_mm) 61312027Sjungma@eit.uni-kl.de { 61412027Sjungma@eit.uni-kl.de m_extensions.insert_in_cache(&m_extensions[index]); 61512027Sjungma@eit.uni-kl.de } 61612027Sjungma@eit.uni-kl.de else 61712027Sjungma@eit.uni-kl.de { 61812027Sjungma@eit.uni-kl.de m_extensions[index]->free(); 61912027Sjungma@eit.uni-kl.de m_extensions[index] = static_cast<tlm_extension_base*>(0); 62012027Sjungma@eit.uni-kl.de } 62112027Sjungma@eit.uni-kl.de } 62212027Sjungma@eit.uni-kl.de 62312027Sjungma@eit.uni-kl.depublic: 62412027Sjungma@eit.uni-kl.de // Make sure the extension array is large enough. Can be called once by 62512027Sjungma@eit.uni-kl.de // an initiator module (before issuing the first transaction) to make 62612027Sjungma@eit.uni-kl.de // sure that the extension array is of correct size. This is only needed 62712027Sjungma@eit.uni-kl.de // if the initiator cannot guarantee that the generic payload object is 62812027Sjungma@eit.uni-kl.de // allocated after C++ static construction time. 62912027Sjungma@eit.uni-kl.de void resize_extensions() 63012027Sjungma@eit.uni-kl.de { 63112027Sjungma@eit.uni-kl.de m_extensions.expand(max_num_extensions()); 63212027Sjungma@eit.uni-kl.de } 63312027Sjungma@eit.uni-kl.de 63412027Sjungma@eit.uni-kl.deprivate: 63512027Sjungma@eit.uni-kl.de tlm_array<tlm_extension_base*> m_extensions; 63612027Sjungma@eit.uni-kl.de tlm_mm_interface* m_mm; 63712027Sjungma@eit.uni-kl.de unsigned int m_ref_count; 63812027Sjungma@eit.uni-kl.de}; 63912027Sjungma@eit.uni-kl.de 64012027Sjungma@eit.uni-kl.de} // namespace tlm 64112027Sjungma@eit.uni-kl.de 64212027Sjungma@eit.uni-kl.de#endif /* __TLM_GP_H__ */ 643