RubyDirectedTester.hh revision 6899
12568SN/A 22568SN/A/* 32568SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 42568SN/A * Copyright (c) 2009 Advanced Micro Devices, Inc. 52568SN/A * All rights reserved. 62568SN/A * 72568SN/A * Redistribution and use in source and binary forms, with or without 82568SN/A * modification, are permitted provided that the following conditions are 92568SN/A * met: redistributions of source code must retain the above copyright 102568SN/A * notice, this list of conditions and the following disclaimer; 112568SN/A * redistributions in binary form must reproduce the above copyright 122568SN/A * notice, this list of conditions and the following disclaimer in the 132568SN/A * documentation and/or other materials provided with the distribution; 142568SN/A * neither the name of the copyright holders nor the names of its 152568SN/A * contributors may be used to endorse or promote products derived from 162568SN/A * this software without specific prior written permission. 172568SN/A * 182568SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 192568SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 202568SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212568SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222568SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 232568SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 242568SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 252568SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 262568SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 272665Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 282665Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292665Ssaidi@eecs.umich.edu */ 302568SN/A 312568SN/A#ifndef RUBY_TESTER_H 322568SN/A#define RUBY_TESTER_H 332982Sstever@eecs.umich.edu 342982Sstever@eecs.umich.edu#include "mem/ruby/common/Global.hh" 352568SN/A#include "mem/mem_object.hh" 362568SN/A#include "cpu/rubytest/CheckTable.hh" 372568SN/A#include "mem/ruby/system/RubyPort.hh" 382568SN/A#include "mem/ruby/common/SubBlock.hh" 392568SN/A#include "mem/ruby/common/DataBlock.hh" 402568SN/A#include "mem/packet.hh" 412568SN/A#include "params/RubyTester.hh" 422568SN/A 432568SN/Aclass RubyTester : public MemObject 442568SN/A{ 452568SN/A 462568SN/A public: 472568SN/A 482568SN/A class CpuPort : public SimpleTimingPort 492568SN/A { 502568SN/A RubyTester *tester; 512568SN/A 522568SN/A public: 532982Sstever@eecs.umich.edu 542568SN/A CpuPort(const std::string &_name, 552568SN/A RubyTester *_tester, 562568SN/A int _idx) 572643Sstever@eecs.umich.edu : SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx) 582568SN/A {} 592568SN/A 602643Sstever@eecs.umich.edu int idx; 612643Sstever@eecs.umich.edu 622643Sstever@eecs.umich.edu protected: 632643Sstever@eecs.umich.edu 642643Sstever@eecs.umich.edu virtual bool recvTiming(PacketPtr pkt); 652643Sstever@eecs.umich.edu 662643Sstever@eecs.umich.edu virtual Tick recvAtomic(PacketPtr pkt); 672643Sstever@eecs.umich.edu 682643Sstever@eecs.umich.edu }; 692643Sstever@eecs.umich.edu 702643Sstever@eecs.umich.edu struct SenderState : public Packet::SenderState 712643Sstever@eecs.umich.edu { 722643Sstever@eecs.umich.edu SubBlock* subBlock; 733349Sbinkertn@umich.edu Packet::SenderState *saved; 742643Sstever@eecs.umich.edu 752643Sstever@eecs.umich.edu SenderState(Address addr, 762643Sstever@eecs.umich.edu int size, 772643Sstever@eecs.umich.edu Packet::SenderState *sender_state = NULL) 783349Sbinkertn@umich.edu : saved(sender_state) 792643Sstever@eecs.umich.edu {subBlock = new SubBlock(addr, size);} 802643Sstever@eecs.umich.edu 812643Sstever@eecs.umich.edu ~SenderState() {delete subBlock;} 822643Sstever@eecs.umich.edu }; 832657Ssaidi@eecs.umich.edu 842657Ssaidi@eecs.umich.edu typedef RubyTesterParams Params; 852643Sstever@eecs.umich.edu // Constructors 862643Sstever@eecs.umich.edu RubyTester(const Params *p); 873349Sbinkertn@umich.edu 882643Sstever@eecs.umich.edu // Destructor 892643Sstever@eecs.umich.edu ~RubyTester(); 902643Sstever@eecs.umich.edu 912643Sstever@eecs.umich.edu // Public Methods 922643Sstever@eecs.umich.edu 932643Sstever@eecs.umich.edu virtual Port *getPort(const std::string &if_name, int idx = -1); 942643Sstever@eecs.umich.edu 952643Sstever@eecs.umich.edu Port* getCpuPort(int idx); 962643Sstever@eecs.umich.edu 972643Sstever@eecs.umich.edu void virtual init(); 982643Sstever@eecs.umich.edu 992643Sstever@eecs.umich.edu void wakeup(); 1002643Sstever@eecs.umich.edu 1012643Sstever@eecs.umich.edu void incrementCheckCompletions() { m_checks_completed++; } 1022643Sstever@eecs.umich.edu 1032643Sstever@eecs.umich.edu void printStats(ostream& out) const {} 1042643Sstever@eecs.umich.edu void clearStats() {} 1052643Sstever@eecs.umich.edu void printConfig(ostream& out) const {} 1062643Sstever@eecs.umich.edu 1072643Sstever@eecs.umich.edu void print(ostream& out) const; 1082643Sstever@eecs.umich.edu 1092643Sstever@eecs.umich.edu protected: 1102643Sstever@eecs.umich.edu class CheckStartEvent : public Event 1112643Sstever@eecs.umich.edu { 1123349Sbinkertn@umich.edu private: 1132643Sstever@eecs.umich.edu RubyTester *tester; 1142643Sstever@eecs.umich.edu 1152643Sstever@eecs.umich.edu public: 1162643Sstever@eecs.umich.edu CheckStartEvent(RubyTester *_tester) : Event(CPU_Tick_Pri), tester(_tester) {} 1172643Sstever@eecs.umich.edu void process() { tester->wakeup(); } 1182643Sstever@eecs.umich.edu virtual const char *description() const { return "RubyTester tick"; } 1192643Sstever@eecs.umich.edu }; 1202643Sstever@eecs.umich.edu 1212643Sstever@eecs.umich.edu CheckStartEvent checkStartEvent; 1222643Sstever@eecs.umich.edu 1232643Sstever@eecs.umich.edu 1242643Sstever@eecs.umich.edu private: 1252643Sstever@eecs.umich.edu // Private Methods 1262643Sstever@eecs.umich.edu 1272643Sstever@eecs.umich.edu void hitCallback(NodeID proc, SubBlock* data); 1282643Sstever@eecs.umich.edu 1292643Sstever@eecs.umich.edu void checkForDeadlock(); 1302643Sstever@eecs.umich.edu 1312643Sstever@eecs.umich.edu // Private copy constructor and assignment operator 1322643Sstever@eecs.umich.edu RubyTester(const RubyTester& obj); 1332643Sstever@eecs.umich.edu RubyTester& operator=(const RubyTester& obj); 1342643Sstever@eecs.umich.edu 1352643Sstever@eecs.umich.edu // Data Members (m_ prefix) 1362643Sstever@eecs.umich.edu 1372568SN/A CheckTable* m_checkTable_ptr; 1382568SN/A Vector<Time> m_last_progress_vector; 1392568SN/A 1402568SN/A uint64 m_checks_completed; 1412643Sstever@eecs.umich.edu std::vector<CpuPort*> ports; 1422643Sstever@eecs.umich.edu uint64 m_checks_to_complete; 1432643Sstever@eecs.umich.edu int m_deadlock_threshold; 1442568SN/A int m_num_cpu_sequencers; 1452568SN/A int m_wakeup_frequency; 1462568SN/A}; 1472643Sstever@eecs.umich.edu 1482643Sstever@eecs.umich.edu// Output operator declaration 1493349Sbinkertn@umich.eduostream& operator<<(ostream& out, const RubyTester& obj); 1502568SN/A 1512643Sstever@eecs.umich.edu// ******************* Definitions ******************* 1522568SN/A 1532657Ssaidi@eecs.umich.edu// Output operator definition 1542568SN/Aextern inline 1552643Sstever@eecs.umich.eduostream& operator<<(ostream& out, const RubyTester& obj) 1562568SN/A{ 1573349Sbinkertn@umich.edu obj.print(out); 1582568SN/A out << flush; 1592643Sstever@eecs.umich.edu return out; 1602568SN/A} 1613349Sbinkertn@umich.edu 1622568SN/A#endif //RUBY_TESTER_H 1632643Sstever@eecs.umich.edu