TimerTable.cc revision 11111
12632Sstever@eecs.umich.edu/*
22632Sstever@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
32632Sstever@eecs.umich.edu * All rights reserved.
42632Sstever@eecs.umich.edu *
52632Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62632Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
72632Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92632Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112632Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122632Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132632Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142632Sstever@eecs.umich.edu * this software without specific prior written permission.
152632Sstever@eecs.umich.edu *
162632Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172632Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182632Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192632Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202632Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212632Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222632Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232632Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242632Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252632Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262632Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272632Sstever@eecs.umich.edu */
282632Sstever@eecs.umich.edu
292632Sstever@eecs.umich.edu#include "mem/ruby/structures/TimerTable.hh"
302632Sstever@eecs.umich.edu
3112SN/A#include "mem/ruby/system/RubySystem.hh"
3212SN/A
3312SN/ATimerTable::TimerTable()
3412SN/A    : m_next_time(0)
3512SN/A{
3612SN/A    m_consumer_ptr  = NULL;
3712SN/A    m_next_valid = false;
3812SN/A    m_next_address = 0;
3912SN/A}
4012SN/A
4112SN/Abool
4212SN/ATimerTable::isReady(Tick curTime) const
4312SN/A{
4412SN/A    if (m_map.empty())
4512SN/A        return false;
4612SN/A
4712SN/A    if (!m_next_valid) {
4812SN/A        updateNext();
4912SN/A    }
5012SN/A    assert(m_next_valid);
5112SN/A    return (curTime >= m_next_time);
5212SN/A}
5312SN/A
5412SN/AAddr
5512SN/ATimerTable::nextAddress() const
5612SN/A{
5712SN/A    if (!m_next_valid) {
5812SN/A        updateNext();
5912SN/A    }
6012SN/A    assert(m_next_valid);
6112SN/A    return m_next_address;
625543Ssaidi@eecs.umich.edu}
635543Ssaidi@eecs.umich.edu
645543Ssaidi@eecs.umich.eduvoid
655543Ssaidi@eecs.umich.eduTimerTable::set(Addr address, Tick ready_time)
6612SN/A{
6712SN/A    assert(address == makeLineAddress(address));
685543Ssaidi@eecs.umich.edu    assert(!m_map.count(address));
6912SN/A
705543Ssaidi@eecs.umich.edu    m_map[address] = ready_time;
7112SN/A    assert(m_consumer_ptr != NULL);
7212SN/A    m_consumer_ptr->scheduleEventAbsolute(ready_time);
735543Ssaidi@eecs.umich.edu    m_next_valid = false;
745543Ssaidi@eecs.umich.edu
755543Ssaidi@eecs.umich.edu    // Don't always recalculate the next ready address
765543Ssaidi@eecs.umich.edu    if (ready_time <= m_next_time) {
775543Ssaidi@eecs.umich.edu        m_next_valid = false;
785543Ssaidi@eecs.umich.edu    }
795543Ssaidi@eecs.umich.edu}
805543Ssaidi@eecs.umich.edu
815543Ssaidi@eecs.umich.eduvoid
825543Ssaidi@eecs.umich.eduTimerTable::unset(Addr address)
835543Ssaidi@eecs.umich.edu{
845543Ssaidi@eecs.umich.edu    assert(address == makeLineAddress(address));
855543Ssaidi@eecs.umich.edu    assert(m_map.count(address));
8612SN/A    m_map.erase(address);
8712SN/A
8812SN/A    // Don't always recalculate the next ready address
8912SN/A    if (address == m_next_address) {
9012SN/A        m_next_valid = false;
9112SN/A    }
9212SN/A}
935543Ssaidi@eecs.umich.edu
945543Ssaidi@eecs.umich.eduvoid
955543Ssaidi@eecs.umich.eduTimerTable::print(std::ostream& out) const
965543Ssaidi@eecs.umich.edu{
975543Ssaidi@eecs.umich.edu}
985543Ssaidi@eecs.umich.edu
995543Ssaidi@eecs.umich.eduvoid
1005543Ssaidi@eecs.umich.eduTimerTable::updateNext() const
1015543Ssaidi@eecs.umich.edu{
1025543Ssaidi@eecs.umich.edu    if (m_map.empty()) {
1035543Ssaidi@eecs.umich.edu        assert(!m_next_valid);
1045543Ssaidi@eecs.umich.edu        return;
1055543Ssaidi@eecs.umich.edu    }
1065543Ssaidi@eecs.umich.edu
1075543Ssaidi@eecs.umich.edu    AddressMap::const_iterator i = m_map.begin();
1085543Ssaidi@eecs.umich.edu    AddressMap::const_iterator end = m_map.end();
1095543Ssaidi@eecs.umich.edu
1105543Ssaidi@eecs.umich.edu    m_next_address = i->first;
1115543Ssaidi@eecs.umich.edu    m_next_time = i->second;
1125543Ssaidi@eecs.umich.edu    ++i;
1135543Ssaidi@eecs.umich.edu
1145543Ssaidi@eecs.umich.edu    for (; i != end; ++i) {
1155543Ssaidi@eecs.umich.edu        if (i->second < m_next_time) {
1165543Ssaidi@eecs.umich.edu            m_next_address = i->first;
1175543Ssaidi@eecs.umich.edu            m_next_time = i->second;
11812SN/A        }
11912SN/A    }
12012SN/A
1215543Ssaidi@eecs.umich.edu    m_next_valid = true;
1225543Ssaidi@eecs.umich.edu}
12312SN/A