timebuf.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 229 行
HH
229 行
/* * Copyright (c) 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert * Kevin T. Lim */#ifndef __BASE_TIMEBUF_HH__#define __BASE_TIMEBUF_HH__#include <cassert>#include <cstring>#include <vector>template <class T>class TimeBuffer{ protected: int past; int future; int size; char *data; std::vector<char *> index; int base; void valid(int idx) { assert (idx >= -past && idx <= future); } public: friend class wire; class wire { friend class TimeBuffer; protected: TimeBuffer<T> *buffer; int index; void set(int idx) { buffer->valid(idx); index = idx; } wire(TimeBuffer<T> *buf, int i) : buffer(buf), index(i) { } public: wire() { } wire(const wire &i) : buffer(i.buffer), index(i.index) { } const wire &operator=(const wire &i) { buffer = i.buffer; set(i.index); return *this; } const wire &operator=(int idx) { set(idx); return *this; } const wire &operator+=(int offset) { set(index + offset); return *this; } const wire &operator-=(int offset) { set(index - offset); return *this; } wire &operator++() { set(index + 1); return *this; } wire &operator++(int) { int i = index; set(index + 1); return wire(this, i); } wire &operator--() { set(index - 1); return *this; } wire &operator--(int) { int i = index; set(index - 1); return wire(this, i); } T &operator*() const { return *buffer->access(index); } T *operator->() const { return buffer->access(index); } }; public: TimeBuffer(int p, int f) : past(p), future(f), size(past + future + 1), data(new char[size * sizeof(T)]), index(size), base(0) { assert(past >= 0 && future >= 0); char *ptr = data; for (int i = 0; i < size; i++) { index[i] = ptr; std::memset(ptr, 0, sizeof(T)); new (ptr) T; ptr += sizeof(T); } } TimeBuffer() : data(NULL) { } ~TimeBuffer() { for (int i = 0; i < size; ++i) (reinterpret_cast<T *>(index[i]))->~T(); delete [] data; } void advance() { if (++base >= size) base = 0; int ptr = base + future; if (ptr >= size) ptr -= size; (reinterpret_cast<T *>(index[ptr]))->~T(); std::memset(index[ptr], 0, sizeof(T)); new (index[ptr]) T; } T *access(int idx) { //Need more complex math here to calculate index. valid(idx); int vector_index = idx + base; if (vector_index >= size) { vector_index -= size; } else if (vector_index < 0) { vector_index += size; } return reinterpret_cast<T *>(index[vector_index]); } T &operator[](int idx) { //Need more complex math here to calculate index. valid(idx); int vector_index = idx + base; if (vector_index >= size) { vector_index -= size; } else if (vector_index < 0) { vector_index += size; } return reinterpret_cast<T &>(*index[vector_index]); } wire getWire(int idx) { valid(idx); return wire(this, idx); } wire zero() { return wire(this, 0); } int getSize() { return size; }};#endif // __BASE_TIMEBUF_HH__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?