TimerTable.cc revision 9507
17934SN/A/*
27934SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
311754Sandreas.hansson@arm.com * All rights reserved.
411754Sandreas.hansson@arm.com *
511754Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
67934SN/A * modification, are permitted provided that the following conditions are
711754Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
811754Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
911754Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1011754Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1111754Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1211754Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
1311754Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
1410036SAli.Saidi@ARM.com * this software without specific prior written permission.
1510036SAli.Saidi@ARM.com *
1611754Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710513SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810513SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910892Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011754Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110535Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211754Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310892Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410892Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511606Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610535Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711606Sandreas.sandberg@arm.com */
2810513SAli.Saidi@ARM.com
2910513SAli.Saidi@ARM.com#include "mem/ruby/common/Global.hh"
3010892Sandreas.hansson@arm.com#include "mem/ruby/system/System.hh"
3111754Sandreas.hansson@arm.com#include "mem/ruby/system/TimerTable.hh"
3210535Sandreas.hansson@arm.com
3311754Sandreas.hansson@arm.comTimerTable::TimerTable()
3411606Sandreas.sandberg@arm.com    : m_next_time(0)
3510535Sandreas.hansson@arm.com{
3611606Sandreas.sandberg@arm.com    m_consumer_ptr  = NULL;
3710513SAli.Saidi@ARM.com    m_clockobj_ptr = NULL;
3810513SAli.Saidi@ARM.com
3911336Sandreas.hansson@arm.com    m_next_valid = false;
4011754Sandreas.hansson@arm.com    m_next_address = Address(0);
4110535Sandreas.hansson@arm.com}
4211754Sandreas.hansson@arm.com
4311336Sandreas.hansson@arm.combool
4411336Sandreas.hansson@arm.comTimerTable::isReady() const
4511754Sandreas.hansson@arm.com{
4610535Sandreas.hansson@arm.com    if (m_map.empty())
4711754Sandreas.hansson@arm.com        return false;
4811754Sandreas.hansson@arm.com
4910513SAli.Saidi@ARM.com    if (!m_next_valid) {
5010513SAli.Saidi@ARM.com        updateNext();
5111336Sandreas.hansson@arm.com    }
5211754Sandreas.hansson@arm.com    assert(m_next_valid);
5310585Sandreas.hansson@arm.com    return (m_clockobj_ptr->curCycle() >= m_next_time);
5411754Sandreas.hansson@arm.com}
5511754Sandreas.hansson@arm.com
5610517SAli.Saidi@ARM.comconst Address&
5710517SAli.Saidi@ARM.comTimerTable::readyAddress() const
5810517SAli.Saidi@ARM.com{
5910517SAli.Saidi@ARM.com    assert(isReady());
6010517SAli.Saidi@ARM.com
6110517SAli.Saidi@ARM.com    if (!m_next_valid) {
6210517SAli.Saidi@ARM.com        updateNext();
6310517SAli.Saidi@ARM.com    }
6410517SAli.Saidi@ARM.com    assert(m_next_valid);
6510517SAli.Saidi@ARM.com    return m_next_address;
6610517SAli.Saidi@ARM.com}
6710517SAli.Saidi@ARM.com
6811754Sandreas.hansson@arm.comvoid
6911754Sandreas.hansson@arm.comTimerTable::set(const Address& address, Cycles relative_latency)
7011754Sandreas.hansson@arm.com{
7110535Sandreas.hansson@arm.com    assert(address == line_address(address));
7210535Sandreas.hansson@arm.com    assert(relative_latency > 0);
7310535Sandreas.hansson@arm.com    assert(!m_map.count(address));
7410535Sandreas.hansson@arm.com
7510535Sandreas.hansson@arm.com    Cycles ready_time = m_clockobj_ptr->curCycle() + relative_latency;
7610535Sandreas.hansson@arm.com    m_map[address] = ready_time;
7710535Sandreas.hansson@arm.com    assert(m_consumer_ptr != NULL);
7811754Sandreas.hansson@arm.com    m_consumer_ptr->scheduleEventAbsolute(ready_time);
7910628Sandreas.hansson@arm.com    m_next_valid = false;
8010628Sandreas.hansson@arm.com
8110628Sandreas.hansson@arm.com    // Don't always recalculate the next ready address
8210628Sandreas.hansson@arm.com    if (ready_time <= m_next_time) {
8310628Sandreas.hansson@arm.com        m_next_valid = false;
8410628Sandreas.hansson@arm.com    }
8510628Sandreas.hansson@arm.com}
8610628Sandreas.hansson@arm.com
8710535Sandreas.hansson@arm.comvoid
8810535Sandreas.hansson@arm.comTimerTable::unset(const Address& address)
8910535Sandreas.hansson@arm.com{
9010535Sandreas.hansson@arm.com    assert(address == line_address(address));
9110535Sandreas.hansson@arm.com    assert(m_map.count(address));
9210535Sandreas.hansson@arm.com    m_map.erase(address);
9310535Sandreas.hansson@arm.com
9410535Sandreas.hansson@arm.com    // Don't always recalculate the next ready address
9510535Sandreas.hansson@arm.com    if (address == m_next_address) {
9610535Sandreas.hansson@arm.com        m_next_valid = false;
9710535Sandreas.hansson@arm.com    }
9810535Sandreas.hansson@arm.com}
9910535Sandreas.hansson@arm.com
10010535Sandreas.hansson@arm.comvoid
10110535Sandreas.hansson@arm.comTimerTable::print(std::ostream& out) const
10210535Sandreas.hansson@arm.com{
10310535Sandreas.hansson@arm.com}
10410535Sandreas.hansson@arm.com
10510535Sandreas.hansson@arm.comvoid
10610535Sandreas.hansson@arm.comTimerTable::updateNext() const
10710535Sandreas.hansson@arm.com{
10811754Sandreas.hansson@arm.com    if (m_map.empty()) {
10911336Sandreas.hansson@arm.com        assert(!m_next_valid);
11011336Sandreas.hansson@arm.com        return;
11111336Sandreas.hansson@arm.com    }
11211336Sandreas.hansson@arm.com
11311336Sandreas.hansson@arm.com    AddressMap::const_iterator i = m_map.begin();
11410628Sandreas.hansson@arm.com    AddressMap::const_iterator end = m_map.end();
11510628Sandreas.hansson@arm.com
11610628Sandreas.hansson@arm.com    m_next_address = i->first;
11711336Sandreas.hansson@arm.com    m_next_time = i->second;
11810628Sandreas.hansson@arm.com    ++i;
11911336Sandreas.hansson@arm.com
12011336Sandreas.hansson@arm.com    for (; i != end; ++i) {
12110628Sandreas.hansson@arm.com        if (i->second < m_next_time) {
12211336Sandreas.hansson@arm.com            m_next_address = i->first;
12311336Sandreas.hansson@arm.com            m_next_time = i->second;
12410628Sandreas.hansson@arm.com        }
12511336Sandreas.hansson@arm.com    }
12611336Sandreas.hansson@arm.com
12710535Sandreas.hansson@arm.com    m_next_valid = true;
12810535Sandreas.hansson@arm.com}
12911754Sandreas.hansson@arm.com