TimerTable.cc revision 11108
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1411308Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com * 1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711308Santhony.gutierrez@amd.com */ 2811308Santhony.gutierrez@amd.com 2911308Santhony.gutierrez@amd.com#include "mem/ruby/structures/TimerTable.hh" 3011308Santhony.gutierrez@amd.com 3111308Santhony.gutierrez@amd.com#include "mem/ruby/system/RubySystem.hh" 3211308Santhony.gutierrez@amd.com 3311308Santhony.gutierrez@amd.comTimerTable::TimerTable() 3411308Santhony.gutierrez@amd.com : m_next_time(0) 3511308Santhony.gutierrez@amd.com{ 3611308Santhony.gutierrez@amd.com m_consumer_ptr = NULL; 3711308Santhony.gutierrez@amd.com m_clockobj_ptr = NULL; 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com m_next_valid = false; 4011308Santhony.gutierrez@amd.com m_next_address = 0; 4111308Santhony.gutierrez@amd.com} 4211308Santhony.gutierrez@amd.com 4311308Santhony.gutierrez@amd.combool 4411308Santhony.gutierrez@amd.comTimerTable::isReady() const 4511308Santhony.gutierrez@amd.com{ 4611308Santhony.gutierrez@amd.com if (m_map.empty()) 4711308Santhony.gutierrez@amd.com return false; 4811308Santhony.gutierrez@amd.com 4911308Santhony.gutierrez@amd.com if (!m_next_valid) { 5011308Santhony.gutierrez@amd.com updateNext(); 5111308Santhony.gutierrez@amd.com } 5211308Santhony.gutierrez@amd.com assert(m_next_valid); 5311308Santhony.gutierrez@amd.com return (m_clockobj_ptr->curCycle() >= m_next_time); 5411347Sandreas.hansson@arm.com} 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.comAddr 5711308Santhony.gutierrez@amd.comTimerTable::readyAddress() const 5811308Santhony.gutierrez@amd.com{ 5911308Santhony.gutierrez@amd.com assert(isReady()); 6011308Santhony.gutierrez@amd.com 6111308Santhony.gutierrez@amd.com if (!m_next_valid) { 6211692Santhony.gutierrez@amd.com updateNext(); 6311692Santhony.gutierrez@amd.com } 6411308Santhony.gutierrez@amd.com assert(m_next_valid); 6511308Santhony.gutierrez@amd.com return m_next_address; 6611308Santhony.gutierrez@amd.com} 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.comvoid 6911308Santhony.gutierrez@amd.comTimerTable::set(Addr address, Cycles relative_latency) 7011308Santhony.gutierrez@amd.com{ 7111347Sandreas.hansson@arm.com assert(address == makeLineAddress(address)); 7211308Santhony.gutierrez@amd.com assert(relative_latency > 0); 7311308Santhony.gutierrez@amd.com assert(!m_map.count(address)); 7411308Santhony.gutierrez@amd.com 7511347Sandreas.hansson@arm.com Cycles ready_time = m_clockobj_ptr->curCycle() + relative_latency; 7611308Santhony.gutierrez@amd.com m_map[address] = ready_time; 7711308Santhony.gutierrez@amd.com assert(m_consumer_ptr != NULL); 7811308Santhony.gutierrez@amd.com m_consumer_ptr-> 7911347Sandreas.hansson@arm.com scheduleEventAbsolute(m_clockobj_ptr->clockPeriod() * ready_time); 8011308Santhony.gutierrez@amd.com m_next_valid = false; 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com // Don't always recalculate the next ready address 8311308Santhony.gutierrez@amd.com if (ready_time <= m_next_time) { 8411347Sandreas.hansson@arm.com m_next_valid = false; 8511308Santhony.gutierrez@amd.com } 8611308Santhony.gutierrez@amd.com} 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.comvoid 8911347Sandreas.hansson@arm.comTimerTable::unset(Addr address) 9011308Santhony.gutierrez@amd.com{ 9111308Santhony.gutierrez@amd.com assert(address == makeLineAddress(address)); 9211308Santhony.gutierrez@amd.com assert(m_map.count(address)); 9311347Sandreas.hansson@arm.com m_map.erase(address); 9411308Santhony.gutierrez@amd.com 9511308Santhony.gutierrez@amd.com // Don't always recalculate the next ready address 9611308Santhony.gutierrez@amd.com if (address == m_next_address) { 9711308Santhony.gutierrez@amd.com m_next_valid = false; 9811347Sandreas.hansson@arm.com } 9911308Santhony.gutierrez@amd.com} 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.comvoid 10211308Santhony.gutierrez@amd.comTimerTable::print(std::ostream& out) const 10311347Sandreas.hansson@arm.com{ 10411308Santhony.gutierrez@amd.com} 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.comvoid 10711347Sandreas.hansson@arm.comTimerTable::updateNext() const 10811308Santhony.gutierrez@amd.com{ 10911308Santhony.gutierrez@amd.com if (m_map.empty()) { 11011308Santhony.gutierrez@amd.com assert(!m_next_valid); 11111308Santhony.gutierrez@amd.com return; 11211308Santhony.gutierrez@amd.com } 11311308Santhony.gutierrez@amd.com 11411308Santhony.gutierrez@amd.com AddressMap::const_iterator i = m_map.begin(); 11511308Santhony.gutierrez@amd.com AddressMap::const_iterator end = m_map.end(); 11611308Santhony.gutierrez@amd.com 11711308Santhony.gutierrez@amd.com m_next_address = i->first; 11811308Santhony.gutierrez@amd.com m_next_time = i->second; 11911308Santhony.gutierrez@amd.com ++i; 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com for (; i != end; ++i) { 12211308Santhony.gutierrez@amd.com if (i->second < m_next_time) { 12311308Santhony.gutierrez@amd.com m_next_address = i->first; 12411308Santhony.gutierrez@amd.com m_next_time = i->second; 12511308Santhony.gutierrez@amd.com } 12611308Santhony.gutierrez@amd.com } 12711308Santhony.gutierrez@amd.com 12811308Santhony.gutierrez@amd.com m_next_valid = true; 12911308Santhony.gutierrez@amd.com} 13011308Santhony.gutierrez@amd.com