WriteMask.hh revision 11325
111307Santhony.gutierrez@amd.com/* 211307Santhony.gutierrez@amd.com * Copyright (c) 2012-15 Advanced Micro Devices, Inc. 311307Santhony.gutierrez@amd.com * All rights reserved. 411307Santhony.gutierrez@amd.com * 511307Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 611307Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 711307Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811307Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 911307Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1011307Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111307Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1211307Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1311307Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1411307Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511307Santhony.gutierrez@amd.com * 1611307Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711307Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811307Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911307Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011307Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111307Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211307Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311307Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411307Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511307Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611307Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711307Santhony.gutierrez@amd.com */ 2811307Santhony.gutierrez@amd.com 2911307Santhony.gutierrez@amd.com#ifndef __MEM_RUBY_COMMON_WRITEMASK_HH__ 3011307Santhony.gutierrez@amd.com#define __MEM_RUBY_COMMON_WRITEMASK_HH__ 3111307Santhony.gutierrez@amd.com 3211307Santhony.gutierrez@amd.com#include <cassert> 3311307Santhony.gutierrez@amd.com#include <iomanip> 3411307Santhony.gutierrez@amd.com#include <iostream> 3511307Santhony.gutierrez@amd.com#include <vector> 3611307Santhony.gutierrez@amd.com 3711307Santhony.gutierrez@amd.com#include "mem/ruby/common/TypeDefines.hh" 3811307Santhony.gutierrez@amd.com#include "mem/ruby/system/RubySystem.hh" 3911307Santhony.gutierrez@amd.com 4011307Santhony.gutierrez@amd.comclass WriteMask 4111307Santhony.gutierrez@amd.com{ 4211307Santhony.gutierrez@amd.com public: 4311307Santhony.gutierrez@amd.com WriteMask() 4411307Santhony.gutierrez@amd.com : mSize(RubySystem::getBlockSizeBytes()), mMask(mSize, false), 4511307Santhony.gutierrez@amd.com mAtomic(false) 4611307Santhony.gutierrez@amd.com {} 4711307Santhony.gutierrez@amd.com 4811307Santhony.gutierrez@amd.com WriteMask(int size) 4911307Santhony.gutierrez@amd.com : mSize(size), mMask(size, false), mAtomic(false) 5011307Santhony.gutierrez@amd.com {} 5111307Santhony.gutierrez@amd.com 5211307Santhony.gutierrez@amd.com WriteMask(int size, std::vector<bool> & mask) 5311307Santhony.gutierrez@amd.com : mSize(size), mMask(mask), mAtomic(false) 5411307Santhony.gutierrez@amd.com {} 5511307Santhony.gutierrez@amd.com 5611307Santhony.gutierrez@amd.com WriteMask(int size, std::vector<bool> &mask, 5711307Santhony.gutierrez@amd.com std::vector<std::pair<int, AtomicOpFunctor*> > atomicOp) 5811307Santhony.gutierrez@amd.com : mSize(size), mMask(mask), mAtomic(true), mAtomicOp(atomicOp) 5911307Santhony.gutierrez@amd.com {} 6011307Santhony.gutierrez@amd.com 6111307Santhony.gutierrez@amd.com ~WriteMask() 6211307Santhony.gutierrez@amd.com {} 6311307Santhony.gutierrez@amd.com 6411307Santhony.gutierrez@amd.com void 6511307Santhony.gutierrez@amd.com clear() 6611307Santhony.gutierrez@amd.com { 6711307Santhony.gutierrez@amd.com mMask = std::vector<bool>(mSize, false); 6811307Santhony.gutierrez@amd.com } 6911307Santhony.gutierrez@amd.com 7011307Santhony.gutierrez@amd.com bool 7111307Santhony.gutierrez@amd.com test(int offset) 7211307Santhony.gutierrez@amd.com { 7311307Santhony.gutierrez@amd.com assert(offset < mSize); 7411325Ssteve.reinhardt@amd.com return mMask[offset]; 7511307Santhony.gutierrez@amd.com } 7611307Santhony.gutierrez@amd.com 7711307Santhony.gutierrez@amd.com void 7811307Santhony.gutierrez@amd.com setMask(int offset, int len) 7911307Santhony.gutierrez@amd.com { 8011307Santhony.gutierrez@amd.com assert(mSize >= (offset + len)); 8111307Santhony.gutierrez@amd.com for (int i = 0; i < len; i++) { 8211307Santhony.gutierrez@amd.com mMask[offset + i] = true; 8311307Santhony.gutierrez@amd.com } 8411307Santhony.gutierrez@amd.com } 8511307Santhony.gutierrez@amd.com void 8611307Santhony.gutierrez@amd.com fillMask() 8711307Santhony.gutierrez@amd.com { 8811307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 8911307Santhony.gutierrez@amd.com mMask[i] = true; 9011307Santhony.gutierrez@amd.com } 9111307Santhony.gutierrez@amd.com } 9211307Santhony.gutierrez@amd.com 9311307Santhony.gutierrez@amd.com bool 9411307Santhony.gutierrez@amd.com getMask(int offset, int len) const 9511307Santhony.gutierrez@amd.com { 9611307Santhony.gutierrez@amd.com bool tmp = true; 9711307Santhony.gutierrez@amd.com assert(mSize >= (offset + len)); 9811307Santhony.gutierrez@amd.com for (int i = 0; i < len; i++) { 9911307Santhony.gutierrez@amd.com tmp = tmp & mMask.at(offset + i); 10011307Santhony.gutierrez@amd.com } 10111307Santhony.gutierrez@amd.com return tmp; 10211307Santhony.gutierrez@amd.com } 10311307Santhony.gutierrez@amd.com 10411307Santhony.gutierrez@amd.com bool 10511307Santhony.gutierrez@amd.com isOverlap(const WriteMask &readMask) const 10611307Santhony.gutierrez@amd.com { 10711307Santhony.gutierrez@amd.com bool tmp = false; 10811307Santhony.gutierrez@amd.com assert(mSize == readMask.mSize); 10911307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 11011307Santhony.gutierrez@amd.com if (readMask.mMask.at(i)) { 11111307Santhony.gutierrez@amd.com tmp = tmp | mMask.at(i); 11211307Santhony.gutierrez@amd.com } 11311307Santhony.gutierrez@amd.com } 11411307Santhony.gutierrez@amd.com return tmp; 11511307Santhony.gutierrez@amd.com } 11611307Santhony.gutierrez@amd.com 11711307Santhony.gutierrez@amd.com bool 11811307Santhony.gutierrez@amd.com cmpMask(const WriteMask &readMask) const 11911307Santhony.gutierrez@amd.com { 12011307Santhony.gutierrez@amd.com bool tmp = true; 12111307Santhony.gutierrez@amd.com assert(mSize == readMask.mSize); 12211307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 12311307Santhony.gutierrez@amd.com if (readMask.mMask.at(i)) { 12411307Santhony.gutierrez@amd.com tmp = tmp & mMask.at(i); 12511307Santhony.gutierrez@amd.com } 12611307Santhony.gutierrez@amd.com } 12711307Santhony.gutierrez@amd.com return tmp; 12811307Santhony.gutierrez@amd.com } 12911307Santhony.gutierrez@amd.com 13011307Santhony.gutierrez@amd.com bool isEmpty() const 13111307Santhony.gutierrez@amd.com { 13211307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 13311307Santhony.gutierrez@amd.com if (mMask.at(i)) { 13411307Santhony.gutierrez@amd.com return false; 13511307Santhony.gutierrez@amd.com } 13611307Santhony.gutierrez@amd.com } 13711307Santhony.gutierrez@amd.com return true; 13811307Santhony.gutierrez@amd.com } 13911307Santhony.gutierrez@amd.com 14011307Santhony.gutierrez@amd.com bool 14111307Santhony.gutierrez@amd.com isFull() const 14211307Santhony.gutierrez@amd.com { 14311307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 14411307Santhony.gutierrez@amd.com if (!mMask.at(i)) { 14511307Santhony.gutierrez@amd.com return false; 14611307Santhony.gutierrez@amd.com } 14711307Santhony.gutierrez@amd.com } 14811307Santhony.gutierrez@amd.com return true; 14911307Santhony.gutierrez@amd.com } 15011307Santhony.gutierrez@amd.com 15111307Santhony.gutierrez@amd.com void 15211307Santhony.gutierrez@amd.com orMask(const WriteMask & writeMask) 15311307Santhony.gutierrez@amd.com { 15411307Santhony.gutierrez@amd.com assert(mSize == writeMask.mSize); 15511307Santhony.gutierrez@amd.com for (int i = 0; i < mSize; i++) { 15611307Santhony.gutierrez@amd.com mMask[i] = (mMask.at(i)) | (writeMask.mMask.at(i)); 15711307Santhony.gutierrez@amd.com } 15811307Santhony.gutierrez@amd.com 15911307Santhony.gutierrez@amd.com if (writeMask.mAtomic) { 16011307Santhony.gutierrez@amd.com mAtomic = true; 16111307Santhony.gutierrez@amd.com mAtomicOp = writeMask.mAtomicOp; 16211307Santhony.gutierrez@amd.com } 16311307Santhony.gutierrez@amd.com } 16411307Santhony.gutierrez@amd.com 16511307Santhony.gutierrez@amd.com void print(std::ostream& out) const; 16611307Santhony.gutierrez@amd.com 16711307Santhony.gutierrez@amd.com void 16811307Santhony.gutierrez@amd.com performAtomic(uint8_t * p) const 16911307Santhony.gutierrez@amd.com { 17011307Santhony.gutierrez@amd.com for (int i = 0; i < mAtomicOp.size(); i++) { 17111307Santhony.gutierrez@amd.com int offset = mAtomicOp[i].first; 17211307Santhony.gutierrez@amd.com AtomicOpFunctor *fnctr = mAtomicOp[i].second; 17311307Santhony.gutierrez@amd.com (*fnctr)(&p[offset]); 17411307Santhony.gutierrez@amd.com } 17511307Santhony.gutierrez@amd.com } 17611307Santhony.gutierrez@amd.com 17711307Santhony.gutierrez@amd.com void 17811307Santhony.gutierrez@amd.com performAtomic(DataBlock & blk) const 17911307Santhony.gutierrez@amd.com { 18011307Santhony.gutierrez@amd.com for (int i = 0; i < mAtomicOp.size(); i++) { 18111307Santhony.gutierrez@amd.com int offset = mAtomicOp[i].first; 18211307Santhony.gutierrez@amd.com uint8_t *p = blk.getDataMod(offset); 18311307Santhony.gutierrez@amd.com AtomicOpFunctor *fnctr = mAtomicOp[i].second; 18411307Santhony.gutierrez@amd.com (*fnctr)(p); 18511307Santhony.gutierrez@amd.com } 18611307Santhony.gutierrez@amd.com } 18711307Santhony.gutierrez@amd.com private: 18811307Santhony.gutierrez@amd.com int mSize; 18911307Santhony.gutierrez@amd.com std::vector<bool> mMask; 19011307Santhony.gutierrez@amd.com bool mAtomic; 19111307Santhony.gutierrez@amd.com std::vector<std::pair<int, AtomicOpFunctor*> > mAtomicOp; 19211307Santhony.gutierrez@amd.com}; 19311307Santhony.gutierrez@amd.com 19411307Santhony.gutierrez@amd.cominline std::ostream& 19511307Santhony.gutierrez@amd.comoperator<<(std::ostream& out, const WriteMask& obj) 19611307Santhony.gutierrez@amd.com{ 19711307Santhony.gutierrez@amd.com obj.print(out); 19811307Santhony.gutierrez@amd.com out << std::flush; 19911307Santhony.gutierrez@amd.com return out; 20011307Santhony.gutierrez@amd.com} 20111307Santhony.gutierrez@amd.com 20211307Santhony.gutierrez@amd.com#endif // __MEM_RUBY_COMMON_WRITEMASK_HH__ 203