RubyDirectedTester.hh revision 7053
111619Sandreas.sandberg@arm.com/* 210916Sandreas.sandberg@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 310916Sandreas.sandberg@arm.com * Copyright (c) 2009 Advanced Micro Devices, Inc. 410916Sandreas.sandberg@arm.com * All rights reserved. 510916Sandreas.sandberg@arm.com * 610916Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 710916Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 810916Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 910916Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1010916Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1110916Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1210916Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1310916Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1410916Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1510916Sandreas.sandberg@arm.com * this software without specific prior written permission. 1610916Sandreas.sandberg@arm.com * 1710916Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1810916Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1910916Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2010916Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2110916Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2210916Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2310916Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2410916Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2510916Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2610916Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2710916Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2810916Sandreas.sandberg@arm.com */ 2910916Sandreas.sandberg@arm.com 3010916Sandreas.sandberg@arm.com#ifndef __CPU_RUBYTEST_RUBYTESTER_HH__ 3110916Sandreas.sandberg@arm.com#define __CPU_RUBYTEST_RUBYTESTER_HH__ 3210916Sandreas.sandberg@arm.com 3310916Sandreas.sandberg@arm.com#include "cpu/rubytest/CheckTable.hh" 3410916Sandreas.sandberg@arm.com#include "mem/mem_object.hh" 3510916Sandreas.sandberg@arm.com#include "mem/packet.hh" 3610916Sandreas.sandberg@arm.com#include "mem/ruby/common/DataBlock.hh" 3710916Sandreas.sandberg@arm.com#include "mem/ruby/common/Global.hh" 3810916Sandreas.sandberg@arm.com#include "mem/ruby/common/SubBlock.hh" 3910916Sandreas.sandberg@arm.com#include "mem/ruby/system/RubyPort.hh" 4010916Sandreas.sandberg@arm.com#include "params/RubyTester.hh" 4110916Sandreas.sandberg@arm.com 4210916Sandreas.sandberg@arm.comclass RubyTester : public MemObject 4310916Sandreas.sandberg@arm.com{ 4410916Sandreas.sandberg@arm.com public: 4510916Sandreas.sandberg@arm.com class CpuPort : public SimpleTimingPort 4610916Sandreas.sandberg@arm.com { 4710916Sandreas.sandberg@arm.com private: 4810916Sandreas.sandberg@arm.com RubyTester *tester; 4910916Sandreas.sandberg@arm.com 5010916Sandreas.sandberg@arm.com public: 5110916Sandreas.sandberg@arm.com CpuPort(const std::string &_name, RubyTester *_tester, int _idx) 5210916Sandreas.sandberg@arm.com : SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx) 5310916Sandreas.sandberg@arm.com {} 5410916Sandreas.sandberg@arm.com 5510916Sandreas.sandberg@arm.com int idx; 5610916Sandreas.sandberg@arm.com 5710916Sandreas.sandberg@arm.com protected: 5810916Sandreas.sandberg@arm.com virtual bool recvTiming(PacketPtr pkt); 5910916Sandreas.sandberg@arm.com virtual Tick recvAtomic(PacketPtr pkt); 6010916Sandreas.sandberg@arm.com }; 6110916Sandreas.sandberg@arm.com 6210916Sandreas.sandberg@arm.com struct SenderState : public Packet::SenderState 6310916Sandreas.sandberg@arm.com { 6411619Sandreas.sandberg@arm.com SubBlock* subBlock; 6511619Sandreas.sandberg@arm.com Packet::SenderState *saved; 6611619Sandreas.sandberg@arm.com 6711619Sandreas.sandberg@arm.com SenderState(Address addr, int size, 6811619Sandreas.sandberg@arm.com Packet::SenderState *sender_state = NULL) 6911619Sandreas.sandberg@arm.com : saved(sender_state) 7011619Sandreas.sandberg@arm.com { 7111619Sandreas.sandberg@arm.com subBlock = new SubBlock(addr, size); 7211619Sandreas.sandberg@arm.com } 7311619Sandreas.sandberg@arm.com 7411619Sandreas.sandberg@arm.com ~SenderState() 7511619Sandreas.sandberg@arm.com { 7611619Sandreas.sandberg@arm.com delete subBlock; 7711619Sandreas.sandberg@arm.com } 7811619Sandreas.sandberg@arm.com }; 7911619Sandreas.sandberg@arm.com 8011619Sandreas.sandberg@arm.com typedef RubyTesterParams Params; 8111619Sandreas.sandberg@arm.com RubyTester(const Params *p); 8211619Sandreas.sandberg@arm.com ~RubyTester(); 8311619Sandreas.sandberg@arm.com 8411619Sandreas.sandberg@arm.com virtual Port *getPort(const std::string &if_name, int idx = -1); 8511619Sandreas.sandberg@arm.com 8611619Sandreas.sandberg@arm.com Port* getCpuPort(int idx); 8711619Sandreas.sandberg@arm.com 8811619Sandreas.sandberg@arm.com virtual void init(); 8911619Sandreas.sandberg@arm.com 9011619Sandreas.sandberg@arm.com void wakeup(); 9111619Sandreas.sandberg@arm.com 9211619Sandreas.sandberg@arm.com void incrementCheckCompletions() { m_checks_completed++; } 9311619Sandreas.sandberg@arm.com 9411619Sandreas.sandberg@arm.com void printStats(ostream& out) const {} 9511619Sandreas.sandberg@arm.com void clearStats() {} 9611619Sandreas.sandberg@arm.com void printConfig(ostream& out) const {} 9711619Sandreas.sandberg@arm.com 9811619Sandreas.sandberg@arm.com void print(ostream& out) const; 9911619Sandreas.sandberg@arm.com 10011619Sandreas.sandberg@arm.com protected: 10111619Sandreas.sandberg@arm.com class CheckStartEvent : public Event 10211619Sandreas.sandberg@arm.com { 10311619Sandreas.sandberg@arm.com private: 10411619Sandreas.sandberg@arm.com RubyTester *tester; 10511619Sandreas.sandberg@arm.com 10611619Sandreas.sandberg@arm.com public: 10711619Sandreas.sandberg@arm.com CheckStartEvent(RubyTester *_tester) 10811619Sandreas.sandberg@arm.com : Event(CPU_Tick_Pri), tester(_tester) 10911619Sandreas.sandberg@arm.com {} 11011619Sandreas.sandberg@arm.com void process() { tester->wakeup(); } 11111619Sandreas.sandberg@arm.com virtual const char *description() const { return "RubyTester tick"; } 11211619Sandreas.sandberg@arm.com }; 11311619Sandreas.sandberg@arm.com 11411619Sandreas.sandberg@arm.com CheckStartEvent checkStartEvent; 11511619Sandreas.sandberg@arm.com 11611619Sandreas.sandberg@arm.com private: 11711619Sandreas.sandberg@arm.com void hitCallback(NodeID proc, SubBlock* data); 11811619Sandreas.sandberg@arm.com 11911619Sandreas.sandberg@arm.com void checkForDeadlock(); 12011619Sandreas.sandberg@arm.com 12111619Sandreas.sandberg@arm.com // Private copy constructor and assignment operator 12211619Sandreas.sandberg@arm.com RubyTester(const RubyTester& obj); 12311619Sandreas.sandberg@arm.com RubyTester& operator=(const RubyTester& obj); 12411619Sandreas.sandberg@arm.com 12511619Sandreas.sandberg@arm.com CheckTable* m_checkTable_ptr; 12611619Sandreas.sandberg@arm.com Vector<Time> m_last_progress_vector; 12711619Sandreas.sandberg@arm.com 128 uint64 m_checks_completed; 129 std::vector<CpuPort*> ports; 130 uint64 m_checks_to_complete; 131 int m_deadlock_threshold; 132 int m_num_cpu_sequencers; 133 int m_wakeup_frequency; 134}; 135 136inline ostream& 137operator<<(ostream& out, const RubyTester& obj) 138{ 139 obj.print(out); 140 out << flush; 141 return out; 142} 143 144#endif // __CPU_RUBYTEST_RUBYTESTER_HH__ 145