NetDest.cc revision 6372:f1a41ea3bbab
1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30/* 31 * NetDest.C 32 * 33 * Description: See NetDest.hh 34 * 35 * $Id$ 36 * 37 */ 38 39#include "mem/ruby/common/NetDest.hh" 40#include "mem/protocol/Protocol.hh" 41 42NetDest::NetDest() 43{ 44 setSize(); 45} 46 47void NetDest::add(MachineID newElement) 48{ 49 m_bits[vecIndex(newElement)].add(bitIndex(newElement.num)); 50} 51 52void NetDest::addNetDest(const NetDest& netDest) 53{ 54 assert(m_bits.size() == netDest.getSize()); 55 for (int i = 0; i < m_bits.size(); i++) { 56 m_bits[i].addSet(netDest.m_bits[i]); 57 } 58} 59 60void NetDest::addRandom() 61{ 62 int i = random()%m_bits.size(); 63 m_bits[i].addRandom(); 64} 65 66void NetDest::setNetDest(MachineType machine, const Set& set) 67{ 68 // assure that there is only one set of destinations for this machine 69 assert(MachineType_base_level((MachineType)(machine+1)) - MachineType_base_level(machine) == 1); 70 m_bits[MachineType_base_level(machine)] = set; 71} 72 73void NetDest::remove(MachineID oldElement) 74{ 75 m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num)); 76} 77 78void NetDest::removeNetDest(const NetDest& netDest) 79{ 80 assert(m_bits.size() == netDest.getSize()); 81 for (int i = 0; i < m_bits.size(); i++) { 82 m_bits[i].removeSet(netDest.m_bits[i]); 83 84 } 85} 86 87void NetDest::clear() 88{ 89 for (int i = 0; i < m_bits.size(); i++) { 90 m_bits[i].clear(); 91 } 92} 93 94void NetDest::broadcast() 95{ 96 for (MachineType machine = MachineType_FIRST; machine < MachineType_NUM; ++machine) { 97 broadcast(machine); 98 } 99} 100 101void NetDest::broadcast(MachineType machineType) { 102 103 for (int i = 0; i < MachineType_base_count(machineType); i++) { 104 MachineID mach = {machineType, i}; 105 add(mach); 106 } 107} 108 109//For Princeton Network 110Vector<NodeID> NetDest::getAllDest() { 111 Vector<NodeID> dest; 112 dest.clear(); 113 for (int i=0; i<m_bits.size(); i++) { 114 for (int j=0; j<m_bits[i].getSize(); j++) { 115 if (m_bits[i].isElement(j)) { 116 dest.insertAtBottom((NodeID) (MachineType_base_number((MachineType) i) + j)); 117 } 118 } 119 } 120 return dest; 121} 122 123int NetDest::count() const 124{ 125 int counter = 0; 126 for (int i=0; i<m_bits.size(); i++) { 127 counter += m_bits[i].count(); 128 } 129 return counter; 130} 131 132NodeID NetDest::elementAt(MachineID index) { 133 return m_bits[vecIndex(index)].elementAt(bitIndex(index.num)); 134} 135 136NodeID NetDest::smallestElement() const 137{ 138 assert(count() > 0); 139 for (int i=0; i<m_bits.size(); i++) { 140 for (int j=0; j<m_bits[i].getSize(); j++) { 141 if (m_bits[i].isElement(j)) { 142 return j; 143 } 144 } 145 } 146 ERROR_MSG("No smallest element of an empty set."); 147} 148 149MachineID NetDest::smallestElement(MachineType machine) const 150{ 151 for (int j = 0; j < m_bits[MachineType_base_level(machine)].getSize(); j++) { 152 if (m_bits[MachineType_base_level(machine)].isElement(j)) { 153 MachineID mach = {machine, j}; 154 return mach; 155 } 156 } 157 158 ERROR_MSG("No smallest element of given MachineType."); 159} 160 161 162// Returns true iff all bits are set 163bool NetDest::isBroadcast() const 164{ 165 for (int i=0; i<m_bits.size(); i++) { 166 if (!m_bits[i].isBroadcast()) { 167 return false; 168 } 169 } 170 return true; 171} 172 173// Returns true iff no bits are set 174bool NetDest::isEmpty() const 175{ 176 for (int i=0; i<m_bits.size(); i++) { 177 if (!m_bits[i].isEmpty()) { 178 return false; 179 } 180 } 181 return true; 182} 183 184// returns the logical OR of "this" set and orNetDest 185NetDest NetDest::OR(const NetDest& orNetDest) const 186{ 187 assert(m_bits.size() == orNetDest.getSize()); 188 NetDest result; 189 for (int i=0; i<m_bits.size(); i++) { 190 result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]); 191 } 192 return result; 193} 194 195 196// returns the logical AND of "this" set and andNetDest 197NetDest NetDest::AND(const NetDest& andNetDest) const 198{ 199 assert(m_bits.size() == andNetDest.getSize()); 200 NetDest result; 201 for (int i=0; i<m_bits.size(); i++) { 202 result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]); 203 } 204 return result; 205} 206 207// Returns true if the intersection of the two sets is non-empty 208bool NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const 209{ 210 assert(m_bits.size() == other_netDest.getSize()); 211 for (int i=0; i<m_bits.size(); i++) { 212 if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) { 213 return true; 214 } 215 } 216 return false; 217} 218 219bool NetDest::isSuperset(const NetDest& test) const 220{ 221 assert(m_bits.size() == test.getSize()); 222 223 for (int i=0; i<m_bits.size(); i++) { 224 if (!m_bits[i].isSuperset(test.m_bits[i])) { 225 return false; 226 } 227 } 228 return true; 229} 230 231bool NetDest::isElement(MachineID element) const 232{ 233 return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num)); 234} 235 236void NetDest::setSize() 237{ 238 m_bits.setSize(MachineType_base_level(MachineType_NUM)); 239 assert(m_bits.size() == MachineType_NUM); 240 241 for (int i = 0; i < m_bits.size(); i++) { 242 m_bits[i].setSize(MachineType_base_count((MachineType)i)); 243 } 244} 245 246void NetDest::print(ostream& out) const 247{ 248 out << "[NetDest (" << m_bits.size() << ") "; 249 250 for (int i=0; i<m_bits.size(); i++) { 251 for (int j=0; j<m_bits[i].getSize(); j++) { 252 out << (bool) m_bits[i].isElement(j) << " "; 253 } 254 out << " - "; 255 } 256 out << "]"; 257} 258 259