00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _PHXSIMC_H
00014 #define _PHXSIMC_H
00015
00016 #include <sst/core/log.h>
00017 #include <sst/core/eventFunctor.h>
00018 #include <sst/core/component.h>
00019 #include <memoryChannel.h>
00020 #include <Callback.h>
00021
00022 #include <SingleCube.h>
00023
00024
00025 #define TEST_MODE
00026
00027 using namespace std;
00028 using namespace SST;
00029
00030 #ifndef PHXSIMC_DBG
00031 #define PHXSIMC_DBG
00032 #endif
00033
00034 class PHXSimC : public Component {
00035
00036 public:
00037
00038 PHXSimC( ComponentId_t id, Params_t& params );
00039 int Finish();
00040
00041 private:
00042
00043 typedef MemoryChannel<uint64_t> memChan_t;
00044
00045 private:
00046
00047 PHXSimC( const PHXSimC& c );
00048 bool clock( Cycle_t );
00049
00050 inline PHXSim::PacketType convertType( memChan_t::event_t::reqType_t type );
00051 void packetReturn(PHXSim::Packet *pkt, uint64_t clockcycle);
00052
00053 std::deque<PHXSim::Packet *> m_transQ;
00054
00055 std::map <unsigned, PHXSim::Packet *> writeReturnMap;
00056 PHXSim::SingleCube * m_memorySystem;
00057 memChan_t* m_memChan;
00058 std::string m_printStats;
00059 Log< PHXSIMC_DBG >& m_dbg;
00060 Log<>& m_log;
00061
00062 #if WANT_CHECKPOINT_SUPPORT
00063 BOOST_SERIALIZE {
00064 _AR_DBG(PHXSimC,"start\n");
00065 BOOST_VOID_CAST_REGISTER( PHXSimC*, Component* );
00066 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Component );
00067 ar & BOOST_SERIALIZATION_NVP( bus );
00068 _AR_DBG(PHXSimC,"done\n");
00069 }
00070 SAVE_CONSTRUCT_DATA( PHXSimC ) {
00071 _AR_DBG(PHXSimC,"\n");
00072 ComponentId_t id = t->_id;
00073 Clock* clock = t->_clock;
00074 Params_t params = t->params;
00075 ar << BOOST_SERIALIZATION_NVP( id );
00076 ar << BOOST_SERIALIZATION_NVP( clock );
00077 ar << BOOST_SERIALIZATION_NVP( params );
00078 }
00079 LOAD_CONSTRUCT_DATA( PHXSimC ) {
00080 _AR_DBG(PHXSimC,"\n");
00081 ComponentId_t id;
00082 Clock* clock;
00083 Params_t params;
00084 ar >> BOOST_SERIALIZATION_NVP( id );
00085 ar >> BOOST_SERIALIZATION_NVP( clock );
00086 ar >> BOOST_SERIALIZATION_NVP( params );
00087 ::new(t)PHXSimC( id, clock, params );
00088 }
00089 #endif
00090 };
00091
00092 inline PHXSim::PacketType
00093 PHXSimC::convertType( memChan_t::event_t::reqType_t type )
00094 {
00095 #ifndef TEST_MODE
00096 switch( type ) {
00097 case memChan_t::event_t::READ:
00098 return PHXSim::DATA_READ;
00099 case memChan_t::event_t::WRITE:
00100 return PHXSim::DATA_WRITE;
00101 }
00102 m_dbg.write("WARNING: Returning Bogus packet type from request type %d\n", type);
00103 return (PHXSim::PacketType)-1;
00104 #else
00105
00106 static int number=1;
00107 PHXSim::PacketType p = (number++ % 64) == 0 ? PHXSim::DATA_READ : PHXSim::DATA_WRITE;
00108 m_dbg.write("==============WARNING: TEST_MODE (%d, type=%d)==============\n", number, p);
00109 return p;
00110 #endif
00111 }
00112
00113 #endif
00114