InvalidateGenerator.cc revision 6145
110447Snilay@cs.wisc.edu
210447Snilay@cs.wisc.edu/*
310447Snilay@cs.wisc.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
410447Snilay@cs.wisc.edu * All rights reserved.
510447Snilay@cs.wisc.edu *
610447Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
710447Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are
810447Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
910447Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
1010447Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
1110447Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
1210447Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
1310447Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
1410447Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
1510447Snilay@cs.wisc.edu * this software without specific prior written permission.
1610447Snilay@cs.wisc.edu *
1710447Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1810447Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1910447Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2010447Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2110447Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2210447Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2310447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2410447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2510447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2610447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2710447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2810447Snilay@cs.wisc.edu */
2910447Snilay@cs.wisc.edu
3010447Snilay@cs.wisc.edu/*
3110447Snilay@cs.wisc.edu * $Id$
3210447Snilay@cs.wisc.edu *
3310447Snilay@cs.wisc.edu */
3410447Snilay@cs.wisc.edu
3510447Snilay@cs.wisc.edu// This Deterministic Generator generates GETX requests for all nodes in the system
3610447Snilay@cs.wisc.edu// The GETX requests are generated one at a time in round-robin fashion 0...1...2...etc.
3710447Snilay@cs.wisc.edu
3810447Snilay@cs.wisc.edu#include "DetermGETXGenerator.hh"
3910447Snilay@cs.wisc.edu#include "DetermGETXGeneratorStatus.hh"
4010447Snilay@cs.wisc.edu#include "LockStatus.hh"
4110447Snilay@cs.wisc.edu#include "Sequencer.hh"
4210447Snilay@cs.wisc.edu#include "System.hh"
4310447Snilay@cs.wisc.edu#include "RubyConfig.hh"
4410447Snilay@cs.wisc.edu#include "SubBlock.hh"
4510447Snilay@cs.wisc.edu#include "DeterministicDriver.hh"
4610447Snilay@cs.wisc.edu#include "Chip.hh"
4710447Snilay@cs.wisc.edu
4810447Snilay@cs.wisc.eduDetermGETXGenerator::DetermGETXGenerator(NodeID node, DeterministicDriver& driver) :
4910447Snilay@cs.wisc.edu  m_driver(driver)
5010447Snilay@cs.wisc.edu{
5110447Snilay@cs.wisc.edu  m_status = DetermGETXGeneratorStatus_Thinking;
5210447Snilay@cs.wisc.edu  m_last_transition = 0;
5310447Snilay@cs.wisc.edu  m_node = node;
5410447Snilay@cs.wisc.edu  m_address = Address(9999);  // initialize to null value
5510447Snilay@cs.wisc.edu  m_counter = 0;
5610447Snilay@cs.wisc.edu
5710447Snilay@cs.wisc.edu  // don't know exactly when this node needs to request so just guess randomly
5810447Snilay@cs.wisc.edu  g_eventQueue_ptr->scheduleEvent(this, 1+(random() % 200));
5910447Snilay@cs.wisc.edu}
6010447Snilay@cs.wisc.edu
6110447Snilay@cs.wisc.eduDetermGETXGenerator::~DetermGETXGenerator()
6210447Snilay@cs.wisc.edu{
6310447Snilay@cs.wisc.edu}
6410447Snilay@cs.wisc.edu
6510447Snilay@cs.wisc.eduvoid DetermGETXGenerator::wakeup()
6610447Snilay@cs.wisc.edu{
6710447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, MedPrio, m_node);
6810447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, MedPrio, m_status);
6910447Snilay@cs.wisc.edu
7010447Snilay@cs.wisc.edu  // determine if this node is next for the GETX round robin request
7110447Snilay@cs.wisc.edu  if (m_status == DetermGETXGeneratorStatus_Thinking) {
7210447Snilay@cs.wisc.edu    if (m_driver.isStoreReady(m_node)) {
7310447Snilay@cs.wisc.edu      pickAddress();
7410447Snilay@cs.wisc.edu      m_status = DetermGETXGeneratorStatus_Store_Pending;  // Store Pending
7510447Snilay@cs.wisc.edu      m_last_transition = g_eventQueue_ptr->getTime();
7610447Snilay@cs.wisc.edu      initiateStore();  // GETX
7710447Snilay@cs.wisc.edu    } else { // I'll check again later
7810447Snilay@cs.wisc.edu      g_eventQueue_ptr->scheduleEvent(this, thinkTime());
7910447Snilay@cs.wisc.edu    }
8010447Snilay@cs.wisc.edu  } else {
8110447Snilay@cs.wisc.edu    WARN_EXPR(m_status);
8210447Snilay@cs.wisc.edu    ERROR_MSG("Invalid status");
8310447Snilay@cs.wisc.edu  }
8410447Snilay@cs.wisc.edu
8510447Snilay@cs.wisc.edu}
8610447Snilay@cs.wisc.edu
8710447Snilay@cs.wisc.eduvoid DetermGETXGenerator::performCallback(NodeID proc, SubBlock& data)
8810447Snilay@cs.wisc.edu{
8910447Snilay@cs.wisc.edu  Address address = data.getAddress();
9010447Snilay@cs.wisc.edu  assert(proc == m_node);
9110447Snilay@cs.wisc.edu  assert(address == m_address);
9210447Snilay@cs.wisc.edu
9310447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, LowPrio, proc);
9410447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, LowPrio, m_status);
9510447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, LowPrio, address);
9610447Snilay@cs.wisc.edu  DEBUG_EXPR(TESTER_COMP, LowPrio, data);
9710447Snilay@cs.wisc.edu
9810447Snilay@cs.wisc.edu  if (m_status == DetermGETXGeneratorStatus_Store_Pending) {
9910447Snilay@cs.wisc.edu    m_driver.recordStoreLatency(g_eventQueue_ptr->getTime() - m_last_transition);
10010447Snilay@cs.wisc.edu    data.writeByte(m_node);
10110447Snilay@cs.wisc.edu    m_driver.storeCompleted(m_node, data.getAddress());  // advance the store queue
10210447Snilay@cs.wisc.edu
10310447Snilay@cs.wisc.edu    m_counter++;
10410447Snilay@cs.wisc.edu    if (m_counter < g_tester_length) {
10510447Snilay@cs.wisc.edu      m_status = DetermGETXGeneratorStatus_Thinking;
10610447Snilay@cs.wisc.edu      m_last_transition = g_eventQueue_ptr->getTime();
10710447Snilay@cs.wisc.edu      g_eventQueue_ptr->scheduleEvent(this, waitTime());
10810447Snilay@cs.wisc.edu    } else {
10910447Snilay@cs.wisc.edu      m_driver.reportDone();
11010447Snilay@cs.wisc.edu      m_status = DetermGETXGeneratorStatus_Done;
11110447Snilay@cs.wisc.edu      m_last_transition = g_eventQueue_ptr->getTime();
11210447Snilay@cs.wisc.edu    }
11310447Snilay@cs.wisc.edu
11410447Snilay@cs.wisc.edu  } else {
11510447Snilay@cs.wisc.edu    WARN_EXPR(m_status);
11610447Snilay@cs.wisc.edu    ERROR_MSG("Invalid status");
11710447Snilay@cs.wisc.edu  }
11810447Snilay@cs.wisc.edu}
11910447Snilay@cs.wisc.edu
12010447Snilay@cs.wisc.eduint DetermGETXGenerator::thinkTime() const
12110447Snilay@cs.wisc.edu{
122  return g_think_time;
123}
124
125int DetermGETXGenerator::waitTime() const
126{
127  return g_wait_time;
128}
129
130void DetermGETXGenerator::pickAddress()
131{
132  assert(m_status == DetermGETXGeneratorStatus_Thinking);
133
134  m_address = m_driver.getNextStoreAddr(m_node);
135}
136
137void DetermGETXGenerator::initiateStore()
138{
139  DEBUG_MSG(TESTER_COMP, MedPrio, "initiating Store");
140  sequencer()->makeRequest(CacheMsg(m_address, m_address, CacheRequestType_ST, Address(3), AccessModeType_UserMode, 1, PrefetchBit_No, 0, Address(0), 0 /* only 1 SMT thread */, 0, false));
141}
142
143Sequencer* DetermGETXGenerator::sequencer() const
144{
145  return g_system_ptr->getChip(m_node/RubyConfig::numberOfProcsPerChip())->getSequencer(m_node%RubyConfig::numberOfProcsPerChip());
146}
147
148void DetermGETXGenerator::print(ostream& out) const
149{
150}
151
152