summaryrefslogtreecommitdiff
path: root/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h')
-rw-r--r--src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h255
1 files changed, 0 insertions, 255 deletions
diff --git a/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h b/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h
deleted file mode 100644
index c00fe4881..000000000
--- a/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/*****************************************************************************
-
- 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.
-
- *****************************************************************************/
-
-#ifndef \
- __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__
-#define \
- __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__
-
-#include <iostream>
-
-namespace tlm
-{
-
-template <typename T>
-class circular_buffer
-{
- public:
- explicit circular_buffer(int size=0);
- ~circular_buffer();
-
- void resize(int size);
- void clear();
-
- T read();
- void write(const T &);
-
- bool is_empty() const { return used() == 0; }
- bool is_full() const { return free() == 0; }
-
- int size() const { return m_size; }
- int used() const { return m_used; }
- int free() const { return m_free; }
-
- const T &read_data() const { return buf_read(m_buf, m_ri); }
- const T &
- peek_data(int i) const
- {
- return buf_read(m_buf, (m_ri + i) % size());
- }
-
- T &
- poke_data(int i)
- {
- return buf_read(m_buf, (m_wi + i) % size());
- }
-
- void debug() const;
-
- private:
- void increment_write_pos(int i=1);
- void increment_read_pos(int i=1);
-
- void init();
-
- // Disabled.
- circular_buffer(const circular_buffer<T> &b);
- circular_buffer<T> &operator = (const circular_buffer<T> &);
-
- void *buf_alloc(int size);
- void buf_free(void *&buf);
- void buf_write(void *buf, int n, const T &t);
- T &buf_read(void *buf, int n) const;
- void buf_clear(void *buf, int n);
-
- private:
- int m_size; // size of the buffer
- void *m_buf; // the buffer
- int m_free; // number of free spaces
- int m_used; // number of used spaces
- int m_ri; // index of next read
- int m_wi; // index of next write
-};
-
-template <typename T>
-void
-circular_buffer<T>::debug() const
-{
- std::cout << "Buffer debug" << std::endl;
- std::cout << "Size : " << size() << std::endl;
- std::cout << "Free/Used " << free() << "/" << used() << std::endl;
- std::cout << "Indices : r/w = " << m_ri << "/" << m_wi << std::endl;
-
- if (is_empty()) {
- std::cout << "empty" << std::endl;
- }
-
- if (is_full()) {
- std::cout << "full" << std::endl;
- }
-
- std::cout << "Data : " << std::endl;
- for (int i = 0; i < used(); i++) {
- std::cout << peek_data( i ) << std::endl;
- }
-}
-
-template <typename T>
-circular_buffer<T>::circular_buffer(int size) : m_size(size), m_buf(0)
-{
- init();
-}
-
-template <typename T>
-void
-circular_buffer<T>::clear()
-{
- for (int i = 0; i < used(); i++) {
- buf_clear(m_buf, (m_ri + i) % m_size);
- }
- m_free = m_size;
- m_used = m_ri = m_wi = 0;
-}
-
-template <typename T>
-circular_buffer<T>::~circular_buffer()
-{
- clear();
- buf_free(m_buf);
-}
-
-template <typename T>
-void
-circular_buffer<T>::resize(int size)
-{
- int i;
- void *new_buf = buf_alloc(size);
-
- for (i = 0; i < size && i < used(); i++) {
- buf_write(new_buf, i, peek_data(i));
- buf_clear(m_buf, (m_ri + i) % m_size);
- }
-
- buf_free(m_buf);
-
- m_size = size;
- m_ri = 0;
- m_wi = i % m_size;
- m_used = i;
- m_free = m_size - m_used;
-
- m_buf = new_buf;
-}
-
-
-template <typename T>
-void
-circular_buffer<T>::init()
-{
- if (m_size > 0) {
- m_buf = buf_alloc(m_size);
- }
-
- m_free = m_size;
- m_used = 0;
- m_ri = 0;
- m_wi = 0;
-}
-
-template <typename T>
-T
-circular_buffer<T>::read()
-{
- T t = read_data();
-
- buf_clear(m_buf, m_ri);
- increment_read_pos();
-
- return t;
-}
-
-template <typename T>
-void
-circular_buffer<T>::write(const T &t)
-{
- buf_write(m_buf, m_wi, t);
- increment_write_pos();
-}
-
-template <typename T>
-void
-circular_buffer<T>::increment_write_pos(int i)
-{
- m_wi = (m_wi + i) % m_size;
- m_used += i;
- m_free -= i;
-}
-
-template <typename T>
-void
-circular_buffer<T>::increment_read_pos(int i)
-{
- m_ri = (m_ri + i) % m_size;
- m_used -= i;
- m_free += i;
-}
-
-template <typename T>
-inline void *
-circular_buffer<T>::buf_alloc(int size)
-{
- return new unsigned char [size * sizeof(T)];
-}
-
-template <typename T>
-inline void
-circular_buffer<T>::buf_free(void *&buf)
-{
- delete [] static_cast<unsigned char *>(buf);
- buf = nullptr;
-}
-
-template <typename T>
-inline void
-circular_buffer<T>::buf_write(void *buf, int n, const T &t)
-{
- T *p = static_cast<T *>(buf) + n;
- new (p)T(t);
-}
-
-template <typename T>
-inline T &
-circular_buffer<T>::buf_read(void *buf, int n) const
-{
- T *p = static_cast<T *>(buf) + n;
- return *p;
-}
-
-template <typename T>
-inline void
-circular_buffer<T>::buf_clear(void *buf, int n)
-{
- T *p = static_cast<T *>(buf) + n;
- p->~T();
-}
-
-} // namespace tlm
-
-#endif
-/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__ */