TimerTable.cc revision 11111
12632Sstever@eecs.umich.edu/* 22632Sstever@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 32632Sstever@eecs.umich.edu * All rights reserved. 42632Sstever@eecs.umich.edu * 52632Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 62632Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are 72632Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright 82632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 92632Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 102632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 112632Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution; 122632Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its 132632Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from 142632Sstever@eecs.umich.edu * this software without specific prior written permission. 152632Sstever@eecs.umich.edu * 162632Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172632Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182632Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192632Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202632Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212632Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222632Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232632Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242632Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252632Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262632Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272632Sstever@eecs.umich.edu */ 282632Sstever@eecs.umich.edu 292632Sstever@eecs.umich.edu#include "mem/ruby/structures/TimerTable.hh" 302632Sstever@eecs.umich.edu 3112SN/A#include "mem/ruby/system/RubySystem.hh" 3212SN/A 3312SN/ATimerTable::TimerTable() 3412SN/A : m_next_time(0) 3512SN/A{ 3612SN/A m_consumer_ptr = NULL; 3712SN/A m_next_valid = false; 3812SN/A m_next_address = 0; 3912SN/A} 4012SN/A 4112SN/Abool 4212SN/ATimerTable::isReady(Tick curTime) const 4312SN/A{ 4412SN/A if (m_map.empty()) 4512SN/A return false; 4612SN/A 4712SN/A if (!m_next_valid) { 4812SN/A updateNext(); 4912SN/A } 5012SN/A assert(m_next_valid); 5112SN/A return (curTime >= m_next_time); 5212SN/A} 5312SN/A 5412SN/AAddr 5512SN/ATimerTable::nextAddress() const 5612SN/A{ 5712SN/A if (!m_next_valid) { 5812SN/A updateNext(); 5912SN/A } 6012SN/A assert(m_next_valid); 6112SN/A return m_next_address; 625543Ssaidi@eecs.umich.edu} 635543Ssaidi@eecs.umich.edu 645543Ssaidi@eecs.umich.eduvoid 655543Ssaidi@eecs.umich.eduTimerTable::set(Addr address, Tick ready_time) 6612SN/A{ 6712SN/A assert(address == makeLineAddress(address)); 685543Ssaidi@eecs.umich.edu assert(!m_map.count(address)); 6912SN/A 705543Ssaidi@eecs.umich.edu m_map[address] = ready_time; 7112SN/A assert(m_consumer_ptr != NULL); 7212SN/A m_consumer_ptr->scheduleEventAbsolute(ready_time); 735543Ssaidi@eecs.umich.edu m_next_valid = false; 745543Ssaidi@eecs.umich.edu 755543Ssaidi@eecs.umich.edu // Don't always recalculate the next ready address 765543Ssaidi@eecs.umich.edu if (ready_time <= m_next_time) { 775543Ssaidi@eecs.umich.edu m_next_valid = false; 785543Ssaidi@eecs.umich.edu } 795543Ssaidi@eecs.umich.edu} 805543Ssaidi@eecs.umich.edu 815543Ssaidi@eecs.umich.eduvoid 825543Ssaidi@eecs.umich.eduTimerTable::unset(Addr address) 835543Ssaidi@eecs.umich.edu{ 845543Ssaidi@eecs.umich.edu assert(address == makeLineAddress(address)); 855543Ssaidi@eecs.umich.edu assert(m_map.count(address)); 8612SN/A m_map.erase(address); 8712SN/A 8812SN/A // Don't always recalculate the next ready address 8912SN/A if (address == m_next_address) { 9012SN/A m_next_valid = false; 9112SN/A } 9212SN/A} 935543Ssaidi@eecs.umich.edu 945543Ssaidi@eecs.umich.eduvoid 955543Ssaidi@eecs.umich.eduTimerTable::print(std::ostream& out) const 965543Ssaidi@eecs.umich.edu{ 975543Ssaidi@eecs.umich.edu} 985543Ssaidi@eecs.umich.edu 995543Ssaidi@eecs.umich.eduvoid 1005543Ssaidi@eecs.umich.eduTimerTable::updateNext() const 1015543Ssaidi@eecs.umich.edu{ 1025543Ssaidi@eecs.umich.edu if (m_map.empty()) { 1035543Ssaidi@eecs.umich.edu assert(!m_next_valid); 1045543Ssaidi@eecs.umich.edu return; 1055543Ssaidi@eecs.umich.edu } 1065543Ssaidi@eecs.umich.edu 1075543Ssaidi@eecs.umich.edu AddressMap::const_iterator i = m_map.begin(); 1085543Ssaidi@eecs.umich.edu AddressMap::const_iterator end = m_map.end(); 1095543Ssaidi@eecs.umich.edu 1105543Ssaidi@eecs.umich.edu m_next_address = i->first; 1115543Ssaidi@eecs.umich.edu m_next_time = i->second; 1125543Ssaidi@eecs.umich.edu ++i; 1135543Ssaidi@eecs.umich.edu 1145543Ssaidi@eecs.umich.edu for (; i != end; ++i) { 1155543Ssaidi@eecs.umich.edu if (i->second < m_next_time) { 1165543Ssaidi@eecs.umich.edu m_next_address = i->first; 1175543Ssaidi@eecs.umich.edu m_next_time = i->second; 11812SN/A } 11912SN/A } 12012SN/A 1215543Ssaidi@eecs.umich.edu m_next_valid = true; 1225543Ssaidi@eecs.umich.edu} 12312SN/A