RubyDirectedTester.hh revision 6899
111308Santhony.gutierrez@amd.com 211308Santhony.gutierrez@amd.com/* 311308Santhony.gutierrez@amd.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 411308Santhony.gutierrez@amd.com * Copyright (c) 2009 Advanced Micro Devices, Inc. 511308Santhony.gutierrez@amd.com * All rights reserved. 611308Santhony.gutierrez@amd.com * 711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 911308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 1111308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1211308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1311308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1411308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1511308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1611308Santhony.gutierrez@amd.com * this software without specific prior written permission. 1711308Santhony.gutierrez@amd.com * 1811308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1911308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2011308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2211308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2311308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2411308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2511308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2611308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2711308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2811308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2911308Santhony.gutierrez@amd.com */ 3011308Santhony.gutierrez@amd.com 3111308Santhony.gutierrez@amd.com#ifndef RUBY_TESTER_H 3211308Santhony.gutierrez@amd.com#define RUBY_TESTER_H 3311308Santhony.gutierrez@amd.com 3411308Santhony.gutierrez@amd.com#include "mem/ruby/common/Global.hh" 3511308Santhony.gutierrez@amd.com#include "mem/mem_object.hh" 3611308Santhony.gutierrez@amd.com#include "cpu/rubytest/CheckTable.hh" 3711308Santhony.gutierrez@amd.com#include "mem/ruby/system/RubyPort.hh" 3811308Santhony.gutierrez@amd.com#include "mem/ruby/common/SubBlock.hh" 3911308Santhony.gutierrez@amd.com#include "mem/ruby/common/DataBlock.hh" 4011308Santhony.gutierrez@amd.com#include "mem/packet.hh" 4111308Santhony.gutierrez@amd.com#include "params/RubyTester.hh" 4211308Santhony.gutierrez@amd.com 4311308Santhony.gutierrez@amd.comclass RubyTester : public MemObject 4411308Santhony.gutierrez@amd.com{ 4511308Santhony.gutierrez@amd.com 4611308Santhony.gutierrez@amd.com public: 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.com class CpuPort : public SimpleTimingPort 4911308Santhony.gutierrez@amd.com { 5011308Santhony.gutierrez@amd.com RubyTester *tester; 5111308Santhony.gutierrez@amd.com 5211308Santhony.gutierrez@amd.com public: 5311308Santhony.gutierrez@amd.com 5411308Santhony.gutierrez@amd.com CpuPort(const std::string &_name, 5511308Santhony.gutierrez@amd.com RubyTester *_tester, 5611308Santhony.gutierrez@amd.com int _idx) 5711308Santhony.gutierrez@amd.com : SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx) 5811308Santhony.gutierrez@amd.com {} 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com int idx; 6111308Santhony.gutierrez@amd.com 6211308Santhony.gutierrez@amd.com protected: 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.com virtual bool recvTiming(PacketPtr pkt); 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.com virtual Tick recvAtomic(PacketPtr pkt); 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.com }; 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.com struct SenderState : public Packet::SenderState 7111308Santhony.gutierrez@amd.com { 7211308Santhony.gutierrez@amd.com SubBlock* subBlock; 7311308Santhony.gutierrez@amd.com Packet::SenderState *saved; 7411308Santhony.gutierrez@amd.com 7511308Santhony.gutierrez@amd.com SenderState(Address addr, 7611308Santhony.gutierrez@amd.com int size, 7711308Santhony.gutierrez@amd.com Packet::SenderState *sender_state = NULL) 7811308Santhony.gutierrez@amd.com : saved(sender_state) 7911308Santhony.gutierrez@amd.com {subBlock = new SubBlock(addr, size);} 8011308Santhony.gutierrez@amd.com 8111308Santhony.gutierrez@amd.com ~SenderState() {delete subBlock;} 8211308Santhony.gutierrez@amd.com }; 8311308Santhony.gutierrez@amd.com 8411308Santhony.gutierrez@amd.com typedef RubyTesterParams Params; 8511308Santhony.gutierrez@amd.com // Constructors 8611308Santhony.gutierrez@amd.com RubyTester(const Params *p); 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.com // Destructor 8911308Santhony.gutierrez@amd.com ~RubyTester(); 9011308Santhony.gutierrez@amd.com 9111308Santhony.gutierrez@amd.com // Public Methods 9211642Salexandru.dutu@amd.com 9311308Santhony.gutierrez@amd.com virtual Port *getPort(const std::string &if_name, int idx = -1); 9411308Santhony.gutierrez@amd.com 9511308Santhony.gutierrez@amd.com Port* getCpuPort(int idx); 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.com void virtual init(); 9811308Santhony.gutierrez@amd.com 9911308Santhony.gutierrez@amd.com void wakeup(); 10011642Salexandru.dutu@amd.com 10111642Salexandru.dutu@amd.com void incrementCheckCompletions() { m_checks_completed++; } 102 103 void printStats(ostream& out) const {} 104 void clearStats() {} 105 void printConfig(ostream& out) const {} 106 107 void print(ostream& out) const; 108 109 protected: 110 class CheckStartEvent : public Event 111 { 112 private: 113 RubyTester *tester; 114 115 public: 116 CheckStartEvent(RubyTester *_tester) : Event(CPU_Tick_Pri), tester(_tester) {} 117 void process() { tester->wakeup(); } 118 virtual const char *description() const { return "RubyTester tick"; } 119 }; 120 121 CheckStartEvent checkStartEvent; 122 123 124 private: 125 // Private Methods 126 127 void hitCallback(NodeID proc, SubBlock* data); 128 129 void checkForDeadlock(); 130 131 // Private copy constructor and assignment operator 132 RubyTester(const RubyTester& obj); 133 RubyTester& operator=(const RubyTester& obj); 134 135 // Data Members (m_ prefix) 136 137 CheckTable* m_checkTable_ptr; 138 Vector<Time> m_last_progress_vector; 139 140 uint64 m_checks_completed; 141 std::vector<CpuPort*> ports; 142 uint64 m_checks_to_complete; 143 int m_deadlock_threshold; 144 int m_num_cpu_sequencers; 145 int m_wakeup_frequency; 146}; 147 148// Output operator declaration 149ostream& operator<<(ostream& out, const RubyTester& obj); 150 151// ******************* Definitions ******************* 152 153// Output operator definition 154extern inline 155ostream& operator<<(ostream& out, const RubyTester& obj) 156{ 157 obj.print(out); 158 out << flush; 159 return out; 160} 161 162#endif //RUBY_TESTER_H 163