00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _BUS_H
00014 #define _BUS_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 BUS_DBG
00023 #define BUS_DBG 0
00024 #endif
00025
00026 using namespace SST;
00027
00028 class Bus : public Component
00029 {
00030 private:
00031 class Device;
00032 typedef MemoryChannel< uint64_t, Device* > devChan_t;
00033 typedef devChan_t::event_t event_t;
00034 typedef devChan_t::addr_t addr_t;
00035 typedef devChan_t::cookie_t cookie_t;
00036 typedef uint64_t length_t;
00037 typedef MemMap< addr_t, length_t, Device* > memMap_t;
00038
00039 class Device {
00040
00041 public:
00042 Device( Component& comp, std::string name, Params_t );
00043 void clock( Cycle_t );
00044 bool send( event_t*, cookie_t );
00045 Cycle_t timeStamp();
00046 event_t* getReq();
00047 Bus::event_t::reqType_t doResp();
00048
00049 private:
00050 typedef std::pair< event_t*, cookie_t > respE_t;
00051 typedef std::pair< event_t*, Cycle_t > reqE_t;
00052
00053 reqE_t m_req;
00054 devChan_t* m_devChan;
00055 Log< BUS_DBG >& m_dbg;
00056 std::string m_name;
00057 };
00058
00059 struct AtBat {
00060 bool valid;
00061 event_t* event;
00062 Device* srcDev;
00063 Device* dstDev;
00064 };
00065
00066 public:
00067
00068 Bus( ComponentId_t id, Params_t& params );
00069 void initDevices( Params_t& params );
00070 void initDevice( std::string name, Params_t& params );
00071
00072 private:
00073
00074 Bus();
00075 Bus( const Bus& c );
00076
00077 bool clock( Cycle_t );
00078 bool doRead( event_t*, Device* src, Device* dst );
00079 bool doWrite( event_t*, Device* src, Device* dst );
00080
00081 private:
00082
00083 bool m_readBusy;
00084 bool m_writeBusy;
00085 memMap_t m_memMap;
00086 AtBat m_atBat;
00087 Log< BUS_DBG >& m_dbg;
00088 Log<>& m_log;
00089 };
00090
00091 #endif