WireBuffer.hh revision 8191
16242Sgblack@eecs.umich.edu/*
27093Sgblack@eecs.umich.edu * Copyright (c) 2010 Advanced Micro Devices, Inc.
37093Sgblack@eecs.umich.edu * All rights reserved.
47093Sgblack@eecs.umich.edu *
57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
146242Sgblack@eecs.umich.edu * this software without specific prior written permission.
156242Sgblack@eecs.umich.edu *
166242Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176242Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186242Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196242Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206242Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216242Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226242Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236242Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246242Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256242Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266242Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276242Sgblack@eecs.umich.edu *
286242Sgblack@eecs.umich.edu * Author: Lisa Hsu
296242Sgblack@eecs.umich.edu *
306242Sgblack@eecs.umich.edu */
316242Sgblack@eecs.umich.edu
326242Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_SYSTEM_WIREBUFFER_HH__
336242Sgblack@eecs.umich.edu#define __MEM_RUBY_SYSTEM_WIREBUFFER_HH__
346242Sgblack@eecs.umich.edu
356242Sgblack@eecs.umich.edu#include <iostream>
366242Sgblack@eecs.umich.edu#include <vector>
376242Sgblack@eecs.umich.edu#include <string>
386242Sgblack@eecs.umich.edu
396242Sgblack@eecs.umich.edu#include "mem/ruby/buffers/MessageBufferNode.hh"
406242Sgblack@eecs.umich.edu#include "mem/ruby/common/Global.hh"
416242Sgblack@eecs.umich.edu#include "mem/ruby/eventqueue/RubyEventQueue.hh"
426242Sgblack@eecs.umich.edu#include "params/RubyWireBuffer.hh"
436242Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
446242Sgblack@eecs.umich.edu
456242Sgblack@eecs.umich.edu
466242Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////////
476242Sgblack@eecs.umich.edu// This object was written to literally mimic a Wire in Ruby, in the sense
486242Sgblack@eecs.umich.edu// that there is no way for messages to get reordered en route on the WireBuffer.
496242Sgblack@eecs.umich.edu// With Message Buffers, even if randomization is off and ordered is on,
506242Sgblack@eecs.umich.edu// messages can arrive in different orders than they were sent because of
516242Sgblack@eecs.umich.edu// network issues. This mimics a Wire, such that that is not possible. This can
526242Sgblack@eecs.umich.edu// allow for messages between closely coupled controllers that are not actually
536242Sgblack@eecs.umich.edu// separated by a network in real systems to simplify coherence.
546242Sgblack@eecs.umich.edu/////////////////////////////////////////////////////////////////////////////
556242Sgblack@eecs.umich.edu
566242Sgblack@eecs.umich.educlass Consumer;
576242Sgblack@eecs.umich.educlass Message;  // I added this and removed Message.hh
586242Sgblack@eecs.umich.edu
596242Sgblack@eecs.umich.educlass WireBuffer : public SimObject
606242Sgblack@eecs.umich.edu{
616242Sgblack@eecs.umich.edu  public:
626242Sgblack@eecs.umich.edu    typedef RubyWireBufferParams Params;
636242Sgblack@eecs.umich.edu    WireBuffer(const Params *p);
646242Sgblack@eecs.umich.edu    void init();
657111Sgblack@eecs.umich.edu
666242Sgblack@eecs.umich.edu    ~WireBuffer();
676242Sgblack@eecs.umich.edu
686242Sgblack@eecs.umich.edu    void wakeup();
696242Sgblack@eecs.umich.edu
707408Sgblack@eecs.umich.edu    void setConsumer(Consumer* consumer_ptr)
716735Sgblack@eecs.umich.edu    {
726242Sgblack@eecs.umich.edu        m_consumer_ptr = consumer_ptr;
736242Sgblack@eecs.umich.edu    }
746242Sgblack@eecs.umich.edu    Consumer* getConsumer() { return m_consumer_ptr; };
756723Sgblack@eecs.umich.edu    void setDescription(const std::string& name) { m_description = name; };
766242Sgblack@eecs.umich.edu    std::string getDescription() { return m_description; };
776242Sgblack@eecs.umich.edu
786261Sgblack@eecs.umich.edu    void enqueue(MsgPtr message, int latency );
796403Sgblack@eecs.umich.edu    void dequeue();
806403Sgblack@eecs.umich.edu    const Message* peek();
817783SGiacomo.Gabrielli@arm.com    MessageBufferNode peekNode();
827783SGiacomo.Gabrielli@arm.com    void recycle();
836403Sgblack@eecs.umich.edu    bool isReady();
847325Sgblack@eecs.umich.edu    bool areNSlotsAvailable(int n) { return true; };  // infinite queue length
857325Sgblack@eecs.umich.edu
867400SAli.Saidi@ARM.com    void printConfig(std::ostream& out);
877350SAli.Saidi@ARM.com    void print(std::ostream& out) const;
887259Sgblack@eecs.umich.edu    void clearStats() const;
897259Sgblack@eecs.umich.edu    void printStats(std::ostream& out) const;
907259Sgblack@eecs.umich.edu
917259Sgblack@eecs.umich.edu//    int m_dummy;
927264Sgblack@eecs.umich.edu    uint64_t m_msg_counter;
937267Sgblack@eecs.umich.edu
947285Sgblack@eecs.umich.edu  private:
957265Sgblack@eecs.umich.edu    // Private copy constructor and assignment operator
967266Sgblack@eecs.umich.edu    WireBuffer (const WireBuffer& obj);
977266Sgblack@eecs.umich.edu    WireBuffer& operator=(const WireBuffer& obj);
987266Sgblack@eecs.umich.edu
997268Sgblack@eecs.umich.edu    // data members
1007272Sgblack@eecs.umich.edu    Consumer* m_consumer_ptr;  // Consumer to signal a wakeup()
1017272Sgblack@eecs.umich.edu    std::string m_description;
1027271Sgblack@eecs.umich.edu
1037273Sgblack@eecs.umich.edu    // queues where memory requests live
1047287Sgblack@eecs.umich.edu    std::vector<MessageBufferNode> m_message_queue;
1057287Sgblack@eecs.umich.edu
1067274Sgblack@eecs.umich.edu};
1077275Sgblack@eecs.umich.edu
1087276Sgblack@eecs.umich.edu#endif // __MEM_RUBY_SYSTEM_WireBuffer_HH__
1097286Sgblack@eecs.umich.edu