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