Example #1
0
File: Sched.cs Project: hirous/test
        /* 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 */
            }
        }