Deleted Added
sdiff udiff text old ( 7453:1a5db3dd0f62 ) new ( 7454:3a3e8e8cce1b )
full compact
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
29#include "mem/protocol/Protocol.hh"
30#include "mem/ruby/buffers/MessageBuffer.hh"
31#include "mem/ruby/network/simple/PerfectSwitch.hh"
32#include "mem/ruby/network/simple/SimpleNetwork.hh"
33#include "mem/ruby/profiler/Profiler.hh"
34#include "mem/ruby/slicc_interface/NetworkMessage.hh"
35#include "mem/ruby/system/System.hh"
36

--- 13 unchanged lines hidden (view full) ---

50 m_virtual_networks = network_ptr->getNumberOfVirtualNetworks();
51 m_switch_id = sid;
52 m_round_robin_start = 0;
53 m_network_ptr = network_ptr;
54 m_wakeups_wo_switch = 0;
55}
56
57void
58PerfectSwitch::addInPort(const Vector<MessageBuffer*>& in)
59{
60 assert(in.size() == m_virtual_networks);
61 NodeID port = m_in.size();
62 m_in.insertAtBottom(in);
63 for (int j = 0; j < m_virtual_networks; j++) {
64 m_in[port][j]->setConsumer(this);
65 string desc = csprintf("[Queue from port %s %s %s to PerfectSwitch]",
66 NodeIDToString(m_switch_id), NodeIDToString(port),
67 NodeIDToString(j));
68 m_in[port][j]->setDescription(desc);
69 }
70}
71
72void
73PerfectSwitch::addOutPort(const Vector<MessageBuffer*>& out,
74 const NetDest& routing_table_entry)
75{
76 assert(out.size() == m_virtual_networks);
77
78 // Setup link order
79 LinkOrder l;
80 l.m_value = 0;
81 l.m_link = m_out.size();
82 m_link_order.insertAtBottom(l);
83
84 // Add to routing table
85 m_out.insertAtBottom(out);
86 m_routing_table.insertAtBottom(routing_table_entry);
87}
88
89void
90PerfectSwitch::clearRoutingTables()
91{
92 m_routing_table.clear();
93}
94

--- 11 unchanged lines hidden (view full) ---

106 m_out[i][vnet]->clear();
107 }
108 }
109}
110
111void
112PerfectSwitch::reconfigureOutPort(const NetDest& routing_table_entry)
113{
114 m_routing_table.insertAtBottom(routing_table_entry);
115}
116
117PerfectSwitch::~PerfectSwitch()
118{
119}
120
121void
122PerfectSwitch::wakeup()

--- 33 unchanged lines hidden (view full) ---

156 for (int counter = 0; counter < m_in.size(); counter++) {
157 // Round robin scheduling
158 incoming++;
159 if (incoming >= m_in.size()) {
160 incoming = 0;
161 }
162
163 // temporary vectors to store the routing results
164 Vector<LinkID> output_links;
165 Vector<NetDest> output_link_destinations;
166
167 // Is there a message waiting?
168 while (m_in[incoming][vnet]->isReady()) {
169 DEBUG_EXPR(NETWORK_COMP, MedPrio, incoming);
170
171 // Peek at message
172 msg_ptr = m_in[incoming][vnet]->peekMsgPtr();
173 net_msg_ptr = safe_cast<NetworkMessage*>(msg_ptr.get());

--- 27 unchanged lines hidden (view full) ---

201 }
202 int value =
203 (out_queue_length << 8) | (random() & 0xff);
204 m_link_order[out].m_link = out;
205 m_link_order[out].m_value = value;
206 }
207
208 // Look at the most empty link first
209 m_link_order.sortVector();
210 }
211 }
212
213 for (int i = 0; i < m_routing_table.size(); i++) {
214 // pick the next link to look at
215 int link = m_link_order[i].m_link;
216 NetDest dst = m_routing_table[link];
217 DEBUG_EXPR(NETWORK_COMP, MedPrio, dst);
218
219 if (!msg_dsts.intersectionIsNotEmpty(dst))
220 continue;
221
222 // Remember what link we're using
223 output_links.insertAtBottom(link);
224
225 // Need to remember which destinations need this
226 // message in another vector. This Set is the
227 // intersection of the routing_table entry and the
228 // current destination set. The intersection must
229 // not be empty, since we are inside "if"
230 output_link_destinations.insertAtBottom(msg_dsts.AND(dst));
231
232 // Next, we update the msg_destination not to
233 // include those nodes that were already handled
234 // by this link
235 msg_dsts.removeNetDest(dst);
236 }
237
238 assert(msg_dsts.count() == 0);

--- 97 unchanged lines hidden ---