/* HWA CODE END */ // Override this for other algorithms virtual public void Tick() { mem.Tick(); #if PACKETDUMP Console.WriteLine("In sched.tick"); #endif /* HWA CODE Comment Out */ /* * SchedBuf winner = null; */ /* HWA Code Comment Out End */ /* HWA CODE */ winner = null; schedMaskPrepare(); /* HWA CODE END */ for (int i = 0; i < buf.Length; i++) { #if PACKETDUMP Console.WriteLine("buf_valid = {0}, buf_busy = {1}, buf_morecommand = {2}, buf num = {3}", buf[i].Valid, buf[i].moreCommands, buf[i].Busy); #endif // if( buf[i].Valid && buf[i].moreCommands) // { // int req_id = buf[i].mreq.request.requesterID; // int bank_id = buf[i].mreq.bank_index; // Console.WriteLine("SchedBuf{0}/{6}, pid:{1}, bank_id:{4}, pr:{2}, rowhit:{3}, marked:{5},, address={7:X}", i, req_id, 0, buf[i].IsRowBufferHit, bank_id, buf[i].marked, chan.mem_id, buf[i].mreq.request.address); // } if (buf[i].Valid && buf[i].moreCommands && !buf[i].Busy) { bool DBAvailable = buf[i].IsWrite ? (chan.writeRequests < chan.maxWrites) : (chan.readRequests < chan.maxReads); #if PACKETDUMP Console.WriteLine("in scheduler, DB_avail = {0}, at buffer location {1}, iswrite = {2}", DBAvailable, i, buf[i].IsWrite); #endif /* HWA CODE */ // if(DBAvailable && mem.RequestCanIssue(buf[i])) if (DBAvailable && mem.RequestCanIssue(buf[i]) && schedMaskCheck(buf[i])) /* HWA CODE END */ { /* HWA CODE */ SchedBuf winner_bak = winner; /* HWA CODE END */ winner = Pick(winner, buf[i]); /* HWA CODE */ if (winner != null) { if (winner != buf[i]) { buf[i].wait_num++; // if( buf[i].mreq.request.requesterID == 17 ) // Console.WriteLine("WinnerID:{0}", winner.mreq.request.requesterID ); } else if (winner_bak != null) { winner_bak.wait_num++; } } /* HWA CODE END */ } } } // if( winner != null ) // Console.WriteLine("ch:{2}, pid:{0}, bufid:{1}, selected-pre", winner.mreq.request.requesterID, winner.index, chan.mem_id ); if (winner != null) { if (!schedResultMaskChk(winner)) { winner = null; // } } if (winner != null) { // Console.WriteLine("ch:{2}, pid:{0}, bufid:{1}, selected", winner.mreq.request.requesterID, winner.index, chan.mem_id ); if (winner.whenStarted == ulong.MaxValue) { winner.whenStarted = Simulator.CurrentRound; } if (winner.Urgent) { Simulator.stats.DRAMUrgentCommandsPerSrc[winner.mreq.request.requesterID].Add(); } Simulator.stats.DRAMCommandsPerSrc[winner.mreq.request.requesterID].Add(); postMethodForWinner(winner); mem.IssueCommand(winner); if (!winner.moreCommands && winner.marked) { MarkCompleted(winner); } chan.lastBankActivity[winner.mreq.rank_index, winner.mreq.bank_index] = Now; lastIssue = Now; /* HWA CODE */ if (!winner.moreCommands) { if (Simulator.network.nodes[winner.mreq.request.requesterID].cpu.is_HWA()) { chan.HWAUnIssueRequests--; } chan.unIssueRequestsPerCore[winner.mreq.request.requesterID]--; if (!winner.mreq.isWrite) { chan.unIssueReadRequestsPerCore[winner.mreq.request.requesterID]--; } Simulator.QoSCtrl.bw_increment(winner.mreq.request.requesterID, chan.mem_id, chan.id); Simulator.QoSCtrl.mem_req_issue(winner.mreq.request.requesterID, winner.mreq.request.address, chan.mem_id); } /* HWA CODE END */ } }