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