Message.hh revision 10074
1196Sstever@eecs.umich.edu/*
22Ssraasch@umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
3196Sstever@eecs.umich.edu * All rights reserved.
42Ssraasch@umich.edu *
52Ssraasch@umich.edu * Redistribution and use in source and binary forms, with or without
6196Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
7196Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
8196Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
9196Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
10196Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
11196Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
12196Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
13196Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
14196Sstever@eecs.umich.edu * this software without specific prior written permission.
15196Sstever@eecs.umich.edu *
162Ssraasch@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17196Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18196Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19196Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20196Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21196Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22196Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23196Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24196Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25196Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26196Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27196Sstever@eecs.umich.edu */
28196Sstever@eecs.umich.edu
29196Sstever@eecs.umich.edu#ifndef __MEM_RUBY_SLICC_INTERFACE_MESSAGE_HH__
302Ssraasch@umich.edu#define __MEM_RUBY_SLICC_INTERFACE_MESSAGE_HH__
31196Sstever@eecs.umich.edu
32196Sstever@eecs.umich.edu#include <iostream>
33196Sstever@eecs.umich.edu
34196Sstever@eecs.umich.edu#include "base/refcnt.hh"
35196Sstever@eecs.umich.edu#include "mem/packet.hh"
36196Sstever@eecs.umich.edu
37196Sstever@eecs.umich.educlass Message;
38196Sstever@eecs.umich.edutypedef RefCountingPtr<Message> MsgPtr;
39196Sstever@eecs.umich.edu
402Ssraasch@umich.educlass Message : public RefCounted
412Ssraasch@umich.edu{
42196Sstever@eecs.umich.edu  public:
432Ssraasch@umich.edu    Message(Tick curTime)
44354Sstever@eecs.umich.edu        : m_time(curTime),
45354Sstever@eecs.umich.edu          m_LastEnqueueTime(curTime),
46354Sstever@eecs.umich.edu          m_DelayedTicks(0)
47354Sstever@eecs.umich.edu    { }
48354Sstever@eecs.umich.edu
49354Sstever@eecs.umich.edu    Message(const Message &other)
50354Sstever@eecs.umich.edu        : m_time(other.m_time),
51354Sstever@eecs.umich.edu          m_LastEnqueueTime(other.m_LastEnqueueTime),
52354Sstever@eecs.umich.edu          m_DelayedTicks(other.m_DelayedTicks)
53354Sstever@eecs.umich.edu    { }
54354Sstever@eecs.umich.edu
55196Sstever@eecs.umich.edu    virtual ~Message() { }
56196Sstever@eecs.umich.edu
57354Sstever@eecs.umich.edu    virtual Message* clone() const = 0;
58354Sstever@eecs.umich.edu    virtual void print(std::ostream& out) const = 0;
59354Sstever@eecs.umich.edu    virtual void setIncomingLink(int) {}
60354Sstever@eecs.umich.edu    virtual void setVnet(int) {}
61354Sstever@eecs.umich.edu
62354Sstever@eecs.umich.edu    /**
632Ssraasch@umich.edu     * The two functions below are used for reading / writing the message
64354Sstever@eecs.umich.edu     * functionally. The methods return true if the address in the packet
65354Sstever@eecs.umich.edu     * matches the address / address range in the message. Each message
66354Sstever@eecs.umich.edu     * class that can be potentially searched for the address needs to
67354Sstever@eecs.umich.edu     * implement these methods.
68354Sstever@eecs.umich.edu     */
69354Sstever@eecs.umich.edu    virtual bool functionalRead(Packet *pkt) = 0;
70354Sstever@eecs.umich.edu    //{ fatal("Read functional access not implemented!"); }
71354Sstever@eecs.umich.edu    virtual bool functionalWrite(Packet *pkt) = 0;
722Ssraasch@umich.edu    //{ fatal("Write functional access not implemented!"); }
73354Sstever@eecs.umich.edu
74354Sstever@eecs.umich.edu    //! Update the delay this message has experienced so far.
75354Sstever@eecs.umich.edu    void updateDelayedTicks(Tick curTime)
76354Sstever@eecs.umich.edu    {
77354Sstever@eecs.umich.edu        assert(m_LastEnqueueTime <= curTime);
78354Sstever@eecs.umich.edu        Tick delta = curTime - m_LastEnqueueTime;
79354Sstever@eecs.umich.edu        m_DelayedTicks += delta;
802Ssraasch@umich.edu    }
81196Sstever@eecs.umich.edu    const Tick getDelayedTicks() const {return m_DelayedTicks;}
82196Sstever@eecs.umich.edu
832Ssraasch@umich.edu    void setLastEnqueueTime(const Tick& time) { m_LastEnqueueTime = time; }
84196Sstever@eecs.umich.edu    const Tick getLastEnqueueTime() const {return m_LastEnqueueTime;}
852Ssraasch@umich.edu
86196Sstever@eecs.umich.edu    const Tick& getTime() const { return m_time; }
87196Sstever@eecs.umich.edu    void setTime(const Tick& new_time) { m_time = new_time; }
88196Sstever@eecs.umich.edu
892Ssraasch@umich.edu  private:
90408Sstever@eecs.umich.edu    Tick m_time;
91408Sstever@eecs.umich.edu    Tick m_LastEnqueueTime; // my last enqueue time
92408Sstever@eecs.umich.edu    Tick m_DelayedTicks; // my delayed cycles
93408Sstever@eecs.umich.edu};
94196Sstever@eecs.umich.edu
95196Sstever@eecs.umich.eduinline std::ostream&
96196Sstever@eecs.umich.eduoperator<<(std::ostream& out, const Message& obj)
97196Sstever@eecs.umich.edu{
982Ssraasch@umich.edu    obj.print(out);
99196Sstever@eecs.umich.edu    out << std::flush;
100196Sstever@eecs.umich.edu    return out;
101196Sstever@eecs.umich.edu}
1022Ssraasch@umich.edu
103196Sstever@eecs.umich.edu#endif // __MEM_RUBY_SLICC_INTERFACE_MESSAGE_HH__
104196Sstever@eecs.umich.edu