NetDest.cc (6797:7bf0a839c237) | NetDest.cc (7039:bc0b6ea676b5) |
---|---|
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; --- 12 unchanged lines hidden (view full) --- 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 | 1/* 2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 12 unchanged lines hidden (view full) --- 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 |
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 | 29#include "mem/ruby/common/NetDest.hh" 30#include "mem/protocol/Protocol.hh" 31 32NetDest::NetDest() 33{ 34 setSize(); 35} 36 |
47void NetDest::add(MachineID newElement) | 37void 38NetDest::add(MachineID newElement) |
48{ | 39{ |
49 m_bits[vecIndex(newElement)].add(bitIndex(newElement.num)); | 40 m_bits[vecIndex(newElement)].add(bitIndex(newElement.num)); |
50} 51 | 41} 42 |
52void NetDest::addNetDest(const NetDest& netDest) | 43void 44NetDest::addNetDest(const NetDest& netDest) |
53{ | 45{ |
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 } | 46 assert(m_bits.size() == netDest.getSize()); 47 for (int i = 0; i < m_bits.size(); i++) { 48 m_bits[i].addSet(netDest.m_bits[i]); 49 } |
58} 59 | 50} 51 |
60void NetDest::addRandom() | 52void 53NetDest::addRandom() |
61{ | 54{ |
62 int i = random()%m_bits.size(); 63 m_bits[i].addRandom(); | 55 int i = random()%m_bits.size(); 56 m_bits[i].addRandom(); |
64} 65 | 57} 58 |
66void NetDest::setNetDest(MachineType machine, const Set& set) | 59void 60NetDest::setNetDest(MachineType machine, const Set& set) |
67{ | 61{ |
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; | 62 // assure that there is only one set of destinations for this machine 63 assert(MachineType_base_level((MachineType)(machine + 1)) - 64 MachineType_base_level(machine) == 1); 65 m_bits[MachineType_base_level(machine)] = set; |
71} 72 | 66} 67 |
73void NetDest::remove(MachineID oldElement) | 68void 69NetDest::remove(MachineID oldElement) |
74{ | 70{ |
75 m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num)); | 71 m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num)); |
76} 77 | 72} 73 |
78void NetDest::removeNetDest(const NetDest& netDest) | 74void 75NetDest::removeNetDest(const NetDest& netDest) |
79{ | 76{ |
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 } | 77 assert(m_bits.size() == netDest.getSize()); 78 for (int i = 0; i < m_bits.size(); i++) { 79 m_bits[i].removeSet(netDest.m_bits[i]); 80 } |
85} 86 | 81} 82 |
87void NetDest::clear() | 83void 84NetDest::clear() |
88{ | 85{ |
89 for (int i = 0; i < m_bits.size(); i++) { 90 m_bits[i].clear(); 91 } | 86 for (int i = 0; i < m_bits.size(); i++) { 87 m_bits[i].clear(); 88 } |
92} 93 | 89} 90 |
94void NetDest::broadcast() | 91void 92NetDest::broadcast() |
95{ | 93{ |
96 for (MachineType machine = MachineType_FIRST; machine < MachineType_NUM; ++machine) { 97 broadcast(machine); 98 } | 94 for (MachineType machine = MachineType_FIRST; 95 machine < MachineType_NUM; ++machine) { 96 broadcast(machine); 97 } |
99} 100 | 98} 99 |
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 } | 100void 101NetDest::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 | 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 } | 110Vector 111NetDest::getAllDest() 112{ 113 Vector<NodeID> dest; 114 dest.clear(); 115 for (int i = 0; i < m_bits.size(); i++) { 116 for (int j = 0; j < m_bits[i].getSize(); j++) { 117 if (m_bits[i].isElement(j)) { 118 int id = MachineType_base_number((MachineType)i) + j; 119 dest.insertAtBottom((NodeID)id); 120 } |
119 } | 121 } |
120 return dest; | 122 } 123 return dest; |
121} 122 | 124} 125 |
123int NetDest::count() const | 126int 127NetDest::count() const |
124{ | 128{ |
125 int counter = 0; 126 for (int i=0; i<m_bits.size(); i++) { 127 counter += m_bits[i].count(); 128 } 129 return counter; | 129 int counter = 0; 130 for (int i = 0; i < m_bits.size(); i++) { 131 counter += m_bits[i].count(); 132 } 133 return counter; |
130} 131 | 134} 135 |
132NodeID NetDest::elementAt(MachineID index) { 133 return m_bits[vecIndex(index)].elementAt(bitIndex(index.num)); | 136NodeID 137NetDest::elementAt(MachineID index) 138{ 139 return m_bits[vecIndex(index)].elementAt(bitIndex(index.num)); |
134} 135 | 140} 141 |
136MachineID NetDest::smallestElement() const | 142MachineID 143NetDest::smallestElement() const |
137{ | 144{ |
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 MachineID mach = {MachineType_from_base_level(i), j}; 143 return mach; 144 } | 145 assert(count() > 0); 146 for (int i = 0; i < m_bits.size(); i++) { 147 for (int j = 0; j < m_bits[i].getSize(); j++) { 148 if (m_bits[i].isElement(j)) { 149 MachineID mach = {MachineType_from_base_level(i), j}; 150 return mach; 151 } 152 } |
145 } | 153 } |
146 } 147 ERROR_MSG("No smallest element of an empty set."); | 154 ERROR_MSG("No smallest element of an empty set."); |
148} 149 | 155} 156 |
150MachineID NetDest::smallestElement(MachineType machine) const | 157MachineID 158NetDest::smallestElement(MachineType machine) const |
151{ | 159{ |
152 for (int j = 0; j < m_bits[MachineType_base_level(machine)].getSize(); j++) { 153 if (m_bits[MachineType_base_level(machine)].isElement(j)) { 154 MachineID mach = {machine, j}; 155 return mach; | 160 int size = m_bits[MachineType_base_level(machine)].getSize(); 161 for (int j = 0; j < size; j++) { 162 if (m_bits[MachineType_base_level(machine)].isElement(j)) { 163 MachineID mach = {machine, j}; 164 return mach; 165 } |
156 } | 166 } |
157 } | |
158 | 167 |
159 ERROR_MSG("No smallest element of given MachineType."); | 168 ERROR_MSG("No smallest element of given MachineType."); |
160} 161 | 169} 170 |
162 | |
163// Returns true iff all bits are set | 171// Returns true iff all bits are set |
164bool NetDest::isBroadcast() const | 172bool 173NetDest::isBroadcast() const |
165{ | 174{ |
166 for (int i=0; i<m_bits.size(); i++) { 167 if (!m_bits[i].isBroadcast()) { 168 return false; | 175 for (int i = 0; i < m_bits.size(); i++) { 176 if (!m_bits[i].isBroadcast()) { 177 return false; 178 } |
169 } | 179 } |
170 } 171 return true; | 180 return true; |
172} 173 174// Returns true iff no bits are set | 181} 182 183// Returns true iff no bits are set |
175bool NetDest::isEmpty() const | 184bool 185NetDest::isEmpty() const |
176{ | 186{ |
177 for (int i=0; i<m_bits.size(); i++) { 178 if (!m_bits[i].isEmpty()) { 179 return false; | 187 for (int i = 0; i < m_bits.size(); i++) { 188 if (!m_bits[i].isEmpty()) { 189 return false; 190 } |
180 } | 191 } |
181 } 182 return true; | 192 return true; |
183} 184 185// returns the logical OR of "this" set and orNetDest | 193} 194 195// returns the logical OR of "this" set and orNetDest |
186NetDest NetDest::OR(const NetDest& orNetDest) const | 196NetDest 197NetDest::OR(const NetDest& orNetDest) const |
187{ | 198{ |
188 assert(m_bits.size() == orNetDest.getSize()); 189 NetDest result; 190 for (int i=0; i<m_bits.size(); i++) { 191 result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]); 192 } 193 return result; | 199 assert(m_bits.size() == orNetDest.getSize()); 200 NetDest result; 201 for (int i = 0; i < m_bits.size(); i++) { 202 result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]); 203 } 204 return result; |
194} 195 | 205} 206 |
196 | |
197// returns the logical AND of "this" set and andNetDest | 207// returns the logical AND of "this" set and andNetDest |
198NetDest NetDest::AND(const NetDest& andNetDest) const | 208NetDest 209NetDest::AND(const NetDest& andNetDest) const |
199{ | 210{ |
200 assert(m_bits.size() == andNetDest.getSize()); 201 NetDest result; 202 for (int i=0; i<m_bits.size(); i++) { 203 result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]); 204 } 205 return result; | 211 assert(m_bits.size() == andNetDest.getSize()); 212 NetDest result; 213 for (int i = 0; i < m_bits.size(); i++) { 214 result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]); 215 } 216 return result; |
206} 207 208// Returns true if the intersection of the two sets is non-empty | 217} 218 219// Returns true if the intersection of the two sets is non-empty |
209bool NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const | 220bool 221NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const |
210{ | 222{ |
211 assert(m_bits.size() == other_netDest.getSize()); 212 for (int i=0; i<m_bits.size(); i++) { 213 if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) { 214 return true; | 223 assert(m_bits.size() == other_netDest.getSize()); 224 for (int i = 0; i < m_bits.size(); i++) { 225 if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) { 226 return true; 227 } |
215 } | 228 } |
216 } 217 return false; | 229 return false; |
218} 219 | 230} 231 |
220bool NetDest::isSuperset(const NetDest& test) const | 232bool 233NetDest::isSuperset(const NetDest& test) const |
221{ | 234{ |
222 assert(m_bits.size() == test.getSize()); | 235 assert(m_bits.size() == test.getSize()); |
223 | 236 |
224 for (int i=0; i<m_bits.size(); i++) { 225 if (!m_bits[i].isSuperset(test.m_bits[i])) { 226 return false; | 237 for (int i = 0; i < m_bits.size(); i++) { 238 if (!m_bits[i].isSuperset(test.m_bits[i])) { 239 return false; 240 } |
227 } | 241 } |
228 } 229 return true; | 242 return true; |
230} 231 | 243} 244 |
232bool NetDest::isElement(MachineID element) const | 245bool 246NetDest::isElement(MachineID element) const |
233{ | 247{ |
234 return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num)); | 248 return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num)); |
235} 236 | 249} 250 |
237void NetDest::setSize() | 251void 252NetDest::setSize() |
238{ | 253{ |
239 m_bits.setSize(MachineType_base_level(MachineType_NUM)); 240 assert(m_bits.size() == MachineType_NUM); | 254 m_bits.setSize(MachineType_base_level(MachineType_NUM)); 255 assert(m_bits.size() == MachineType_NUM); |
241 | 256 |
242 for (int i = 0; i < m_bits.size(); i++) { 243 m_bits[i].setSize(MachineType_base_count((MachineType)i)); 244 } | 257 for (int i = 0; i < m_bits.size(); i++) { 258 m_bits[i].setSize(MachineType_base_count((MachineType)i)); 259 } |
245} 246 | 260} 261 |
247void NetDest::print(ostream& out) const | 262void 263NetDest::print(ostream& out) const |
248{ | 264{ |
249 out << "[NetDest (" << m_bits.size() << ") "; | 265 out << "[NetDest (" << m_bits.size() << ") "; |
250 | 266 |
251 for (int i=0; i<m_bits.size(); i++) { 252 for (int j=0; j<m_bits[i].getSize(); j++) { 253 out << (bool) m_bits[i].isElement(j) << " "; | 267 for (int i = 0; i < m_bits.size(); i++) { 268 for (int j = 0; j < m_bits[i].getSize(); j++) { 269 out << (bool) m_bits[i].isElement(j) << " "; 270 } 271 out << " - "; |
254 } | 272 } |
255 out << " - "; 256 } 257 out << "]"; | 273 out << "]"; |
258} 259 | 274} 275 |