TimerTable.cc revision 9507
17934SN/A/* 27934SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 311754Sandreas.hansson@arm.com * All rights reserved. 411754Sandreas.hansson@arm.com * 511754Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 67934SN/A * modification, are permitted provided that the following conditions are 711754Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811754Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911754Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011754Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111754Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211754Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311754Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1410036SAli.Saidi@ARM.com * this software without specific prior written permission. 1510036SAli.Saidi@ARM.com * 1611754Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710513SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810513SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910892Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011754Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110535Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211754Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310892Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410892Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511606Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610535Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711606Sandreas.sandberg@arm.com */ 2810513SAli.Saidi@ARM.com 2910513SAli.Saidi@ARM.com#include "mem/ruby/common/Global.hh" 3010892Sandreas.hansson@arm.com#include "mem/ruby/system/System.hh" 3111754Sandreas.hansson@arm.com#include "mem/ruby/system/TimerTable.hh" 3210535Sandreas.hansson@arm.com 3311754Sandreas.hansson@arm.comTimerTable::TimerTable() 3411606Sandreas.sandberg@arm.com : m_next_time(0) 3510535Sandreas.hansson@arm.com{ 3611606Sandreas.sandberg@arm.com m_consumer_ptr = NULL; 3710513SAli.Saidi@ARM.com m_clockobj_ptr = NULL; 3810513SAli.Saidi@ARM.com 3911336Sandreas.hansson@arm.com m_next_valid = false; 4011754Sandreas.hansson@arm.com m_next_address = Address(0); 4110535Sandreas.hansson@arm.com} 4211754Sandreas.hansson@arm.com 4311336Sandreas.hansson@arm.combool 4411336Sandreas.hansson@arm.comTimerTable::isReady() const 4511754Sandreas.hansson@arm.com{ 4610535Sandreas.hansson@arm.com if (m_map.empty()) 4711754Sandreas.hansson@arm.com return false; 4811754Sandreas.hansson@arm.com 4910513SAli.Saidi@ARM.com if (!m_next_valid) { 5010513SAli.Saidi@ARM.com updateNext(); 5111336Sandreas.hansson@arm.com } 5211754Sandreas.hansson@arm.com assert(m_next_valid); 5310585Sandreas.hansson@arm.com return (m_clockobj_ptr->curCycle() >= m_next_time); 5411754Sandreas.hansson@arm.com} 5511754Sandreas.hansson@arm.com 5610517SAli.Saidi@ARM.comconst Address& 5710517SAli.Saidi@ARM.comTimerTable::readyAddress() const 5810517SAli.Saidi@ARM.com{ 5910517SAli.Saidi@ARM.com assert(isReady()); 6010517SAli.Saidi@ARM.com 6110517SAli.Saidi@ARM.com if (!m_next_valid) { 6210517SAli.Saidi@ARM.com updateNext(); 6310517SAli.Saidi@ARM.com } 6410517SAli.Saidi@ARM.com assert(m_next_valid); 6510517SAli.Saidi@ARM.com return m_next_address; 6610517SAli.Saidi@ARM.com} 6710517SAli.Saidi@ARM.com 6811754Sandreas.hansson@arm.comvoid 6911754Sandreas.hansson@arm.comTimerTable::set(const Address& address, Cycles relative_latency) 7011754Sandreas.hansson@arm.com{ 7110535Sandreas.hansson@arm.com assert(address == line_address(address)); 7210535Sandreas.hansson@arm.com assert(relative_latency > 0); 7310535Sandreas.hansson@arm.com assert(!m_map.count(address)); 7410535Sandreas.hansson@arm.com 7510535Sandreas.hansson@arm.com Cycles ready_time = m_clockobj_ptr->curCycle() + relative_latency; 7610535Sandreas.hansson@arm.com m_map[address] = ready_time; 7710535Sandreas.hansson@arm.com assert(m_consumer_ptr != NULL); 7811754Sandreas.hansson@arm.com m_consumer_ptr->scheduleEventAbsolute(ready_time); 7910628Sandreas.hansson@arm.com m_next_valid = false; 8010628Sandreas.hansson@arm.com 8110628Sandreas.hansson@arm.com // Don't always recalculate the next ready address 8210628Sandreas.hansson@arm.com if (ready_time <= m_next_time) { 8310628Sandreas.hansson@arm.com m_next_valid = false; 8410628Sandreas.hansson@arm.com } 8510628Sandreas.hansson@arm.com} 8610628Sandreas.hansson@arm.com 8710535Sandreas.hansson@arm.comvoid 8810535Sandreas.hansson@arm.comTimerTable::unset(const Address& address) 8910535Sandreas.hansson@arm.com{ 9010535Sandreas.hansson@arm.com assert(address == line_address(address)); 9110535Sandreas.hansson@arm.com assert(m_map.count(address)); 9210535Sandreas.hansson@arm.com m_map.erase(address); 9310535Sandreas.hansson@arm.com 9410535Sandreas.hansson@arm.com // Don't always recalculate the next ready address 9510535Sandreas.hansson@arm.com if (address == m_next_address) { 9610535Sandreas.hansson@arm.com m_next_valid = false; 9710535Sandreas.hansson@arm.com } 9810535Sandreas.hansson@arm.com} 9910535Sandreas.hansson@arm.com 10010535Sandreas.hansson@arm.comvoid 10110535Sandreas.hansson@arm.comTimerTable::print(std::ostream& out) const 10210535Sandreas.hansson@arm.com{ 10310535Sandreas.hansson@arm.com} 10410535Sandreas.hansson@arm.com 10510535Sandreas.hansson@arm.comvoid 10610535Sandreas.hansson@arm.comTimerTable::updateNext() const 10710535Sandreas.hansson@arm.com{ 10811754Sandreas.hansson@arm.com if (m_map.empty()) { 10911336Sandreas.hansson@arm.com assert(!m_next_valid); 11011336Sandreas.hansson@arm.com return; 11111336Sandreas.hansson@arm.com } 11211336Sandreas.hansson@arm.com 11311336Sandreas.hansson@arm.com AddressMap::const_iterator i = m_map.begin(); 11410628Sandreas.hansson@arm.com AddressMap::const_iterator end = m_map.end(); 11510628Sandreas.hansson@arm.com 11610628Sandreas.hansson@arm.com m_next_address = i->first; 11711336Sandreas.hansson@arm.com m_next_time = i->second; 11810628Sandreas.hansson@arm.com ++i; 11911336Sandreas.hansson@arm.com 12011336Sandreas.hansson@arm.com for (; i != end; ++i) { 12110628Sandreas.hansson@arm.com if (i->second < m_next_time) { 12211336Sandreas.hansson@arm.com m_next_address = i->first; 12311336Sandreas.hansson@arm.com m_next_time = i->second; 12410628Sandreas.hansson@arm.com } 12511336Sandreas.hansson@arm.com } 12611336Sandreas.hansson@arm.com 12710535Sandreas.hansson@arm.com m_next_valid = true; 12810535Sandreas.hansson@arm.com} 12911754Sandreas.hansson@arm.com