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