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