TimerTable.cc revision 9507
16166Ssteve.reinhardt@amd.com/* 26928SBrad.Beckmann@amd.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 36166Ssteve.reinhardt@amd.com * All rights reserved. 46166Ssteve.reinhardt@amd.com * 56166Ssteve.reinhardt@amd.com * Redistribution and use in source and binary forms, with or without 66166Ssteve.reinhardt@amd.com * modification, are permitted provided that the following conditions are 76166Ssteve.reinhardt@amd.com * met: redistributions of source code must retain the above copyright 86166Ssteve.reinhardt@amd.com * notice, this list of conditions and the following disclaimer; 96166Ssteve.reinhardt@amd.com * redistributions in binary form must reproduce the above copyright 106166Ssteve.reinhardt@amd.com * notice, this list of conditions and the following disclaimer in the 116166Ssteve.reinhardt@amd.com * documentation and/or other materials provided with the distribution; 126166Ssteve.reinhardt@amd.com * neither the name of the copyright holders nor the names of its 136166Ssteve.reinhardt@amd.com * contributors may be used to endorse or promote products derived from 146166Ssteve.reinhardt@amd.com * this software without specific prior written permission. 156166Ssteve.reinhardt@amd.com * 166166Ssteve.reinhardt@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176166Ssteve.reinhardt@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186166Ssteve.reinhardt@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196166Ssteve.reinhardt@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206166Ssteve.reinhardt@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216166Ssteve.reinhardt@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226166Ssteve.reinhardt@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236166Ssteve.reinhardt@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246166Ssteve.reinhardt@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256166Ssteve.reinhardt@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266166Ssteve.reinhardt@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276166Ssteve.reinhardt@amd.com */ 286166Ssteve.reinhardt@amd.com 296166Ssteve.reinhardt@amd.com#include "mem/ruby/common/Global.hh" 306166Ssteve.reinhardt@amd.com#include "mem/ruby/system/System.hh" 316166Ssteve.reinhardt@amd.com#include "mem/ruby/system/TimerTable.hh" 326919SBrad.Beckmann@amd.com 336919SBrad.Beckmann@amd.comTimerTable::TimerTable() 346919SBrad.Beckmann@amd.com : m_next_time(0) 356166Ssteve.reinhardt@amd.com{ 3611670Sandreas.hansson@arm.com m_consumer_ptr = NULL; 376919SBrad.Beckmann@amd.com m_clockobj_ptr = NULL; 3811670Sandreas.hansson@arm.com 3911682Sandreas.hansson@arm.com m_next_valid = false; 406919SBrad.Beckmann@amd.com m_next_address = Address(0); 416919SBrad.Beckmann@amd.com} 428920Snilay@cs.wisc.edu 436919SBrad.Beckmann@amd.combool 447570SBrad.Beckmann@amd.comTimerTable::isReady() const 457570SBrad.Beckmann@amd.com{ 466919SBrad.Beckmann@amd.com if (m_map.empty()) 476919SBrad.Beckmann@amd.com return false; 486166Ssteve.reinhardt@amd.com 497570SBrad.Beckmann@amd.com if (!m_next_valid) { 507570SBrad.Beckmann@amd.com updateNext(); 517570SBrad.Beckmann@amd.com } 527570SBrad.Beckmann@amd.com assert(m_next_valid); 537570SBrad.Beckmann@amd.com return (m_clockobj_ptr->curCycle() >= m_next_time); 547570SBrad.Beckmann@amd.com} 557570SBrad.Beckmann@amd.com 567570SBrad.Beckmann@amd.comconst Address& 577570SBrad.Beckmann@amd.comTimerTable::readyAddress() const 587570SBrad.Beckmann@amd.com{ 597570SBrad.Beckmann@amd.com assert(isReady()); 607570SBrad.Beckmann@amd.com 619841Snilay@cs.wisc.edu if (!m_next_valid) { 627570SBrad.Beckmann@amd.com updateNext(); 636166Ssteve.reinhardt@amd.com } 646166Ssteve.reinhardt@amd.com assert(m_next_valid); 656928SBrad.Beckmann@amd.com return m_next_address; 666928SBrad.Beckmann@amd.com} 6710688Sandreas.hansson@arm.com 688436SBrad.Beckmann@amd.comvoid 6913718Sandreas.sandberg@arm.comTimerTable::set(const Address& address, Cycles relative_latency) 706166Ssteve.reinhardt@amd.com{ 716919SBrad.Beckmann@amd.com assert(address == line_address(address)); 726919SBrad.Beckmann@amd.com assert(relative_latency > 0); 7311320Ssteve.reinhardt@amd.com assert(!m_map.count(address)); 746919SBrad.Beckmann@amd.com 7510688Sandreas.hansson@arm.com Cycles ready_time = m_clockobj_ptr->curCycle() + relative_latency; 769827Sakash.bagdia@arm.com m_map[address] = ready_time; 779827Sakash.bagdia@arm.com assert(m_consumer_ptr != NULL); 789827Sakash.bagdia@arm.com m_consumer_ptr->scheduleEventAbsolute(ready_time); 799827Sakash.bagdia@arm.com m_next_valid = false; 809793Sakash.bagdia@arm.com 819793Sakash.bagdia@arm.com // Don't always recalculate the next ready address 829793Sakash.bagdia@arm.com if (ready_time <= m_next_time) { 839827Sakash.bagdia@arm.com m_next_valid = false; 849827Sakash.bagdia@arm.com } 859793Sakash.bagdia@arm.com} 869793Sakash.bagdia@arm.com 879793Sakash.bagdia@arm.comvoid 889793Sakash.bagdia@arm.comTimerTable::unset(const Address& address) 896289Snate@binkert.org{ 909826Sandreas.hansson@arm.com assert(address == line_address(address)); 919826Sandreas.hansson@arm.com assert(m_map.count(address)); 9210519Snilay@cs.wisc.edu m_map.erase(address); 936166Ssteve.reinhardt@amd.com 949793Sakash.bagdia@arm.com // Don't always recalculate the next ready address 959827Sakash.bagdia@arm.com if (address == m_next_address) { 969827Sakash.bagdia@arm.com m_next_valid = false; 979793Sakash.bagdia@arm.com } 9810120Snilay@cs.wisc.edu} 996166Ssteve.reinhardt@amd.com 10010120Snilay@cs.wisc.eduvoid 1016919SBrad.Beckmann@amd.comTimerTable::print(std::ostream& out) const 10210688Sandreas.hansson@arm.com{ 1036919SBrad.Beckmann@amd.com} 1046919SBrad.Beckmann@amd.com 10510688Sandreas.hansson@arm.comvoid 10610688Sandreas.hansson@arm.comTimerTable::updateNext() const 1077938SBrad.Beckmann@amd.com{ 1087938SBrad.Beckmann@amd.com if (m_map.empty()) { 1097938SBrad.Beckmann@amd.com assert(!m_next_valid); 1107938SBrad.Beckmann@amd.com return; 1117938SBrad.Beckmann@amd.com } 1126166Ssteve.reinhardt@amd.com 1136166Ssteve.reinhardt@amd.com AddressMap::const_iterator i = m_map.begin(); 1146166Ssteve.reinhardt@amd.com AddressMap::const_iterator end = m_map.end(); 1156166Ssteve.reinhardt@amd.com 1166166Ssteve.reinhardt@amd.com m_next_address = i->first; 1178801Sgblack@eecs.umich.edu m_next_time = i->second; 1186166Ssteve.reinhardt@amd.com ++i; 119 120 for (; i != end; ++i) { 121 if (i->second < m_next_time) { 122 m_next_address = i->first; 123 m_next_time = i->second; 124 } 125 } 126 127 m_next_valid = true; 128} 129