From 20129837186a5eb28a1b1e2f8dcd441934af68a6 Mon Sep 17 00:00:00 2001 From: Nilay Vaish Date: Mon, 14 Jan 2013 10:05:10 -0600 Subject: [PATCH] Ruby: remove reference to g_system_ptr from class Message This patch was initiated so as to remove reference to g_system_ptr, the pointer to Ruby System that is used for getting the current time. That simple change actual requires changing a lot many things in slicc and garnet. All these changes are related to how time is handled. In most of the places, g_system_ptr has been replaced by another clock object. The changes have been done under the assumption that all the components in the memory system are on the same clock frequency, but the actual clocks might be distributed. --- src/mem/ruby/common/Global.hh | 7 --- .../ruby/network/garnet/BaseGarnetNetwork.cc | 2 +- .../garnet/fixed-pipeline/GarnetNetwork_d.cc | 6 +- .../garnet/fixed-pipeline/InputUnit_d.cc | 8 +-- .../garnet/fixed-pipeline/InputUnit_d.hh | 29 +++++----- .../fixed-pipeline/NetworkInterface_d.cc | 38 +++++++------ .../garnet/fixed-pipeline/NetworkLink_d.cc | 4 +- .../garnet/fixed-pipeline/NetworkLink_d.hh | 2 +- .../garnet/fixed-pipeline/OutputUnit_d.cc | 6 +- .../garnet/fixed-pipeline/OutputUnit_d.hh | 9 ++- .../garnet/fixed-pipeline/RoutingUnit_d.cc | 4 +- .../garnet/fixed-pipeline/SWallocator_d.cc | 30 ++++++---- .../network/garnet/fixed-pipeline/Switch_d.cc | 12 ++-- .../garnet/fixed-pipeline/VCallocator_d.cc | 15 +++-- .../garnet/fixed-pipeline/VirtualChannel_d.cc | 31 +++++----- .../garnet/fixed-pipeline/VirtualChannel_d.hh | 18 +++--- .../garnet/fixed-pipeline/flitBuffer_d.cc | 8 +-- .../garnet/fixed-pipeline/flitBuffer_d.hh | 4 +- .../network/garnet/fixed-pipeline/flit_d.cc | 11 ++-- .../network/garnet/fixed-pipeline/flit_d.hh | 17 +++--- .../garnet/flexible-pipeline/GarnetNetwork.cc | 6 +- .../flexible-pipeline/NetworkInterface.cc | 27 ++++----- .../garnet/flexible-pipeline/NetworkLink.cc | 6 +- .../garnet/flexible-pipeline/Router.cc | 56 ++++++++----------- .../network/garnet/flexible-pipeline/flit.cc | 6 +- .../network/garnet/flexible-pipeline/flit.hh | 2 +- .../garnet/flexible-pipeline/flitBuffer.cc | 8 +-- .../garnet/flexible-pipeline/flitBuffer.hh | 4 +- src/mem/ruby/network/orion/NetworkPower.cc | 6 +- src/mem/ruby/slicc_interface/Message.hh | 9 ++- .../ruby/slicc_interface/NetworkMessage.hh | 6 +- src/mem/ruby/slicc_interface/RubyRequest.hh | 17 +++--- .../ruby/slicc_interface/RubySlicc_Util.hh | 5 ++ src/mem/ruby/structures/Prefetcher.hh | 2 +- src/mem/ruby/system/DMASequencer.cc | 4 +- src/mem/ruby/system/Sequencer.cc | 2 +- src/mem/ruby/system/WireBuffer.cc | 2 + src/mem/slicc/ast/EnqueueStatementAST.py | 3 +- src/mem/slicc/symbols/Type.py | 29 +++++----- 39 files changed, 235 insertions(+), 226 deletions(-) diff --git a/src/mem/ruby/common/Global.hh b/src/mem/ruby/common/Global.hh index f76a1a26b..d6597be89 100644 --- a/src/mem/ruby/common/Global.hh +++ b/src/mem/ruby/common/Global.hh @@ -34,12 +34,5 @@ class RubySystem; extern RubySystem* g_system_ptr; -// FIXME: this is required by the contructor of Directory_Entry.hh. -// It can't go into slicc_util.hh because it opens a can of ugly worms -extern inline int max_tokens() -{ - return 1024; -} - #endif // __MEM_RUBY_COMMON_GLOBAL_HH__ diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc index 78b4b2d42..e3196a0e7 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc @@ -127,7 +127,7 @@ BaseGarnetNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num, void BaseGarnetNetwork::clearStats() { - m_ruby_start = g_system_ptr->getTime(); + m_ruby_start = curCycle(); } Time diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc index c7ac85ad3..6404eb6ff 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc @@ -272,7 +272,7 @@ GarnetNetwork_d::printLinkStats(ostream& out) const for (int i = 0; i < m_link_ptr_vector.size(); i++) { average_link_utilization += (double(m_link_ptr_vector[i]->getLinkUtilization())) / - (double(g_system_ptr->getTime()-m_ruby_start)); + (double(curCycle() - m_ruby_start)); vector vc_load = m_link_ptr_vector[i]->getVcLoad(); for (int j = 0; j < vc_load.size(); j++) { @@ -290,8 +290,8 @@ GarnetNetwork_d::printLinkStats(ostream& out) const if (!m_in_use[i/m_vcs_per_vnet]) continue; - average_vc_load[i] = (double(average_vc_load[i]) / - (double(g_system_ptr->getTime()) - m_ruby_start)); + average_vc_load[i] = (double(average_vc_load[i])) / + (double(curCycle() - m_ruby_start)); out << "Average VC Load [" << i << "] = " << average_vc_load[i] << " flits/cycle " << endl; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc index 62b8cd574..2671d781f 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc @@ -53,7 +53,7 @@ InputUnit_d::InputUnit_d(int id, Router_d *router) : Consumer(router) // Instantiating the virtual channels m_vcs.resize(m_num_vcs); for (int i=0; i < m_num_vcs; i++) { - m_vcs[i] = new VirtualChannel_d(i); + m_vcs[i] = new VirtualChannel_d(i, m_router->curCycle()); } } @@ -67,7 +67,7 @@ void InputUnit_d::wakeup() { flit_d *t_flit; - if (m_in_link->isReady()) { + if (m_in_link->isReady(m_router->curCycle())) { t_flit = m_in_link->consumeLink(); int vc = t_flit->get_vc(); @@ -79,9 +79,9 @@ InputUnit_d::wakeup() // Do the route computation for this vc m_router->route_req(t_flit, this, vc); - m_vcs[vc]->set_enqueue_time(g_system_ptr->getTime()); + m_vcs[vc]->set_enqueue_time(m_router->curCycle()); } else { - t_flit->advance_stage(SA_); + t_flit->advance_stage(SA_, m_router->curCycle()); m_router->swarb_req(); } // write flit into input buffer diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh index 544c4271b..3ebf7c6e9 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh @@ -56,9 +56,9 @@ class InputUnit_d : public Consumer inline int get_inlink_id() { return m_in_link->get_id(); } inline void - set_vc_state(VC_state_type state, int vc) + set_vc_state(VC_state_type state, int vc, Time curTime) { - m_vcs[vc]->set_state(state); + m_vcs[vc]->set_state(state, curTime); } inline void @@ -86,9 +86,9 @@ class InputUnit_d : public Consumer } inline void - increment_credit(int in_vc, bool free_signal) + increment_credit(int in_vc, bool free_signal, Time curTime) { - flit_d *t_flit = new flit_d(in_vc, free_signal); + flit_d *t_flit = new flit_d(in_vc, free_signal, curTime); creditQueue->insert(t_flit); m_credit_link->scheduleEvent(1); } @@ -100,16 +100,16 @@ class InputUnit_d : public Consumer } inline void - updateRoute(int vc, int outport) + updateRoute(int vc, int outport, Time curTime) { m_vcs[vc]->set_outport(outport); - m_vcs[vc]->set_state(VC_AB_); + m_vcs[vc]->set_state(VC_AB_, curTime); } inline void - grant_vc(int in_vc, int out_vc) + grant_vc(int in_vc, int out_vc, Time curTime) { - m_vcs[in_vc]->grant_vc(out_vc); + m_vcs[in_vc]->grant_vc(out_vc, curTime); } inline flit_d* @@ -125,21 +125,22 @@ class InputUnit_d : public Consumer } inline bool - need_stage(int vc, VC_state_type state, flit_stage stage) + need_stage(int vc, VC_state_type state, flit_stage stage, Time curTime) { - return m_vcs[vc]->need_stage(state, stage); + return m_vcs[vc]->need_stage(state, stage, curTime); } inline bool - need_stage_nextcycle(int vc, VC_state_type state, flit_stage stage) + need_stage_nextcycle(int vc, VC_state_type state, flit_stage stage, + Time curTime) { - return m_vcs[vc]->need_stage_nextcycle(state, stage); + return m_vcs[vc]->need_stage_nextcycle(state, stage, curTime); } inline bool - isReady(int invc) + isReady(int invc, Time curTime) { - return m_vcs[invc]->isReady(); + return m_vcs[invc]->isReady(curTime); } inline int diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc index 62bee1850..f0e117aad 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc @@ -71,7 +71,7 @@ NetworkInterface_d::NetworkInterface_d(int id, int virtual_networks, for (int i = 0; i < m_num_vcs; i++) { m_out_vc_state.push_back(new OutVcState_d(i, m_net_ptr)); - m_out_vc_state[i]->setState(IDLE_, g_system_ptr->getTime()); + m_out_vc_state[i]->setState(IDLE_, m_net_ptr->curCycle()); } } @@ -170,12 +170,15 @@ NetworkInterface_d::flitisizeMessage(MsgPtr msg_ptr, int vnet) for (int i = 0; i < num_flits; i++) { m_net_ptr->increment_injected_flits(vnet); - flit_d *fl = new flit_d(i, vc, vnet, num_flits, new_msg_ptr); - fl->set_delay(g_system_ptr->getTime() - msg_ptr->getTime()); + flit_d *fl = new flit_d(i, vc, vnet, num_flits, new_msg_ptr, + m_net_ptr->curCycle()); + + fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime()); m_ni_buffers[vc]->insert(fl); } - m_ni_enqueue_time[vc] = g_system_ptr->getTime(); - m_out_vc_state[vc]->setState(ACTIVE_, g_system_ptr->getTime()); + + m_ni_enqueue_time[vc] = m_net_ptr->curCycle(); + m_out_vc_state[vc]->setState(ACTIVE_, m_net_ptr->curCycle()); } return true ; } @@ -191,7 +194,7 @@ NetworkInterface_d::calculateVC(int vnet) m_vc_allocator[vnet] = 0; if (m_out_vc_state[(vnet*m_vc_per_vnet) + delta]->isInState( - IDLE_, g_system_ptr->getTime())) { + IDLE_, m_net_ptr->curCycle())) { return ((vnet*m_vc_per_vnet) + delta); } } @@ -212,7 +215,7 @@ void NetworkInterface_d::wakeup() { DPRINTF(RubyNetwork, "m_id: %d woke up at time: %lld", - m_id, g_system_ptr->getTime()); + m_id, m_net_ptr->curCycle()); MsgPtr msg_ptr; @@ -234,7 +237,7 @@ NetworkInterface_d::wakeup() /*********** Picking messages destined for this NI **********/ - if (inNetLink->isReady()) { + if (inNetLink->isReady(m_net_ptr->curCycle())) { flit_d *t_flit = inNetLink->consumeLink(); bool free_signal = false; if (t_flit->get_type() == TAIL_ || t_flit->get_type() == HEAD_TAIL_) { @@ -245,13 +248,14 @@ NetworkInterface_d::wakeup() } // Simply send a credit back since we are not buffering // this flit in the NI - flit_d *credit_flit = new flit_d(t_flit->get_vc(), free_signal); + flit_d *credit_flit = new flit_d(t_flit->get_vc(), free_signal, + m_net_ptr->curCycle()); creditQueue->insert(credit_flit); m_ni_credit_link->scheduleEvent(1); int vnet = t_flit->get_vnet(); m_net_ptr->increment_received_flits(vnet); - int network_delay = g_system_ptr->getTime() - + int network_delay = m_net_ptr->curCycle() - t_flit->get_enqueue_time(); int queueing_delay = t_flit->get_delay(); m_net_ptr->increment_network_latency(network_delay, vnet); @@ -261,12 +265,12 @@ NetworkInterface_d::wakeup() /****************** Checking for credit link *******/ - if (m_credit_link->isReady()) { + if (m_credit_link->isReady(m_net_ptr->curCycle())) { flit_d *t_flit = m_credit_link->consumeLink(); m_out_vc_state[t_flit->get_vc()]->increment_credit(); if (t_flit->is_free_signal()) { m_out_vc_state[t_flit->get_vc()]->setState(IDLE_, - g_system_ptr->getTime()); + m_net_ptr->curCycle()); } delete t_flit; } @@ -292,7 +296,9 @@ NetworkInterface_d::scheduleOutputLink() vc = 0; // model buffer backpressure - if (m_ni_buffers[vc]->isReady() && m_out_vc_state[vc]->has_credits()) { + if (m_ni_buffers[vc]->isReady(m_net_ptr->curCycle()) && + m_out_vc_state[vc]->has_credits()) { + bool is_candidate_vc = true; int t_vnet = get_vnet(vc); int vc_base = t_vnet * m_vc_per_vnet; @@ -301,7 +307,7 @@ NetworkInterface_d::scheduleOutputLink() for (int vc_offset = 0; vc_offset < m_vc_per_vnet; vc_offset++) { int t_vc = vc_base + vc_offset; - if (m_ni_buffers[t_vc]->isReady()) { + if (m_ni_buffers[t_vc]->isReady(m_net_ptr->curCycle())) { if (m_ni_enqueue_time[t_vc] < m_ni_enqueue_time[vc]) { is_candidate_vc = false; break; @@ -315,7 +321,7 @@ NetworkInterface_d::scheduleOutputLink() m_out_vc_state[vc]->decrement_credit(); // Just removing the flit flit_d *t_flit = m_ni_buffers[vc]->getTopFlit(); - t_flit->set_time(g_system_ptr->getTime() + 1); + t_flit->set_time(m_net_ptr->curCycle() + 1); outSrcQueue->insert(t_flit); // schedule the out link outNetLink->scheduleEvent(1); @@ -350,7 +356,7 @@ NetworkInterface_d::checkReschedule() } } for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_ni_buffers[vc]->isReadyForNext()) { + if (m_ni_buffers[vc]->isReadyForNext(m_net_ptr->curCycle())) { scheduleEvent(1); return; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc index 6d12fc30e..80a050207 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc @@ -66,9 +66,9 @@ NetworkLink_d::setSourceQueue(flitBuffer_d *srcQueue) void NetworkLink_d::wakeup() { - if (link_srcQueue->isReady()) { + if (link_srcQueue->isReady(curCycle())) { flit_d *t_flit = link_srcQueue->getTopFlit(); - t_flit->set_time(g_system_ptr->getTime() + m_latency); + t_flit->set_time(curCycle() + m_latency); linkBuffer->insert(t_flit); link_consumer->scheduleEvent(m_latency); m_link_utilized++; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh index f27e60757..c52c903e0 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh @@ -62,7 +62,7 @@ class NetworkLink_d : public ClockedObject, public Consumer double calculate_power(); - inline bool isReady() { return linkBuffer->isReady(); } + inline bool isReady(Time curTime) { return linkBuffer->isReady(curTime); } inline flit_d* peekLink() { return linkBuffer->peekTopFlit(); } inline flit_d* consumeLink() { return linkBuffer->getTopFlit(); } void init_net_ptr(GarnetNetwork_d* net_ptr) diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc index 33d1583e1..7422a5165 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc @@ -66,7 +66,7 @@ OutputUnit_d::decrement_credit(int out_vc) void OutputUnit_d::wakeup() { - if (m_credit_link->isReady()) { + if (m_credit_link->isReady(m_router->curCycle())) { flit_d *t_flit = m_credit_link->consumeLink(); int out_vc = t_flit->get_vc(); m_outvc_state[out_vc]->increment_credit(); @@ -75,7 +75,7 @@ OutputUnit_d::wakeup() m_outvc_state[out_vc]->get_credit_count()); if (t_flit->is_free_signal()) - set_vc_state(IDLE_, out_vc); + set_vc_state(IDLE_, out_vc, m_router->curCycle()); delete t_flit; } @@ -102,7 +102,7 @@ OutputUnit_d::set_credit_link(CreditLink_d *credit_link) void OutputUnit_d::update_vc(int vc, int in_port, int in_vc) { - m_outvc_state[vc]->setState(ACTIVE_, g_system_ptr->getTime() + 1); + m_outvc_state[vc]->setState(ACTIVE_, m_router->curCycle() + 1); m_outvc_state[vc]->set_inport(in_port); m_outvc_state[vc]->set_invc(in_vc); m_router->update_incredit(in_port, in_vc, diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh index 750c71b32..4fa7dcb90 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh @@ -69,16 +69,15 @@ class OutputUnit_d : public Consumer } inline void - set_vc_state(VC_state_type state, int vc) + set_vc_state(VC_state_type state, int vc, Time curTime) { - m_outvc_state[vc]->setState(state, g_system_ptr->getTime() + 1); + m_outvc_state[vc]->setState(state, curTime + 1); } inline bool - is_vc_idle(int vc) + is_vc_idle(int vc, Time curTime) { - return (m_outvc_state[vc]->isInState(IDLE_, - g_system_ptr->getTime())); + return (m_outvc_state[vc]->isInState(IDLE_, curTime)); } inline void diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc index 35a9f06e1..e68c08613 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/RoutingUnit_d.cc @@ -57,8 +57,8 @@ void RoutingUnit_d::RC_stage(flit_d *t_flit, InputUnit_d *in_unit, int invc) { int outport = routeCompute(t_flit); - in_unit->updateRoute(invc, outport); - t_flit->advance_stage(VA_); + in_unit->updateRoute(invc, outport, m_router->curCycle()); + t_flit->advance_stage(VA_, m_router->curCycle()); m_router->vcarb_req(); } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc index 41ff8d482..ab3f4b761 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc @@ -113,8 +113,10 @@ SWallocator_d::arbitrate_inports() get_vnet(invc)))) continue; - if (m_input_unit[inport]->need_stage(invc, ACTIVE_, SA_) && - m_input_unit[inport]->has_credits(invc)) { + if (m_input_unit[inport]->need_stage(invc, ACTIVE_, SA_, + m_router->curCycle()) && + m_input_unit[inport]->has_credits(invc)) { + if (is_candidate_inport(inport, invc)) { int outport = m_input_unit[inport]->get_route(invc); m_local_arbiter_activity++; @@ -137,7 +139,8 @@ SWallocator_d::is_candidate_inport(int inport, int invc) if ((m_router->get_net_ptr())->isVNetOrdered(t_vnet)) { for (int vc_offset = 0; vc_offset < m_vc_per_vnet; vc_offset++) { int temp_vc = vc_base + vc_offset; - if (m_input_unit[inport]->need_stage(temp_vc, ACTIVE_, SA_) && + if (m_input_unit[inport]->need_stage(temp_vc, ACTIVE_, SA_, + m_router->curCycle()) && (m_input_unit[inport]->get_route(temp_vc) == outport) && (m_input_unit[inport]->get_enqueue_time(temp_vc) < t_enqueue_time)) { @@ -175,28 +178,34 @@ SWallocator_d::arbitrate_outports() // remove flit from Input Unit flit_d *t_flit = m_input_unit[inport]->getTopFlit(invc); - t_flit->advance_stage(ST_); + t_flit->advance_stage(ST_, m_router->curCycle()); t_flit->set_vc(outvc); t_flit->set_outport(outport); - t_flit->set_time(g_system_ptr->getTime() + 1); + t_flit->set_time(m_router->curCycle() + 1); m_output_unit[outport]->decrement_credit(outvc); m_router->update_sw_winner(inport, t_flit); m_global_arbiter_activity++; if ((t_flit->get_type() == TAIL_) || t_flit->get_type() == HEAD_TAIL_) { + // Send a credit back // along with the information that this VC is now idle - m_input_unit[inport]->increment_credit(invc, true); + m_input_unit[inport]->increment_credit(invc, true, + m_router->curCycle()); + // This Input VC should now be empty - assert(m_input_unit[inport]->isReady(invc) == false); + assert(m_input_unit[inport]->isReady(invc, + m_router->curCycle()) == false); - m_input_unit[inport]->set_vc_state(IDLE_, invc); + m_input_unit[inport]->set_vc_state(IDLE_, invc, + m_router->curCycle()); m_input_unit[inport]->set_enqueue_time(invc, INFINITE_); } else { // Send a credit back // but do not indicate that the VC is idle - m_input_unit[inport]->increment_credit(invc, false); + m_input_unit[inport]->increment_credit(invc, false, + m_router->curCycle()); } break; // got a in request for this outport } @@ -209,7 +218,8 @@ SWallocator_d::check_for_wakeup() { for (int i = 0; i < m_num_inports; i++) { for (int j = 0; j < m_num_vcs; j++) { - if (m_input_unit[i]->need_stage_nextcycle(j, ACTIVE_, SA_)) { + if (m_input_unit[i]->need_stage_nextcycle(j, ACTIVE_, SA_, + m_router->curCycle())) { scheduleEvent(1); return; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc index 1cb31c3e3..db7446f7a 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/Switch_d.cc @@ -65,16 +65,16 @@ void Switch_d::wakeup() { DPRINTF(RubyNetwork, "Switch woke up at time: %lld\n", - g_system_ptr->getTime()); + m_router->curCycle()); for (int inport = 0; inport < m_num_inports; inport++) { - if (!m_switch_buffer[inport]->isReady()) + if (!m_switch_buffer[inport]->isReady(m_router->curCycle())) continue; flit_d *t_flit = m_switch_buffer[inport]->peekTopFlit(); - if (t_flit->is_stage(ST_)) { + if (t_flit->is_stage(ST_, m_router->curCycle())) { int outport = t_flit->get_outport(); - t_flit->advance_stage(LT_); - t_flit->set_time(g_system_ptr->getTime() + 1); + t_flit->advance_stage(LT_, m_router->curCycle()); + t_flit->set_time(m_router->curCycle() + 1); // This will take care of waking up the Network Link m_output_unit[outport]->insert_flit(t_flit); @@ -89,7 +89,7 @@ void Switch_d::check_for_wakeup() { for (int inport = 0; inport < m_num_inports; inport++) { - if (m_switch_buffer[inport]->isReadyForNext()) { + if (m_switch_buffer[inport]->isReadyForNext(m_router->curCycle())) { scheduleEvent(1); break; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc index 75533fb10..012837362 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc @@ -132,7 +132,8 @@ VCallocator_d::is_invc_candidate(int inport_iter, int invc_iter) if ((m_router->get_net_ptr())->isVNetOrdered(vnet)) { for (int vc_offset = 0; vc_offset < m_vc_per_vnet; vc_offset++) { int temp_vc = invc_base + vc_offset; - if (m_input_unit[inport_iter]->need_stage(temp_vc, VC_AB_, VA_) && + if (m_input_unit[inport_iter]->need_stage(temp_vc, VC_AB_, VA_, + m_router->curCycle()) && (m_input_unit[inport_iter]->get_route(temp_vc) == outport) && (m_input_unit[inport_iter]->get_enqueue_time(temp_vc) < t_enqueue_time)) { @@ -163,7 +164,7 @@ VCallocator_d::select_outvc(int inport_iter, int invc_iter) if (outvc_offset >= num_vcs_per_vnet) outvc_offset = 0; int outvc = outvc_base + outvc_offset; - if (m_output_unit[outport]->is_vc_idle(outvc)) { + if (m_output_unit[outport]->is_vc_idle(outvc, m_router->curCycle())) { m_local_arbiter_activity[vnet]++; m_outvc_req[outport][outvc][inport_iter][invc_iter] = true; if (!m_outvc_is_req[outport][outvc]) @@ -182,8 +183,8 @@ VCallocator_d::arbitrate_invcs() get_vnet(invc_iter)))) continue; - if (m_input_unit[inport_iter]->need_stage( - invc_iter, VC_AB_, VA_)) { + if (m_input_unit[inport_iter]->need_stage(invc_iter, VC_AB_, + VA_, m_router->curCycle())) { if (!is_invc_candidate(inport_iter, invc_iter)) continue; @@ -231,7 +232,8 @@ VCallocator_d::arbitrate_outvcs() int invc = invc_base + invc_offset; if (m_outvc_req[outport_iter][outvc_iter][inport][invc]) { m_global_arbiter_activity[vnet]++; - m_input_unit[inport]->grant_vc(invc, outvc_iter); + m_input_unit[inport]->grant_vc(invc, outvc_iter, + m_router->curCycle()); m_output_unit[outport_iter]->update_vc( outvc_iter, inport, invc); m_router->swarb_req(); @@ -256,7 +258,8 @@ VCallocator_d::check_for_wakeup() { for (int i = 0; i < m_num_inports; i++) { for (int j = 0; j < m_num_vcs; j++) { - if (m_input_unit[i]->need_stage_nextcycle(j, VC_AB_, VA_)) { + if (m_input_unit[i]->need_stage_nextcycle(j, VC_AB_, VA_, + m_router->curCycle())) { scheduleEvent(1); return; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc index 96d873009..4fd2ebbbf 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.cc @@ -30,12 +30,12 @@ #include "mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh" -VirtualChannel_d::VirtualChannel_d(int id) +VirtualChannel_d::VirtualChannel_d(int id, Time curTime) { m_id = id; m_input_buffer = new flitBuffer_d(); m_vc_state.first = IDLE_; - m_vc_state.second = g_system_ptr->getTime(); + m_vc_state.second = curTime; m_enqueue_time = INFINITE_; } @@ -51,37 +51,36 @@ VirtualChannel_d::set_outport(int outport) } void -VirtualChannel_d::grant_vc(int out_vc) +VirtualChannel_d::grant_vc(int out_vc, Time curTime) { m_output_vc = out_vc; m_vc_state.first = ACTIVE_; - m_vc_state.second = g_system_ptr->getTime() + 1; + m_vc_state.second = curTime + 1; flit_d *t_flit = m_input_buffer->peekTopFlit(); - t_flit->advance_stage(SA_); + t_flit->advance_stage(SA_, curTime); } bool -VirtualChannel_d::need_stage(VC_state_type state, flit_stage stage) +VirtualChannel_d::need_stage(VC_state_type state, flit_stage stage, + Time curTime) { - if ((m_vc_state.first == state) && - (g_system_ptr->getTime() >= m_vc_state.second)) { - if (m_input_buffer->isReady()) { + if ((m_vc_state.first == state) && (curTime >= m_vc_state.second)) { + if (m_input_buffer->isReady(curTime)) { flit_d *t_flit = m_input_buffer->peekTopFlit(); - return(t_flit->is_stage(stage)) ; + return(t_flit->is_stage(stage, curTime)) ; } } return false; - } bool -VirtualChannel_d::need_stage_nextcycle(VC_state_type state, flit_stage stage) +VirtualChannel_d::need_stage_nextcycle(VC_state_type state, flit_stage stage, + Time curTime) { - if ((m_vc_state.first == state) && - ((g_system_ptr->getTime()+1) >= m_vc_state.second)) { - if (m_input_buffer->isReadyForNext()) { + if ((m_vc_state.first == state) && ((curTime + 1) >= m_vc_state.second)) { + if (m_input_buffer->isReadyForNext(curTime)) { flit_d *t_flit = m_input_buffer->peekTopFlit(); - return(t_flit->is_next_stage(stage)) ; + return(t_flit->is_next_stage(stage, curTime)) ; } } return false; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh index 18553fe2b..6217be1d0 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VirtualChannel_d.hh @@ -39,13 +39,14 @@ class VirtualChannel_d { public: - VirtualChannel_d(int id); + VirtualChannel_d(int id, Time curTime); ~VirtualChannel_d(); - bool need_stage(VC_state_type state, flit_stage stage); - bool need_stage_nextcycle(VC_state_type state, flit_stage stage); + bool need_stage(VC_state_type state, flit_stage stage, Time curTime); + bool need_stage_nextcycle(VC_state_type state, flit_stage stage, + Time curTime); void set_outport(int outport); - void grant_vc(int out_vc); + void grant_vc(int out_vc, Time curTime); inline Time get_enqueue_time() { return m_enqueue_time; } inline void set_enqueue_time(Time time) { m_enqueue_time = time; } @@ -56,7 +57,10 @@ class VirtualChannel_d inline void update_credit(int credit) { m_credit_count = credit; } inline void increment_credit() { m_credit_count++; } - inline bool isReady() { return m_input_buffer->isReady(); } + inline bool isReady(Time curTime) + { + return m_input_buffer->isReady(curTime); + } inline void insertFlit(flit_d *t_flit) @@ -65,10 +69,10 @@ class VirtualChannel_d } inline void - set_state(VC_state_type m_state) + set_state(VC_state_type m_state, Time curTime) { m_vc_state.first = m_state; - m_vc_state.second = g_system_ptr->getTime() + 1; + m_vc_state.second = curTime + 1; } inline flit_d* diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc index 2c4f4e09e..e31989a54 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.cc @@ -47,22 +47,22 @@ flitBuffer_d::isEmpty() } bool -flitBuffer_d::isReady() +flitBuffer_d::isReady(Time curTime) { if (m_buffer.size() != 0 ) { flit_d *t_flit = peekTopFlit(); - if (t_flit->get_time() <= g_system_ptr->getTime()) + if (t_flit->get_time() <= curTime) return true; } return false; } bool -flitBuffer_d::isReadyForNext() +flitBuffer_d::isReadyForNext(Time curTime) { if (m_buffer.size() != 0 ) { flit_d *t_flit = peekTopFlit(); - if (t_flit->get_time() <= (g_system_ptr->getTime() + 1)) + if (t_flit->get_time() <= (curTime + 1)) return true; } return false; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh index 23cbd0bb3..eb7729bef 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh @@ -44,8 +44,8 @@ class flitBuffer_d flitBuffer_d(); flitBuffer_d(int maximum_size); - bool isReady(); - bool isReadyForNext(); + bool isReady(Time curTime); + bool isReadyForNext(Time curTime); bool isEmpty(); void print(std::ostream& out) const; bool isFull(); diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc index 93364348e..07aea133f 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.cc @@ -30,12 +30,13 @@ #include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" -flit_d::flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr) +flit_d::flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr, + Time curTime) { m_size = size; m_msg_ptr = msg_ptr; - m_enqueue_time = g_system_ptr->getTime(); - m_time = g_system_ptr->getTime(); + m_enqueue_time = curTime; + m_time = curTime; m_id = id; m_vnet = vnet; m_vc = vc; @@ -54,12 +55,12 @@ flit_d::flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr) m_type = BODY_; } -flit_d::flit_d(int vc, bool is_free_signal) +flit_d::flit_d(int vc, bool is_free_signal, Time curTime) { m_id = 0; m_vc = vc; m_is_free_signal = is_free_signal; - m_time = g_system_ptr->getTime(); + m_time = curTime; } void diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh index 4295cbf6b..549dd59d5 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/flit_d.hh @@ -40,8 +40,8 @@ class flit_d { public: - flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr); - flit_d(int vc, bool is_free_signal); + flit_d(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Time curTime); + flit_d(int vc, bool is_free_signal, Time curTime); void set_outport(int port) { m_outport = port; } int get_outport() {return m_outport; } void print(std::ostream& out) const; @@ -58,25 +58,26 @@ class flit_d flit_type get_type() { return m_type; } bool - is_stage(flit_stage t_stage) + is_stage(flit_stage t_stage, Time curTime) { return (m_stage.first == t_stage && - g_system_ptr->getTime() >= m_stage.second); + curTime >= m_stage.second); } bool - is_next_stage(flit_stage t_stage) + is_next_stage(flit_stage t_stage, Time curTime) { return (m_stage.first == t_stage && - (g_system_ptr->getTime() + 1) >= m_stage.second); + (curTime + 1) >= m_stage.second); } void - advance_stage(flit_stage t_stage) + advance_stage(flit_stage t_stage, Time curTime) { m_stage.first = t_stage; - m_stage.second = g_system_ptr->getTime() + 1; + m_stage.second = curTime + 1; } + std::pair get_stage() { diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc index 9916f4ba5..a60d23457 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc @@ -255,7 +255,7 @@ GarnetNetwork::printLinkStats(ostream& out) const for (int i = 0; i < m_link_ptr_vector.size(); i++) { average_link_utilization += (double(m_link_ptr_vector[i]->getLinkUtilization())) / - (double(g_system_ptr->getTime()-m_ruby_start)); + (double(curCycle() - m_ruby_start)); vector vc_load = m_link_ptr_vector[i]->getVcLoad(); for (int j = 0; j < vc_load.size(); j++) { @@ -273,8 +273,8 @@ GarnetNetwork::printLinkStats(ostream& out) const if (!m_in_use[i/m_vcs_per_vnet]) continue; - average_vc_load[i] = (double(average_vc_load[i]) / - (double(g_system_ptr->getTime()) - m_ruby_start)); + average_vc_load[i] = double(average_vc_load[i]) / + (double(curCycle() - m_ruby_start)); out << "Average VC Load [" << i << "] = " << average_vc_load[i] << " flits/cycle " << endl; } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc index 9e4c1ef9a..7267da36d 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc @@ -68,7 +68,7 @@ NetworkInterface::NetworkInterface(int id, int virtual_networks, for (int i = 0; i < m_num_vcs; i++) { m_out_vc_state.push_back(new OutVcState(i)); - m_out_vc_state[i]->setState(IDLE_, g_system_ptr->getTime()); + m_out_vc_state[i]->setState(IDLE_, m_net_ptr->curCycle()); } } @@ -167,19 +167,20 @@ NetworkInterface::flitisizeMessage(MsgPtr msg_ptr, int vnet) } for (int i = 0; i < num_flits; i++) { m_net_ptr->increment_injected_flits(vnet); - flit *fl = new flit(i, vc, vnet, num_flits, new_msg_ptr); - fl->set_delay(g_system_ptr->getTime() - msg_ptr->getTime()); + flit *fl = new flit(i, vc, vnet, num_flits, new_msg_ptr, + m_net_ptr->curCycle()); + fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime()); m_ni_buffers[vc]->insert(fl); } - m_out_vc_state[vc]->setState(VC_AB_, g_system_ptr->getTime()); + m_out_vc_state[vc]->setState(VC_AB_, m_net_ptr->curCycle()); // setting an output vc request for the next hop. // This flit will be ready to traverse the link and into the next hop // only when an output vc is acquired at the next hop outNetLink->request_vc_link(vc, new_net_msg_ptr->getInternalDestination(), - g_system_ptr->getTime()); + m_net_ptr->curCycle()); } return true ; @@ -222,7 +223,7 @@ NetworkInterface::calculateVC(int vnet) m_vc_allocator[vnet] = 0; if (m_out_vc_state[(vnet*m_vc_per_vnet) + delta]->isInState(IDLE_, - g_system_ptr->getTime())) { + m_net_ptr->curCycle())) { return ((vnet*m_vc_per_vnet) + delta); } } @@ -266,18 +267,18 @@ NetworkInterface::wakeup() flit *t_flit = inNetLink->consumeLink(); if (t_flit->get_type() == TAIL_ || t_flit->get_type() == HEAD_TAIL_) { DPRINTF(RubyNetwork, "m_id: %d, Message delivered at time: %lld\n", - m_id, g_system_ptr->getTime()); + m_id, m_net_ptr->curCycle()); outNode_ptr[t_flit->get_vnet()]->enqueue( t_flit->get_msg_ptr(), 1); // signal the upstream router that this vc can be freed now inNetLink->release_vc_link(t_flit->get_vc(), - g_system_ptr->getTime() + 1); + m_net_ptr->curCycle() + 1); } int vnet = t_flit->get_vnet(); m_net_ptr->increment_received_flits(vnet); - int network_delay = g_system_ptr->getTime() - + int network_delay = m_net_ptr->curCycle() - t_flit->get_enqueue_time(); int queueing_delay = t_flit->get_delay(); m_net_ptr->increment_network_latency(network_delay, vnet); @@ -304,14 +305,14 @@ NetworkInterface::scheduleOutputLink() vc++; if (vc == m_num_vcs) vc = 0; - if (m_ni_buffers[vc]->isReady()) { + if (m_ni_buffers[vc]->isReady(m_net_ptr->curCycle())) { if (m_out_vc_state[vc]->isInState(ACTIVE_, - g_system_ptr->getTime()) && + m_net_ptr->curCycle()) && outNetLink->isBufferNotFull_link(vc)) { // buffer backpressure // Just removing the flit flit *t_flit = m_ni_buffers[vc]->getTopFlit(); - t_flit->set_time(g_system_ptr->getTime() + 1); + t_flit->set_time(m_net_ptr->curCycle() + 1); outSrcQueue->insert(t_flit); // schedule the out link @@ -332,7 +333,7 @@ NetworkInterface::checkReschedule() } } for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_ni_buffers[vc]->isReadyForNext()) { + if (m_ni_buffers[vc]->isReadyForNext(m_net_ptr->curCycle())) { scheduleEvent(1); return; } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc index 2d94f6484..b9faef28d 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc @@ -116,7 +116,7 @@ NetworkLink::getLinkUtilization() bool NetworkLink::isReady() { - return linkBuffer->isReady(); + return linkBuffer->isReady(curCycle()); } void @@ -134,11 +134,11 @@ NetworkLink::setOutPort(int port) void NetworkLink::wakeup() { - if (!link_srcQueue->isReady()) + if (!link_srcQueue->isReady(curCycle())) return; flit *t_flit = link_srcQueue->getTopFlit(); - t_flit->set_time(g_system_ptr->getTime() + m_latency); + t_flit->set_time(curCycle() + m_latency); linkBuffer->insert(t_flit); link_consumer->scheduleEvent(m_latency); m_link_utilized++; diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc index 8e064a01f..ca82f0757 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc @@ -71,7 +71,7 @@ Router::addInPort(NetworkLink *in_link) vector in_vc_vector; for (int i = 0; i < m_num_vcs; i++) { in_vc_vector.push_back(new InVcState(i)); - in_vc_vector[i]->setState(IDLE_, g_system_ptr->getTime()); + in_vc_vector[i]->setState(IDLE_, curCycle()); } m_in_vc_state.push_back(in_vc_vector); m_in_link.push_back(in_link); @@ -111,7 +111,7 @@ Router::addOutPort(NetworkLink *out_link, const NetDest& routing_table_entry, vector out_vc_vector; for (int i = 0; i < m_num_vcs; i++) { out_vc_vector.push_back(new OutVcState(i)); - out_vc_vector[i]->setState(IDLE_, g_system_ptr->getTime()); + out_vc_vector[i]->setState(IDLE_, curCycle()); } m_out_vc_state.push_back(out_vc_vector); m_link_weights.push_back(link_weight); @@ -137,8 +137,8 @@ Router::request_vc(int in_vc, int in_port, NetDest destination, int outport = getRoute(destination); m_in_vc_state[in_port][in_vc]->setRoute(outport); m_in_vc_state[in_port][in_vc]->setState(VC_AB_, request_time); - assert(request_time >= g_system_ptr->getTime()); - if (request_time > g_system_ptr->getTime()) + assert(request_time >= curCycle()); + if (request_time > curCycle()) m_vc_arbiter->scheduleEventAbsolute(request_time); else vc_arbitrate(); @@ -180,22 +180,21 @@ Router::vc_arbitrate() InVcState *in_vc_state = m_in_vc_state[inport][invc]; - if (in_vc_state->isInState(VC_AB_, g_system_ptr->getTime())) { + if (in_vc_state->isInState(VC_AB_, curCycle())) { int outport = in_vc_state->get_outport(); vector valid_vcs = get_valid_vcs(invc); for (int valid_vc_iter = 0; valid_vc_iter < valid_vcs.size(); valid_vc_iter++) { if (m_out_vc_state[outport][valid_vcs[valid_vc_iter]] - ->isInState(IDLE_, g_system_ptr->getTime())) { + ->isInState(IDLE_, curCycle())) { in_vc_state->grant_vc(valid_vcs[valid_vc_iter], - g_system_ptr->getTime()); + curCycle()); - m_in_link[inport]->grant_vc_link(invc, - g_system_ptr->getTime()); + m_in_link[inport]->grant_vc_link(invc, curCycle()); m_out_vc_state[outport][valid_vcs[valid_vc_iter]] - ->setState(VC_AB_, g_system_ptr->getTime()); + ->setState(VC_AB_, curCycle()); break; } } @@ -270,8 +269,7 @@ Router::routeCompute(flit *m_flit, int inport) assert(m_net_ptr->getNumPipeStages() >= 1); // Subtract 1 as 1 cycle will be consumed in scheduling the output link - m_flit->set_time(g_system_ptr->getTime() + - (m_net_ptr->getNumPipeStages() - 1)); + m_flit->set_time(curCycle() + (m_net_ptr->getNumPipeStages() - 1)); m_flit->set_vc(outvc); m_router_buffers[outport][outvc]->insert(m_flit); @@ -283,25 +281,18 @@ Router::routeCompute(flit *m_flit, int inport) NetDest destination = nm->getInternalDestination(); if (m_net_ptr->getNumPipeStages() > 1) { - m_out_vc_state[outport][outvc]->setState(VC_AB_, - g_system_ptr->getTime() + 1); - + m_out_vc_state[outport][outvc]->setState(VC_AB_, curCycle() + 1); m_out_link[outport]->request_vc_link(outvc, destination, - g_system_ptr->getTime() + 1); + curCycle() + 1); } else { - m_out_vc_state[outport][outvc]->setState(VC_AB_, - g_system_ptr->getTime()); - + m_out_vc_state[outport][outvc]->setState(VC_AB_, curCycle()); m_out_link[outport]->request_vc_link(outvc, destination, - g_system_ptr->getTime()); + curCycle()); } } if ((m_flit->get_type() == TAIL_) || (m_flit->get_type() == HEAD_TAIL_)) { - m_in_vc_state[inport][invc]->setState(IDLE_, - g_system_ptr->getTime() + 1); - - m_in_link[inport]->release_vc_link(invc, - g_system_ptr->getTime() + 1); + m_in_vc_state[inport][invc]->setState(IDLE_, curCycle() + 1); + m_in_link[inport]->release_vc_link(invc, curCycle() + 1); } } @@ -325,8 +316,7 @@ Router::wakeup() // checking the incoming link if (m_in_link[incoming_port]->isReady()) { - DPRINTF(RubyNetwork, "m_id: %d, Time: %lld\n", - m_id, g_system_ptr->getTime()); + DPRINTF(RubyNetwork, "m_id: %d, Time: %lld\n", m_id, curCycle()); t_flit = m_in_link[incoming_port]->peekLink(); routeCompute(t_flit, incoming_port); m_in_link[incoming_port]->consumeLink(); @@ -360,16 +350,16 @@ Router::scheduleOutputLinks() if (vc_tolookat == m_num_vcs) vc_tolookat = 0; - if (m_router_buffers[port][vc_tolookat]->isReady()) { + if (m_router_buffers[port][vc_tolookat]->isReady(curCycle())) { // models buffer backpressure if (m_out_vc_state[port][vc_tolookat]->isInState(ACTIVE_, - g_system_ptr->getTime()) && + curCycle()) && m_out_link[port]->isBufferNotFull_link(vc_tolookat)) { flit *t_flit = m_router_buffers[port][vc_tolookat]->getTopFlit(); - t_flit->set_time(g_system_ptr->getTime() + 1 ); + t_flit->set_time(curCycle() + 1 ); m_out_src_queue[port]->insert(t_flit); m_out_link[port]->scheduleEvent(1); break; // done for this port @@ -392,7 +382,7 @@ Router::checkReschedule() { for (int port = 0; port < m_out_link.size(); port++) { for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_router_buffers[port][vc]->isReadyForNext()) { + if (m_router_buffers[port][vc]->isReadyForNext(curCycle())) { scheduleEvent(1); return; } @@ -405,9 +395,7 @@ Router::check_arbiter_reschedule() { for (int port = 0; port < m_in_link.size(); port++) { for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_in_vc_state[port][vc]->isInState(VC_AB_, - g_system_ptr->getTime() + 1)) { - + if (m_in_vc_state[port][vc]->isInState(VC_AB_, curCycle() + 1)) { m_vc_arbiter->scheduleEvent(1); return; } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc b/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc index 161625978..6e858199b 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flit.cc @@ -30,12 +30,12 @@ #include "mem/ruby/network/garnet/flexible-pipeline/flit.hh" -flit::flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr) +flit::flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Time curTime) { m_size = size; m_msg_ptr = msg_ptr; - m_enqueue_time = g_system_ptr->getTime(); - m_time = g_system_ptr->getTime(); + m_enqueue_time = curTime; + m_time = curTime; m_id = id; m_vnet = vnet; m_vc = vc; diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh b/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh index 66cd604ab..9e1168409 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flit.hh @@ -40,7 +40,7 @@ class flit { public: - flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr); + flit(int id, int vc, int vnet, int size, MsgPtr msg_ptr, Time curTime); int get_size(); int get_id(); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc index 9446c812a..fd9922af7 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc @@ -51,22 +51,22 @@ flitBuffer::isEmpty() } bool -flitBuffer::isReady() +flitBuffer::isReady(Time curTime) { if (m_buffer.size() != 0 ) { flit *t_flit = m_buffer.front(); - if (t_flit->get_time() <= g_system_ptr->getTime()) + if (t_flit->get_time() <= curTime) return true; } return false; } bool -flitBuffer::isReadyForNext() +flitBuffer::isReadyForNext(Time curTime) { if (m_buffer.size() != 0 ) { flit *t_flit = m_buffer.front(); - if (t_flit->get_time() <= (g_system_ptr->getTime() + 1)) + if (t_flit->get_time() <= (curTime + 1)) return true; } return false; diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh index 3170c6c78..263dcb902 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh @@ -43,8 +43,8 @@ class flitBuffer flitBuffer(); flitBuffer(int maximum_size); - bool isReady(); - bool isReadyForNext(); + bool isReady(Time curTime); + bool isReadyForNext(Time curTime); bool isFull(); bool isEmpty(); void setMaxSize(int maximum); diff --git a/src/mem/ruby/network/orion/NetworkPower.cc b/src/mem/ruby/network/orion/NetworkPower.cc index 9ac0dd815..6d4fc1923 100644 --- a/src/mem/ruby/network/orion/NetworkPower.cc +++ b/src/mem/ruby/network/orion/NetworkPower.cc @@ -39,9 +39,7 @@ Router_d::calculate_power() { //Network Activities from garnet calculate_performance_numbers(); - double sim_cycles; - sim_cycles = - g_system_ptr->getTime() - m_network_ptr->getRubyStartTime(); + double sim_cycles = curCycle() - m_network_ptr->getRubyStartTime(); // Number of virtual networks/message classes declared in Ruby // maybe greater than active virtual networks. @@ -248,7 +246,7 @@ NetworkLink_d::calculate_power() orion_cfg_ptr); double sim_cycles = - (double)(g_system_ptr->getTime() - m_net_ptr->getRubyStartTime()); + (double)(m_net_ptr->curCycle() - m_net_ptr->getRubyStartTime()); // Dynamic Power // Assume half the bits flipped on every link activity diff --git a/src/mem/ruby/slicc_interface/Message.hh b/src/mem/ruby/slicc_interface/Message.hh index 201ec4b60..74b405312 100644 --- a/src/mem/ruby/slicc_interface/Message.hh +++ b/src/mem/ruby/slicc_interface/Message.hh @@ -32,9 +32,8 @@ #include #include "base/refcnt.hh" -#include "mem/ruby/common/Global.hh" #include "mem/ruby/common/TypeDefines.hh" -#include "mem/ruby/system/System.hh" +#include "mem/packet.hh" class Message; typedef RefCountingPtr MsgPtr; @@ -42,9 +41,9 @@ typedef RefCountingPtr MsgPtr; class Message : public RefCounted { public: - Message() - : m_time(g_system_ptr->getTime()), - m_LastEnqueueTime(g_system_ptr->getTime()), + Message(Time curTime) + : m_time(curTime), + m_LastEnqueueTime(curTime), m_DelayedCycles(0) { } diff --git a/src/mem/ruby/slicc_interface/NetworkMessage.hh b/src/mem/ruby/slicc_interface/NetworkMessage.hh index d2bcb1241..e26612e0f 100644 --- a/src/mem/ruby/slicc_interface/NetworkMessage.hh +++ b/src/mem/ruby/slicc_interface/NetworkMessage.hh @@ -36,16 +36,14 @@ #include "mem/ruby/common/NetDest.hh" #include "mem/ruby/slicc_interface/Message.hh" -class Address; - class NetworkMessage; typedef RefCountingPtr NetMsgPtr; class NetworkMessage : public Message { public: - NetworkMessage() - : m_internal_dest_valid(false) + NetworkMessage(Time curTime) + : Message(curTime), m_internal_dest_valid(false) { } NetworkMessage(const NetworkMessage &other) diff --git a/src/mem/ruby/slicc_interface/RubyRequest.hh b/src/mem/ruby/slicc_interface/RubyRequest.hh index a4dadc7a7..37b89dc8f 100644 --- a/src/mem/ruby/slicc_interface/RubyRequest.hh +++ b/src/mem/ruby/slicc_interface/RubyRequest.hh @@ -36,7 +36,6 @@ #include "mem/protocol/RubyAccessMode.hh" #include "mem/protocol/RubyRequestType.hh" #include "mem/ruby/common/Address.hh" -#include "mem/packet.hh" class RubyRequest : public Message { @@ -52,12 +51,12 @@ class RubyRequest : public Message PacketPtr pkt; unsigned m_contextId; - RubyRequest() {} - RubyRequest(uint64_t _paddr, uint8_t* _data, int _len, uint64_t _pc, - RubyRequestType _type, RubyAccessMode _access_mode, - PacketPtr _pkt, PrefetchBit _pb = PrefetchBit_No, - unsigned _proc_id = 100) - : m_PhysicalAddress(_paddr), + RubyRequest(Time curTime, uint64_t _paddr, uint8_t* _data, int _len, + uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode, + PacketPtr _pkt, PrefetchBit _pb = PrefetchBit_No, + unsigned _proc_id = 100) + : Message(curTime), + m_PhysicalAddress(_paddr), m_Type(_type), m_ProgramCounter(_pc), m_AccessMode(_access_mode), @@ -71,10 +70,8 @@ class RubyRequest : public Message m_LineAddress.makeLineAddress(); } - static RubyRequest* - create() + RubyRequest(Time curTime) : Message(curTime) { - return new RubyRequest(); } RubyRequest* diff --git a/src/mem/ruby/slicc_interface/RubySlicc_Util.hh b/src/mem/ruby/slicc_interface/RubySlicc_Util.hh index 06c540db5..178c4cd1e 100644 --- a/src/mem/ruby/slicc_interface/RubySlicc_Util.hh +++ b/src/mem/ruby/slicc_interface/RubySlicc_Util.hh @@ -130,6 +130,11 @@ mod(int val, int mod) return val % mod; } +inline int max_tokens() +{ + return 1024; +} + /** * This function accepts an address, a data block and a packet. If the address * range for the data block contains the address which the packet needs to diff --git a/src/mem/ruby/structures/Prefetcher.hh b/src/mem/ruby/structures/Prefetcher.hh index f64d39f8a..967d96086 100644 --- a/src/mem/ruby/structures/Prefetcher.hh +++ b/src/mem/ruby/structures/Prefetcher.hh @@ -36,9 +36,9 @@ #include "base/statistics.hh" #include "mem/ruby/buffers/MessageBuffer.hh" #include "mem/ruby/common/Address.hh" -#include "mem/ruby/common/Global.hh" #include "mem/ruby/slicc_interface/AbstractController.hh" #include "mem/ruby/slicc_interface/RubyRequest.hh" +#include "mem/ruby/system/System.hh" #include "params/Prefetcher.hh" #include "sim/sim_object.hh" diff --git a/src/mem/ruby/system/DMASequencer.cc b/src/mem/ruby/system/DMASequencer.cc index 84450fda4..fe9ab39be 100644 --- a/src/mem/ruby/system/DMASequencer.cc +++ b/src/mem/ruby/system/DMASequencer.cc @@ -70,7 +70,7 @@ DMASequencer::makeRequest(PacketPtr pkt) active_request.bytes_issued = 0; active_request.pkt = pkt; - SequencerMsg *msg = new SequencerMsg; + SequencerMsg *msg = new SequencerMsg(curCycle()); msg->getPhysicalAddress() = Address(paddr); msg->getLineAddress() = line_address(msg->getPhysicalAddress()); msg->getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD; @@ -108,7 +108,7 @@ DMASequencer::issueNext() return; } - SequencerMsg *msg = new SequencerMsg; + SequencerMsg *msg = new SequencerMsg(curCycle()); msg->getPhysicalAddress() = Address(active_request.start_paddr + active_request.bytes_completed); diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index 9e3fd6864..d57f80468 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -657,7 +657,7 @@ Sequencer::issueRequest(PacketPtr pkt, RubyRequestType secondary_type) pc = pkt->req->getPC(); } - RubyRequest *msg = new RubyRequest(pkt->getAddr(), + RubyRequest *msg = new RubyRequest(curCycle(), pkt->getAddr(), pkt->getPtr(true), pkt->getSize(), pc, secondary_type, RubyAccessMode_Supervisor, pkt, diff --git a/src/mem/ruby/system/WireBuffer.cc b/src/mem/ruby/system/WireBuffer.cc index 0845b3c8d..b5a2849ce 100644 --- a/src/mem/ruby/system/WireBuffer.cc +++ b/src/mem/ruby/system/WireBuffer.cc @@ -34,6 +34,8 @@ #include "base/cprintf.hh" #include "base/stl_helpers.hh" +#include "mem/ruby/common/Global.hh" +#include "mem/ruby/system/System.hh" #include "mem/ruby/system/WireBuffer.hh" using namespace std; diff --git a/src/mem/slicc/ast/EnqueueStatementAST.py b/src/mem/slicc/ast/EnqueueStatementAST.py index b27bff629..a8785c9af 100644 --- a/src/mem/slicc/ast/EnqueueStatementAST.py +++ b/src/mem/slicc/ast/EnqueueStatementAST.py @@ -53,7 +53,8 @@ class EnqueueStatementAST(StatementAST): self.symtab.newSymbol(v) # Declare message - code("${{msg_type.ident}} *out_msg = new ${{msg_type.ident}};") + code("${{msg_type.ident}} *out_msg = \ + new ${{msg_type.ident}}(curCycle());") # The other statements t = self.statements.generate(code, None) diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py index 19c144048..ebf187630 100644 --- a/src/mem/slicc/symbols/Type.py +++ b/src/mem/slicc/symbols/Type.py @@ -226,7 +226,7 @@ class Type(Symbol): #include -#include "mem/ruby/common/Global.hh" +#include "mem/ruby/slicc_interface/RubySlicc_Util.hh" ''') for dm in self.data_members.values(): @@ -242,10 +242,14 @@ class Type(Symbol): $klass ${{self.c_ident}}$parent { public: - ${{self.c_ident}}() - { + ${{self.c_ident}} ''', klass="class") + if self.isMessage: + code('(Time curTime) : %s(curTime) {' % self["interface"]) + else: + code('()\n\t\t{') + code.indent() if not self.isGlobal: code.indent() @@ -284,13 +288,19 @@ $klass ${{self.c_ident}}$parent if not self.isGlobal: params = [ 'const %s& local_%s' % (dm.type.c_ident, dm.ident) \ for dm in self.data_members.itervalues() ] - params = ', '.join(params) + + if self.isMessage: + params = "const Time curTime, " + params + code('${{self.c_ident}}($params)') # Call superclass constructor if "interface" in self: - code(' : ${{self["interface"]}}()') + if self.isMessage: + code(' : ${{self["interface"]}}(curTime)') + else: + code(' : ${{self["interface"]}}()') code('{') code.indent() @@ -302,14 +312,8 @@ $klass ${{self.c_ident}}$parent code.dedent() code('}') - # create a static factory method and a clone member + # create a clone member code(''' -static ${{self.c_ident}}* -create() -{ - return new ${{self.c_ident}}(); -} - ${{self.c_ident}}* clone() const { @@ -419,7 +423,6 @@ operator<<(std::ostream& out, const ${{self.c_ident}}& obj) #include #include "mem/protocol/${{self.c_ident}}.hh" -#include "mem/ruby/slicc_interface/RubySlicc_Util.hh" using namespace std; ''') -- 2.30.2