scheduler.hh revision 12953
112953Sgabeblack@google.com/* 212953Sgabeblack@google.com * Copyright 2018 Google, Inc. 312953Sgabeblack@google.com * 412953Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 512953Sgabeblack@google.com * modification, are permitted provided that the following conditions are 612953Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 712953Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 812953Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 912953Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1012953Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1112953Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1212953Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1312953Sgabeblack@google.com * this software without specific prior written permission. 1412953Sgabeblack@google.com * 1512953Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612953Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712953Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812953Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912953Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012953Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112953Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212953Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312953Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412953Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512953Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612953Sgabeblack@google.com * 2712953Sgabeblack@google.com * Authors: Gabe Black 2812953Sgabeblack@google.com */ 2912953Sgabeblack@google.com 3012953Sgabeblack@google.com#ifndef __SYSTEMC_CORE_SCHEDULER_HH__ 3112953Sgabeblack@google.com#define __SYSTEMC_CORE_SCHEDULER_HH__ 3212953Sgabeblack@google.com 3312953Sgabeblack@google.com#include "systemc/core/list.hh" 3412953Sgabeblack@google.com#include "systemc/core/process.hh" 3512953Sgabeblack@google.com 3612953Sgabeblack@google.comnamespace sc_gem5 3712953Sgabeblack@google.com{ 3812953Sgabeblack@google.com 3912953Sgabeblack@google.comtypedef NodeList<Process> ProcessList; 4012953Sgabeblack@google.com 4112953Sgabeblack@google.comclass Scheduler 4212953Sgabeblack@google.com{ 4312953Sgabeblack@google.com public: 4412953Sgabeblack@google.com Scheduler(); 4512953Sgabeblack@google.com 4612953Sgabeblack@google.com uint64_t numCycles() { return _numCycles; } 4712953Sgabeblack@google.com Process *current() { return _current; } 4812953Sgabeblack@google.com 4912953Sgabeblack@google.com // Run the initialization phase. 5012953Sgabeblack@google.com void initialize(); 5112953Sgabeblack@google.com 5212953Sgabeblack@google.com // Run delta cycles until time needs to advance. 5312953Sgabeblack@google.com void runCycles(); 5412953Sgabeblack@google.com 5512953Sgabeblack@google.com // Put a process on the list of processes to be initialized. 5612953Sgabeblack@google.com void init(Process *p) { initList.pushLast(p); } 5712953Sgabeblack@google.com 5812953Sgabeblack@google.com // Run the next process, if there is one. 5912953Sgabeblack@google.com void yield(); 6012953Sgabeblack@google.com 6112953Sgabeblack@google.com // Put a process on the ready list. 6212953Sgabeblack@google.com void 6312953Sgabeblack@google.com ready(Process *p) 6412953Sgabeblack@google.com { 6512953Sgabeblack@google.com // Clump methods together to minimize context switching. 6612953Sgabeblack@google.com if (p->procKind() == ::sc_core::SC_METHOD_PROC_) 6712953Sgabeblack@google.com readyList.pushFirst(p); 6812953Sgabeblack@google.com else 6912953Sgabeblack@google.com readyList.pushLast(p); 7012953Sgabeblack@google.com } 7112953Sgabeblack@google.com 7212953Sgabeblack@google.com // Run the given process immediately, preempting whatever may be running. 7312953Sgabeblack@google.com void 7412953Sgabeblack@google.com runNow(Process *p) 7512953Sgabeblack@google.com { 7612953Sgabeblack@google.com // If a process is running, schedule it/us to run again. 7712953Sgabeblack@google.com if (_current) 7812953Sgabeblack@google.com readyList.pushFirst(_current); 7912953Sgabeblack@google.com // Schedule p to run first. 8012953Sgabeblack@google.com readyList.pushFirst(p); 8112953Sgabeblack@google.com yield(); 8212953Sgabeblack@google.com } 8312953Sgabeblack@google.com 8412953Sgabeblack@google.com private: 8512953Sgabeblack@google.com uint64_t _numCycles; 8612953Sgabeblack@google.com 8712953Sgabeblack@google.com Process *_current; 8812953Sgabeblack@google.com 8912953Sgabeblack@google.com ProcessList initList; 9012953Sgabeblack@google.com ProcessList readyList; 9112953Sgabeblack@google.com 9212953Sgabeblack@google.com void evaluate(); 9312953Sgabeblack@google.com void update(); 9412953Sgabeblack@google.com void delta(); 9512953Sgabeblack@google.com}; 9612953Sgabeblack@google.com 9712953Sgabeblack@google.comextern Scheduler scheduler; 9812953Sgabeblack@google.com 9912953Sgabeblack@google.com} // namespace sc_gem5 10012953Sgabeblack@google.com 10112953Sgabeblack@google.com#endif // __SYSTEMC_CORE_SCHEDULER_H__ 102