WriteMask.hh revision 11307
16365Sgblack@eecs.umich.edu/* 26365Sgblack@eecs.umich.edu * Copyright (c) 2012-15 Advanced Micro Devices, Inc. 36365Sgblack@eecs.umich.edu * All rights reserved. 46365Sgblack@eecs.umich.edu * 56365Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 66365Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 76365Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 86365Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 96365Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 106365Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 116365Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 126365Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 136365Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146365Sgblack@eecs.umich.edu * this software without specific prior written permission. 156365Sgblack@eecs.umich.edu * 166365Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176365Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186365Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196365Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206365Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216365Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226365Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236365Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246365Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256365Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266365Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276365Sgblack@eecs.umich.edu */ 286365Sgblack@eecs.umich.edu 296365Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_COMMON_WRITEMASK_HH__ 306365Sgblack@eecs.umich.edu#define __MEM_RUBY_COMMON_WRITEMASK_HH__ 316365Sgblack@eecs.umich.edu 326365Sgblack@eecs.umich.edu#include <cassert> 336365Sgblack@eecs.umich.edu#include <iomanip> 346365Sgblack@eecs.umich.edu#include <iostream> 356365Sgblack@eecs.umich.edu#include <vector> 366365Sgblack@eecs.umich.edu 376365Sgblack@eecs.umich.edu#include "mem/ruby/common/TypeDefines.hh" 386365Sgblack@eecs.umich.edu#include "mem/ruby/system/RubySystem.hh" 396365Sgblack@eecs.umich.edu 406365Sgblack@eecs.umich.educlass WriteMask 416365Sgblack@eecs.umich.edu{ 426365Sgblack@eecs.umich.edu public: 436365Sgblack@eecs.umich.edu WriteMask() 446365Sgblack@eecs.umich.edu : mSize(RubySystem::getBlockSizeBytes()), mMask(mSize, false), 456365Sgblack@eecs.umich.edu mAtomic(false) 466365Sgblack@eecs.umich.edu {} 476365Sgblack@eecs.umich.edu 486365Sgblack@eecs.umich.edu WriteMask(int size) 496365Sgblack@eecs.umich.edu : mSize(size), mMask(size, false), mAtomic(false) 506365Sgblack@eecs.umich.edu {} 516365Sgblack@eecs.umich.edu 526365Sgblack@eecs.umich.edu WriteMask(int size, std::vector<bool> & mask) 536365Sgblack@eecs.umich.edu : mSize(size), mMask(mask), mAtomic(false) 546365Sgblack@eecs.umich.edu {} 556365Sgblack@eecs.umich.edu 566365Sgblack@eecs.umich.edu WriteMask(int size, std::vector<bool> &mask, 576365Sgblack@eecs.umich.edu std::vector<std::pair<int, AtomicOpFunctor*> > atomicOp) 586365Sgblack@eecs.umich.edu : mSize(size), mMask(mask), mAtomic(true), mAtomicOp(atomicOp) 596365Sgblack@eecs.umich.edu {} 606365Sgblack@eecs.umich.edu 616365Sgblack@eecs.umich.edu ~WriteMask() 626365Sgblack@eecs.umich.edu {} 636365Sgblack@eecs.umich.edu 646365Sgblack@eecs.umich.edu void 656365Sgblack@eecs.umich.edu clear() 666365Sgblack@eecs.umich.edu { 676365Sgblack@eecs.umich.edu mMask = std::vector<bool>(mSize, false); 686365Sgblack@eecs.umich.edu } 696365Sgblack@eecs.umich.edu 706365Sgblack@eecs.umich.edu bool 716365Sgblack@eecs.umich.edu test(int offset) 726365Sgblack@eecs.umich.edu { 736365Sgblack@eecs.umich.edu assert(offset < mSize); 746365Sgblack@eecs.umich.edu return mMask[offset] == true; 756365Sgblack@eecs.umich.edu } 766365Sgblack@eecs.umich.edu 776365Sgblack@eecs.umich.edu void 786365Sgblack@eecs.umich.edu setMask(int offset, int len) 796365Sgblack@eecs.umich.edu { 806365Sgblack@eecs.umich.edu assert(mSize >= (offset + len)); 816365Sgblack@eecs.umich.edu for (int i = 0; i < len; i++) { 826365Sgblack@eecs.umich.edu mMask[offset + i] = true; 836365Sgblack@eecs.umich.edu } 846365Sgblack@eecs.umich.edu } 856365Sgblack@eecs.umich.edu void 866365Sgblack@eecs.umich.edu fillMask() 876365Sgblack@eecs.umich.edu { 887811Ssteve.reinhardt@amd.com for (int i = 0; i < mSize; i++) { 896365Sgblack@eecs.umich.edu mMask[i] = true; 906365Sgblack@eecs.umich.edu } 91 } 92 93 bool 94 getMask(int offset, int len) const 95 { 96 bool tmp = true; 97 assert(mSize >= (offset + len)); 98 for (int i = 0; i < len; i++) { 99 tmp = tmp & mMask.at(offset + i); 100 } 101 return tmp; 102 } 103 104 bool 105 isOverlap(const WriteMask &readMask) const 106 { 107 bool tmp = false; 108 assert(mSize == readMask.mSize); 109 for (int i = 0; i < mSize; i++) { 110 if (readMask.mMask.at(i)) { 111 tmp = tmp | mMask.at(i); 112 } 113 } 114 return tmp; 115 } 116 117 bool 118 cmpMask(const WriteMask &readMask) const 119 { 120 bool tmp = true; 121 assert(mSize == readMask.mSize); 122 for (int i = 0; i < mSize; i++) { 123 if (readMask.mMask.at(i)) { 124 tmp = tmp & mMask.at(i); 125 } 126 } 127 return tmp; 128 } 129 130 bool isEmpty() const 131 { 132 for (int i = 0; i < mSize; i++) { 133 if (mMask.at(i)) { 134 return false; 135 } 136 } 137 return true; 138 } 139 140 bool 141 isFull() const 142 { 143 for (int i = 0; i < mSize; i++) { 144 if (!mMask.at(i)) { 145 return false; 146 } 147 } 148 return true; 149 } 150 151 void 152 orMask(const WriteMask & writeMask) 153 { 154 assert(mSize == writeMask.mSize); 155 for (int i = 0; i < mSize; i++) { 156 mMask[i] = (mMask.at(i)) | (writeMask.mMask.at(i)); 157 } 158 159 if (writeMask.mAtomic) { 160 mAtomic = true; 161 mAtomicOp = writeMask.mAtomicOp; 162 } 163 } 164 165 void print(std::ostream& out) const; 166 167 void 168 performAtomic(uint8_t * p) const 169 { 170 for (int i = 0; i < mAtomicOp.size(); i++) { 171 int offset = mAtomicOp[i].first; 172 AtomicOpFunctor *fnctr = mAtomicOp[i].second; 173 (*fnctr)(&p[offset]); 174 } 175 } 176 177 void 178 performAtomic(DataBlock & blk) const 179 { 180 for (int i = 0; i < mAtomicOp.size(); i++) { 181 int offset = mAtomicOp[i].first; 182 uint8_t *p = blk.getDataMod(offset); 183 AtomicOpFunctor *fnctr = mAtomicOp[i].second; 184 (*fnctr)(p); 185 } 186 } 187 private: 188 int mSize; 189 std::vector<bool> mMask; 190 bool mAtomic; 191 std::vector<std::pair<int, AtomicOpFunctor*> > mAtomicOp; 192}; 193 194inline std::ostream& 195operator<<(std::ostream& out, const WriteMask& obj) 196{ 197 obj.print(out); 198 out << std::flush; 199 return out; 200} 201 202#endif // __MEM_RUBY_COMMON_WRITEMASK_HH__ 203