1/* |
2 * Copyright (c) 2017 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * |
14 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 15 * All rights reserved. 16 * 17 * Redistribution and use in source and binary forms, with or without 18 * modification, are permitted provided that the following conditions are 19 * met: redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer; 21 * redistributions in binary form must reproduce the above copyright --- 14 unchanged lines hidden (view full) --- 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 */ 40 41#include "mem/ruby/network/Network.hh" 42 43#include "base/misc.hh" |
44#include "mem/ruby/common/MachineID.hh" |
45#include "mem/ruby/network/BasicLink.hh" 46#include "mem/ruby/system/RubySystem.hh" 47 48uint32_t Network::m_virtual_networks; 49uint32_t Network::m_control_msg_size; 50uint32_t Network::m_data_msg_size; 51 52Network::Network(const Params *p) --- 28 unchanged lines hidden (view full) --- 81 params()->ruby_system->registerNetwork(this); 82 83 // Initialize the controller's network pointers 84 for (std::vector<BasicExtLink*>::const_iterator i = p->ext_links.begin(); 85 i != p->ext_links.end(); ++i) { 86 BasicExtLink *ext_link = (*i); 87 AbstractController *abs_cntrl = ext_link->params()->ext_node; 88 abs_cntrl->initNetworkPtr(this); |
89 const AddrRangeList &ranges = abs_cntrl->getAddrRanges(); 90 if (!ranges.empty()) { 91 MachineID mid = abs_cntrl->getMachineID(); 92 AddrMapNode addr_map_node = { 93 .id = mid.getNum(), 94 .ranges = ranges 95 }; 96 addrMap.emplace(mid.getType(), addr_map_node); 97 } |
98 } 99 100 // Register a callback function for combining the statistics 101 Stats::registerDumpCallback(new StatsCallback(this)); 102 103 for (auto &it : dynamic_cast<Network *>(this)->params()->ext_links) { 104 it->params()->ext_node->initNetQueues(); 105 } --- 83 unchanged lines hidden (view full) --- 189 std::string vnet_type, MessageBuffer *b) 190{ 191 checkNetworkAllocation(id, ordered, network_num, vnet_type); 192 while (m_fromNetQueues[id].size() <= network_num) { 193 m_fromNetQueues[id].push_back(nullptr); 194 } 195 m_fromNetQueues[id][network_num] = b; 196} |
197 198NodeID 199Network::addressToNodeID(Addr addr, MachineType mtype) 200{ 201 // Look through the address maps for entries with matching machine 202 // type to get the responsible node for this address. 203 const auto &matching_ranges = addrMap.equal_range(mtype); 204 for (auto it = matching_ranges.first; it != matching_ranges.second; it++) { 205 AddrMapNode &node = it->second; 206 auto &ranges = node.ranges; 207 for (AddrRange &range: ranges) { 208 if (range.contains(addr)) { 209 return node.id; 210 } 211 } 212 } 213 return MachineType_base_count(mtype); 214} |