summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc')
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc30
1 files changed, 20 insertions, 10 deletions
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;
}