TimerTable.cc revision 7055
12391SN/A/* 28931Sandreas.hansson@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 37733SN/A * All rights reserved. 47733SN/A * 57733SN/A * Redistribution and use in source and binary forms, with or without 67733SN/A * modification, are permitted provided that the following conditions are 77733SN/A * met: redistributions of source code must retain the above copyright 87733SN/A * notice, this list of conditions and the following disclaimer; 97733SN/A * redistributions in binary form must reproduce the above copyright 107733SN/A * notice, this list of conditions and the following disclaimer in the 117733SN/A * documentation and/or other materials provided with the distribution; 127733SN/A * neither the name of the copyright holders nor the names of its 137733SN/A * contributors may be used to endorse or promote products derived from 142391SN/A * this software without specific prior written permission. 152391SN/A * 162391SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172391SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182391SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192391SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202391SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212391SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222391SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232391SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242391SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252391SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262391SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272391SN/A */ 282391SN/A 292391SN/A#include "mem/ruby/common/Global.hh" 302391SN/A#include "mem/ruby/eventqueue/RubyEventQueue.hh" 312391SN/A#include "mem/ruby/system/TimerTable.hh" 322391SN/A 332391SN/ATimerTable::TimerTable() 342391SN/A{ 352391SN/A m_consumer_ptr = NULL; 362391SN/A m_next_valid = false; 372391SN/A m_next_address = Address(0); 382391SN/A m_next_time = 0; 392665SN/A} 402665SN/A 412914SN/Abool 428931Sandreas.hansson@arm.comTimerTable::isReady() const 432391SN/A{ 442391SN/A if (m_map.size() == 0) { 4511793Sbrandon.potter@amd.com return false; 4611793Sbrandon.potter@amd.com } 4710466Sandreas.hansson@arm.com 4810466Sandreas.hansson@arm.com if (!m_next_valid) { 4910102Sali.saidi@arm.com updateNext(); 5010102Sali.saidi@arm.com } 518232SN/A assert(m_next_valid); 528232SN/A return (g_eventQueue_ptr->getTime() >= m_next_time); 533879SN/A} 549053Sdam.sunwoo@arm.com 552394SN/Aconst Address& 562391SN/ATimerTable::readyAddress() const 572391SN/A{ 588931Sandreas.hansson@arm.com assert(isReady()); 598931Sandreas.hansson@arm.com 609053Sdam.sunwoo@arm.com if (!m_next_valid) { 6111614Sdavid.j.hashe@gmail.com updateNext(); 622391SN/A } 6310466Sandreas.hansson@arm.com assert(m_next_valid); 6410466Sandreas.hansson@arm.com return m_next_address; 6510466Sandreas.hansson@arm.com} 6610466Sandreas.hansson@arm.com 6710466Sandreas.hansson@arm.comvoid 6810466Sandreas.hansson@arm.comTimerTable::set(const Address& address, Time relative_latency) 6910466Sandreas.hansson@arm.com{ 7010466Sandreas.hansson@arm.com assert(address == line_address(address)); 712391SN/A assert(relative_latency > 0); 722391SN/A assert(m_map.exist(address) == false); 732391SN/A Time ready_time = g_eventQueue_ptr->getTime() + relative_latency; 749293Sandreas.hansson@arm.com m_map.add(address, ready_time); 759293Sandreas.hansson@arm.com assert(m_consumer_ptr != NULL); 762391SN/A g_eventQueue_ptr->scheduleEventAbsolute(m_consumer_ptr, ready_time); 779293Sandreas.hansson@arm.com m_next_valid = false; 782391SN/A 792391SN/A // Don't always recalculate the next ready address 808719SN/A if (ready_time <= m_next_time) { 818931Sandreas.hansson@arm.com m_next_valid = false; 828719SN/A } 8311522Sstephan.diestelhorst@arm.com} 8411522Sstephan.diestelhorst@arm.com 858719SN/Avoid 868719SN/ATimerTable::unset(const Address& address) 879053Sdam.sunwoo@arm.com{ 889053Sdam.sunwoo@arm.com assert(address == line_address(address)); 898719SN/A assert(m_map.exist(address) == true); 909053Sdam.sunwoo@arm.com m_map.remove(address); 918719SN/A 928719SN/A // Don't always recalculate the next ready address 939053Sdam.sunwoo@arm.com if (address == m_next_address) { 948719SN/A m_next_valid = false; 959053Sdam.sunwoo@arm.com } 969053Sdam.sunwoo@arm.com} 979053Sdam.sunwoo@arm.com 988719SN/Avoid 999053Sdam.sunwoo@arm.comTimerTable::print(std::ostream& out) const 1008719SN/A{ 1018719SN/A} 1029053Sdam.sunwoo@arm.com 1038719SN/Avoid 1049053Sdam.sunwoo@arm.comTimerTable::updateNext() const 1059053Sdam.sunwoo@arm.com{ 1069053Sdam.sunwoo@arm.com if (m_map.size() == 0) { 1078719SN/A assert(m_next_valid == false); 1089053Sdam.sunwoo@arm.com return; 1098719SN/A } 1108719SN/A 1119053Sdam.sunwoo@arm.com Vector<Address> addresses = m_map.keys(); 1128719SN/A m_next_address = addresses[0]; 1139053Sdam.sunwoo@arm.com m_next_time = m_map.lookup(m_next_address); 1149053Sdam.sunwoo@arm.com 1159053Sdam.sunwoo@arm.com // Search for the minimum time 1168719SN/A int size = addresses.size(); 1179053Sdam.sunwoo@arm.com for (int i=1; i<size; i++) { 1188719SN/A Address maybe_next_address = addresses[i]; 1198719SN/A Time maybe_next_time = m_map.lookup(maybe_next_address); 1209053Sdam.sunwoo@arm.com if (maybe_next_time < m_next_time) { 1218719SN/A m_next_time = maybe_next_time; 1229053Sdam.sunwoo@arm.com m_next_address= maybe_next_address; 1239053Sdam.sunwoo@arm.com } 1249053Sdam.sunwoo@arm.com } 1258719SN/A m_next_valid = true; 1269053Sdam.sunwoo@arm.com} 1278719SN/A