| /***************************************************************************** |
| |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or |
| more contributor license agreements. See the NOTICE file distributed |
| with this work for additional information regarding copyright ownership. |
| Accellera licenses this file to you under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with the |
| License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| implied. See the License for the specific language governing |
| permissions and limitations under the License. |
| |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| |
| sc_temporary.h -- Temporary value pool classes. |
| |
| Original Author: Andy Goodrich, Forte Design Systems, Inc. |
| |
| CHANGE LOG AT END OF FILE |
| *****************************************************************************/ |
| |
| #ifndef __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__ |
| #define __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__ |
| |
| #include <cstddef> // std::size_t |
| |
| namespace sc_core |
| { |
| |
| //----------------------------------------------------------------------------- |
| // sc_byte_heap - CLASS MANAGING A TEMPORARY HEAP OF BYTES |
| // |
| // This facility implements a heap of temporary byte allocations. Once an |
| // request has been allocated it is not freed. However the entire heap |
| // wraps and the storage is reused. This means that no allocations should |
| // be assumed as permanent. Allocations are double-word aligned. This is |
| // raw storage, so objects which contain virtual methods cannot be allocated |
| // with this object. See the sc_vpool object for that type of storage |
| // allocation. |
| // |
| // char* allocate( int size ) |
| // This method returns a pointer to block of size bytes. The block |
| // returned is the next available one in the heap. If the current heap |
| // cannot fullfil the request it will be rewound and storage allocated from |
| // its start. All allocations start on an 8-byte boundary. |
| // size = number of bytes to be allocated. |
| // |
| // void initialize( int heap_size=0x100000 ) |
| // This method allocates the storage to be managed. If there is already |
| // a block of storage under management it is freed. If no argument is |
| // provided for the heap size, a megabyte will be allocated. |
| // heap_size = number of bytes to allocate for the heap. |
| // |
| // unsigned int length() |
| // This method returns the size of this object's heap in bytes. |
| // |
| // sc_byte_heap() |
| // This is the non-initialized object instance constructor. It does not |
| // allocate the heap storage, that is done by the initialize() method. |
| // |
| // sc_byte_heap(int) |
| // This is the initializing object instance constructor. It does allocates |
| // a heap of the specified number of bytes. |
| // heap_size = number of bytes to allocate for the heap. |
| //----------------------------------------------------------------------------- |
| class sc_byte_heap |
| { |
| public: |
| char *m_bgn_p; // Beginning of heap storage. |
| char *m_end_p; // End of heap storage. |
| char *m_next_p; // Next heap location to be allocated. |
| |
| inline char * |
| allocate(std::size_t bytes_n) |
| { |
| char *result_p; |
| bytes_n = (bytes_n + 7) & ((std::size_t)(-8)); |
| result_p = m_next_p; |
| m_next_p += bytes_n; |
| if (m_next_p >= m_end_p) { |
| result_p = m_bgn_p; |
| m_next_p = m_bgn_p + bytes_n; |
| } |
| return result_p; |
| } |
| |
| inline void |
| initialize(std::size_t heap_size=0x100000) |
| { |
| delete [] m_bgn_p; |
| m_bgn_p = new char[heap_size]; |
| m_end_p = &m_bgn_p[heap_size]; |
| m_next_p = m_bgn_p; |
| } |
| |
| inline std::size_t |
| length() |
| { |
| return (std::size_t)(m_end_p - m_bgn_p); |
| } |
| |
| inline sc_byte_heap() : m_bgn_p(0), m_end_p(0), m_next_p(0) {} |
| |
| inline sc_byte_heap(std::size_t heap_size) : |
| m_bgn_p(0), m_end_p(0), m_next_p(0) |
| { |
| initialize(heap_size); |
| } |
| |
| inline ~sc_byte_heap() { delete [] m_bgn_p; } |
| }; |
| |
| |
| //----------------------------------------------------------------------------- |
| // sc_vpool<T> - CLASS MANAGING A TEMPORARY VECTOR OF CLASS T INSTANCES |
| // |
| // This class implements a fixed pool of objects contained in a vector. These |
| // objects are allocated via the allocate() method. An index, m_pool_i, |
| // indicates the next object to be allocated. The vector is a power of 2 in |
| // size, and this fact is used to wrap the list when m_pool_i reaches the |
| // end of the vector. |
| // |
| // sc_vpool( int log2, T* pool_p=0 ) |
| // This is the object instance constructor for this class. It configures |
| // the object to manage a vector of 2**log2 entries. If a vector is |
| // not supplied one will be allocated. |
| // log2 = the log base two of the size of the vector. |
| // pool_p -> vector of 2**log2 entries to be managed or 0. |
| // |
| // ~sc_vpool() |
| // This is the object instance destructor for this class. It frees the |
| // block of storage which was being managed. |
| // |
| // T* allocate() |
| // This method returns the address of the next entry in the vector, m_pool_p, |
| // pointed to by the index, m_pool_i, and updates that index. The index |
| // update consists of adding 1 to m_pool_i and masking it by m_wrap. |
| // |
| // void reset() |
| // This method resets the allocation index, m_pool_i, to point to the start |
| // of the vector of objects under management. This call is not usually made |
| // since there are a fixed number of entries and the index wraps. However, |
| // for diagnostics tests it is convenient to be able to reset to the start |
| // of the vector. |
| // |
| // int size() |
| // This method returns the number of object instances contained in the |
| // vector being managed by this object instance. |
| //----------------------------------------------------------------------------- |
| template<class T> |
| class sc_vpool |
| { |
| protected: |
| std::size_t m_pool_i; // Index of next entry to m_pool_m to provide. |
| T *m_pool_p; // Vector of temporaries. |
| std::size_t m_wrap; // Mask to wrap vector index. |
| |
| public: |
| inline sc_vpool(int log2, T *pool_p=0); |
| inline ~sc_vpool(); |
| inline T *allocate(); |
| inline void reset(); |
| inline std::size_t size(); |
| }; |
| |
| template<class T> |
| sc_vpool<T>::sc_vpool(int log2, T *pool_p) : m_pool_i(0), |
| m_pool_p(pool_p ? pool_p : new T[static_cast<std::size_t>(1) << log2]), |
| m_wrap(~(static_cast<std::size_t>(-1) << log2)) |
| { |
| // if (log2 > 32) SC_REPORT_ERROR(SC_ID_POOL_SIZE_, ""); |
| } |
| |
| template<class T> |
| sc_vpool<T>::~sc_vpool() |
| { |
| // delete [] m_pool_p; |
| } |
| |
| template<class T> |
| T *sc_vpool<T>::allocate() |
| { |
| T *result_p; // Entry to return. |
| |
| result_p = &m_pool_p[m_pool_i]; |
| m_pool_i = (m_pool_i + 1) & m_wrap; |
| return result_p; |
| } |
| |
| template<class T> |
| void sc_vpool<T>::reset() |
| { |
| m_pool_i = 0; |
| } |
| |
| template<class T> |
| std::size_t sc_vpool<T>::size() { return m_wrap + 1; } |
| |
| } // namespace sc_core |
| |
| // $Log: sc_temporary.h,v $ |
| // Revision 1.4 2011/08/26 20:46:19 acg |
| // Andy Goodrich: moved the modification log to the end of the file to |
| // eliminate source line number skew when check-ins are done. |
| // |
| // Revision 1.3 2011/08/24 22:05:56 acg |
| // Torsten Maehne: initialization changes to remove warnings. |
| // |
| // Revision 1.2 2011/02/18 20:38:44 acg |
| // Andy Goodrich: Updated Copyright notice. |
| // |
| // Revision 1.1.1.1 2006/12/15 20:20:06 acg |
| // SystemC 2.3 |
| // |
| // Revision 1.3 2006/01/13 18:53:11 acg |
| // Andy Goodrich: Added $Log command so that CVS comments are reproduced in |
| // the source. |
| // |
| |
| #endif // __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__ |