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