RubyTester.hh revision 7055
14120Sgblack@eecs.umich.edu/* 24120Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 34120Sgblack@eecs.umich.edu * Copyright (c) 2009 Advanced Micro Devices, Inc. 44120Sgblack@eecs.umich.edu * All rights reserved. 57087Snate@binkert.org * 67087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 77087Snate@binkert.org * modification, are permitted provided that the following conditions are 87087Snate@binkert.org * met: redistributions of source code must retain the above copyright 97087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 107087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 117087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 127087Snate@binkert.org * documentation and/or other materials provided with the distribution; 134120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 147087Snate@binkert.org * contributors may be used to endorse or promote products derived from 157087Snate@binkert.org * this software without specific prior written permission. 167087Snate@binkert.org * 177087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 187087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 197087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 207087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 217087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 224120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 237087Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 244120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 254120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 264120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 274120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284120Sgblack@eecs.umich.edu */ 294120Sgblack@eecs.umich.edu 304120Sgblack@eecs.umich.edu#ifndef __CPU_RUBYTEST_RUBYTESTER_HH__ 314120Sgblack@eecs.umich.edu#define __CPU_RUBYTEST_RUBYTESTER_HH__ 324120Sgblack@eecs.umich.edu 334120Sgblack@eecs.umich.edu#include <iostream> 344120Sgblack@eecs.umich.edu#include <string> 354120Sgblack@eecs.umich.edu 364120Sgblack@eecs.umich.edu#include "cpu/rubytest/CheckTable.hh" 374120Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 384120Sgblack@eecs.umich.edu#include "mem/packet.hh" 394120Sgblack@eecs.umich.edu#include "mem/ruby/common/DataBlock.hh" 404120Sgblack@eecs.umich.edu#include "mem/ruby/common/Global.hh" 414120Sgblack@eecs.umich.edu#include "mem/ruby/common/SubBlock.hh" 424120Sgblack@eecs.umich.edu#include "mem/ruby/system/RubyPort.hh" 437629Sgblack@eecs.umich.edu#include "params/RubyTester.hh" 444148Sgblack@eecs.umich.edu 454182Sgblack@eecs.umich.educlass RubyTester : public MemObject 464148Sgblack@eecs.umich.edu{ 476216Snate@binkert.org public: 485135Sgblack@eecs.umich.edu class CpuPort : public SimpleTimingPort 494241Sgblack@eecs.umich.edu { 504148Sgblack@eecs.umich.edu private: 514148Sgblack@eecs.umich.edu RubyTester *tester; 524120Sgblack@eecs.umich.edu 534182Sgblack@eecs.umich.edu public: 544182Sgblack@eecs.umich.edu CpuPort(const std::string &_name, RubyTester *_tester, int _idx) 554182Sgblack@eecs.umich.edu : SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx) 564182Sgblack@eecs.umich.edu {} 574334Sgblack@eecs.umich.edu 584334Sgblack@eecs.umich.edu int idx; 594334Sgblack@eecs.umich.edu 604334Sgblack@eecs.umich.edu protected: 614334Sgblack@eecs.umich.edu virtual bool recvTiming(PacketPtr pkt); 624334Sgblack@eecs.umich.edu virtual Tick recvAtomic(PacketPtr pkt); 634334Sgblack@eecs.umich.edu }; 644334Sgblack@eecs.umich.edu 654342Sgblack@eecs.umich.edu struct SenderState : public Packet::SenderState 664587Sgblack@eecs.umich.edu { 676437Sgblack@eecs.umich.edu SubBlock* subBlock; 686437Sgblack@eecs.umich.edu Packet::SenderState *saved; 694182Sgblack@eecs.umich.edu 704182Sgblack@eecs.umich.edu SenderState(Address addr, int size, 714182Sgblack@eecs.umich.edu Packet::SenderState *sender_state = NULL) 724182Sgblack@eecs.umich.edu : saved(sender_state) 734120Sgblack@eecs.umich.edu { 744120Sgblack@eecs.umich.edu subBlock = new SubBlock(addr, size); 755086Sgblack@eecs.umich.edu } 765086Sgblack@eecs.umich.edu 774148Sgblack@eecs.umich.edu ~SenderState() 784148Sgblack@eecs.umich.edu { 794148Sgblack@eecs.umich.edu delete subBlock; 805910Sgblack@eecs.umich.edu } 815910Sgblack@eecs.umich.edu }; 825910Sgblack@eecs.umich.edu 835910Sgblack@eecs.umich.edu typedef RubyTesterParams Params; 845910Sgblack@eecs.umich.edu RubyTester(const Params *p); 855910Sgblack@eecs.umich.edu ~RubyTester(); 864148Sgblack@eecs.umich.edu 874148Sgblack@eecs.umich.edu virtual Port *getPort(const std::string &if_name, int idx = -1); 884148Sgblack@eecs.umich.edu 894148Sgblack@eecs.umich.edu Port* getCpuPort(int idx); 904148Sgblack@eecs.umich.edu 914148Sgblack@eecs.umich.edu virtual void init(); 924148Sgblack@eecs.umich.edu 934148Sgblack@eecs.umich.edu void wakeup(); 944148Sgblack@eecs.umich.edu 955135Sgblack@eecs.umich.edu void incrementCheckCompletions() { m_checks_completed++; } 964194Ssaidi@eecs.umich.edu 975135Sgblack@eecs.umich.edu void printStats(std::ostream& out) const {} 985135Sgblack@eecs.umich.edu void clearStats() {} 995135Sgblack@eecs.umich.edu void printConfig(std::ostream& out) const {} 1005135Sgblack@eecs.umich.edu 1015135Sgblack@eecs.umich.edu void print(std::ostream& out) const; 1026329Sgblack@eecs.umich.edu 1036329Sgblack@eecs.umich.edu protected: 1046329Sgblack@eecs.umich.edu class CheckStartEvent : public Event 1056329Sgblack@eecs.umich.edu { 1064120Sgblack@eecs.umich.edu private: 1074120Sgblack@eecs.umich.edu RubyTester *tester; 1084120Sgblack@eecs.umich.edu 109 public: 110 CheckStartEvent(RubyTester *_tester) 111 : Event(CPU_Tick_Pri), tester(_tester) 112 {} 113 void process() { tester->wakeup(); } 114 virtual const char *description() const { return "RubyTester tick"; } 115 }; 116 117 CheckStartEvent checkStartEvent; 118 119 private: 120 void hitCallback(NodeID proc, SubBlock* data); 121 122 void checkForDeadlock(); 123 124 // Private copy constructor and assignment operator 125 RubyTester(const RubyTester& obj); 126 RubyTester& operator=(const RubyTester& obj); 127 128 CheckTable* m_checkTable_ptr; 129 Vector<Time> m_last_progress_vector; 130 131 uint64 m_checks_completed; 132 std::vector<CpuPort*> ports; 133 uint64 m_checks_to_complete; 134 int m_deadlock_threshold; 135 int m_num_cpu_sequencers; 136 int m_wakeup_frequency; 137}; 138 139inline std::ostream& 140operator<<(std::ostream& out, const RubyTester& obj) 141{ 142 obj.print(out); 143 out << std::flush; 144 return out; 145} 146 147#endif // __CPU_RUBYTEST_RUBYTESTER_HH__ 148