RubyDirectedTester.hh revision 7454
12155SN/A/* 22155SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 32155SN/A * Copyright (c) 2009 Advanced Micro Devices, Inc. 42155SN/A * All rights reserved. 52155SN/A * 62155SN/A * Redistribution and use in source and binary forms, with or without 72155SN/A * modification, are permitted provided that the following conditions are 82155SN/A * met: redistributions of source code must retain the above copyright 92155SN/A * notice, this list of conditions and the following disclaimer; 102155SN/A * redistributions in binary form must reproduce the above copyright 112155SN/A * notice, this list of conditions and the following disclaimer in the 122155SN/A * documentation and/or other materials provided with the distribution; 132155SN/A * neither the name of the copyright holders nor the names of its 142155SN/A * contributors may be used to endorse or promote products derived from 152155SN/A * this software without specific prior written permission. 162155SN/A * 172155SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 182155SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192155SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 202155SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 212155SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 222155SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 232155SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 242155SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 252155SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 262155SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 272155SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu */ 292665Ssaidi@eecs.umich.edu 302155SN/A#ifndef __CPU_RUBYTEST_RUBYTESTER_HH__ 314202Sbinkertn@umich.edu#define __CPU_RUBYTEST_RUBYTESTER_HH__ 322155SN/A 339850Sandreas.hansson@arm.com#include <iostream> 349850Sandreas.hansson@arm.com#include <vector> 359850Sandreas.hansson@arm.com#include <string> 367768SAli.Saidi@ARM.com 377768SAli.Saidi@ARM.com#include "cpu/rubytest/CheckTable.hh" 3810695SAli.Saidi@ARM.com#include "mem/mem_object.hh" 3910695SAli.Saidi@ARM.com#include "mem/packet.hh" 4010695SAli.Saidi@ARM.com#include "mem/ruby/common/DataBlock.hh" 4110695SAli.Saidi@ARM.com#include "mem/ruby/common/Global.hh" 4210695SAli.Saidi@ARM.com#include "mem/ruby/common/SubBlock.hh" 438887Sgeoffrey.blake@arm.com#include "mem/ruby/system/RubyPort.hh" 442766Sktlim@umich.edu#include "params/RubyTester.hh" 454486Sbinkertn@umich.edu 4610663SAli.Saidi@ARM.comclass RubyTester : public MemObject 474486Sbinkertn@umich.edu{ 488739Sgblack@eecs.umich.edu public: 4910259SAndrew.Bardsley@arm.com class CpuPort : public SimpleTimingPort 504486Sbinkertn@umich.edu { 514202Sbinkertn@umich.edu private: 524202Sbinkertn@umich.edu RubyTester *tester; 534202Sbinkertn@umich.edu 544202Sbinkertn@umich.edu public: 5510319SAndreas.Sandberg@ARM.com CpuPort(const std::string &_name, RubyTester *_tester, int _idx) 564202Sbinkertn@umich.edu : SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx) 574776Sgblack@eecs.umich.edu {} 588739Sgblack@eecs.umich.edu 596365Sgblack@eecs.umich.edu int idx; 604202Sbinkertn@umich.edu 618777Sgblack@eecs.umich.edu protected: 624202Sbinkertn@umich.edu virtual bool recvTiming(PacketPtr pkt); 639913Ssteve.reinhardt@amd.com virtual Tick recvAtomic(PacketPtr pkt); 644202Sbinkertn@umich.edu }; 654202Sbinkertn@umich.edu 665217Ssaidi@eecs.umich.edu struct SenderState : public Packet::SenderState 674202Sbinkertn@umich.edu { 6810259SAndrew.Bardsley@arm.com SubBlock* subBlock; 692155SN/A Packet::SenderState *saved; 708887Sgeoffrey.blake@arm.com 7110201SAndrew.Bardsley@arm.com SenderState(Address addr, int size, 728887Sgeoffrey.blake@arm.com Packet::SenderState *sender_state = NULL) 739340SAndreas.Sandberg@arm.com : saved(sender_state) 748887Sgeoffrey.blake@arm.com { 755192Ssaidi@eecs.umich.edu subBlock = new SubBlock(addr, size); 768335Snate@binkert.org } 778335Snate@binkert.org 788335Snate@binkert.org ~SenderState() 798335Snate@binkert.org { 808335Snate@binkert.org delete subBlock; 819534SAndreas.Sandberg@ARM.com } 829534SAndreas.Sandberg@ARM.com }; 839534SAndreas.Sandberg@ARM.com 848335Snate@binkert.org typedef RubyTesterParams Params; 859534SAndreas.Sandberg@ARM.com RubyTester(const Params *p); 869534SAndreas.Sandberg@ARM.com ~RubyTester(); 878335Snate@binkert.org 889534SAndreas.Sandberg@ARM.com virtual Port *getPort(const std::string &if_name, int idx = -1); 899534SAndreas.Sandberg@ARM.com 909534SAndreas.Sandberg@ARM.com Port* getCpuPort(int idx); 919534SAndreas.Sandberg@ARM.com 929534SAndreas.Sandberg@ARM.com virtual void init(); 939534SAndreas.Sandberg@ARM.com 949534SAndreas.Sandberg@ARM.com void wakeup(); 959534SAndreas.Sandberg@ARM.com 969534SAndreas.Sandberg@ARM.com void incrementCheckCompletions() { m_checks_completed++; } 9710383Smitch.hayenga@arm.com 988335Snate@binkert.org void printStats(std::ostream& out) const {} 998335Snate@binkert.org void clearStats() {} 1008471SGiacomo.Gabrielli@arm.com void printConfig(std::ostream& out) const {} 1018335Snate@binkert.org 1028335Snate@binkert.org void print(std::ostream& out) const; 10310529Smorr@cs.wisc.edu 1045192Ssaidi@eecs.umich.edu protected: 1058232Snate@binkert.org class CheckStartEvent : public Event 1068232Snate@binkert.org { 10710664SAli.Saidi@ARM.com private: 1088300Schander.sudanthi@arm.com RubyTester *tester; 10910383Smitch.hayenga@arm.com 1105192Ssaidi@eecs.umich.edu public: 11111162Ssteve.reinhardt@amd.com CheckStartEvent(RubyTester *_tester) 11211162Ssteve.reinhardt@amd.com : Event(CPU_Tick_Pri), tester(_tester) 11311162Ssteve.reinhardt@amd.com {} 11411162Ssteve.reinhardt@amd.com void process() { tester->wakeup(); } 1158300Schander.sudanthi@arm.com virtual const char *description() const { return "RubyTester tick"; } 116 }; 117 118 CheckStartEvent checkStartEvent; 119 120 private: 121 void hitCallback(NodeID proc, SubBlock* data); 122 123 void checkForDeadlock(); 124 125 // Private copy constructor and assignment operator 126 RubyTester(const RubyTester& obj); 127 RubyTester& operator=(const RubyTester& obj); 128 129 CheckTable* m_checkTable_ptr; 130 std::vector<Time> m_last_progress_vector; 131 132 uint64 m_checks_completed; 133 std::vector<CpuPort*> ports; 134 uint64 m_checks_to_complete; 135 int m_deadlock_threshold; 136 int m_num_cpu_sequencers; 137 int m_wakeup_frequency; 138}; 139 140inline std::ostream& 141operator<<(std::ostream& out, const RubyTester& obj) 142{ 143 obj.print(out); 144 out << std::flush; 145 return out; 146} 147 148#endif // __CPU_RUBYTEST_RUBYTESTER_HH__ 149