00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _XBAR_H
00014 #define _XBAR_H
00015
00016 #include <sst/core/eventFunctor.h>
00017 #include <sst/core/component.h>
00018 #include <sst/core/log.h>
00019 #include <sst/elements/include/memoryChannel.h>
00020 #include <sst/elements/include/memMap.h>
00021
00022 #ifndef XBARV2_DBG
00023 #define XBARV2_DBG 0
00024 #endif
00025
00026 using namespace SST;
00027
00028 class XbarV2 : public Component
00029 {
00030 class Port;
00031 typedef MemoryChannel< uint64_t, Port* > memChan_t;
00032 typedef memChan_t::addr_t addr_t;
00033 typedef memChan_t::event_t event_t;
00034 typedef memChan_t::cookie_t cookie_t;
00035 typedef uint64_t length_t;
00036
00037 typedef MemMap< addr_t, length_t, Port* > memMap_t;
00038
00039 struct Entry {
00040 event_t* event;
00041 Cycle_t timeStamp;
00042 cookie_t cookie;
00043 };
00044
00045 typedef std::vector< std::vector< Entry > > entryV_t;
00046
00047 class Port {
00048
00049 public:
00050 Port( Component&, memMap_t&, entryV_t&,
00051 int numPorts, int portNum,
00052 addr_t addr = 0, length_t length = 0,
00053 bool enableDbg = false );
00054 void doInput( Cycle_t );
00055 void doOutput( );
00056
00057 private:
00058 Port();
00059 Port( const Port& );
00060
00061 Port* findDstPort( addr_t addr );
00062
00063 private:
00064
00065 memChan_t* m_memChan;
00066 int m_portNum;
00067 int m_numPorts;
00068 memMap_t& m_memMap;
00069 event_t* m_curEvent;
00070 cookie_t m_curCookie;
00071 entryV_t& m_entryV;
00072 Log< XBARV2_DBG >& m_dbg;
00073 };
00074
00075 public:
00076
00077 XbarV2( ComponentId_t id, Params_t& params );
00078
00079 private:
00080
00081 XbarV2();
00082 XbarV2( const XbarV2& c );
00083
00084 bool clock( Cycle_t );
00085 void initPort( int port, Params_t& );
00086
00087 private:
00088
00089 std::vector<Port *> m_portInfoV;
00090 int m_numPorts;
00091 memMap_t m_memMap;
00092 entryV_t m_entryV;
00093 Log< XBARV2_DBG >& m_dbg;
00094 Log<>& m_log;
00095 };
00096
00097 #endif