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 #include <LinearChain.h>
00022 #include <SingleCube.h>
00023
00024 using namespace std;
00025 using namespace SST;
00026
00027 #ifndef PHXSIMC_DBG
00028 #define PHXSIMC_DBG 0
00029 #endif
00030
00031 class PHXSimC : public Component {
00032
00033 public:
00034
00035 PHXSimC( ComponentId_t id, Params_t& params );
00036 int Finish();
00037
00038 private:
00039
00040 typedef MemoryChannel<uint64_t> memChan_t;
00041
00042 private:
00043
00044 PHXSimC( const PHXSimC& c );
00045 bool clock( Cycle_t );
00046
00047 #if 0
00048 inline bool convertType( memChan_t::event_t::reqType_t type );
00049 #else
00050
00051 inline PHXSim::TransactionType convertType( memChan_t::event_t::reqType_t type );
00052 #endif
00053
00054 void readData(uint64_t addr, uint64_t clockcycle);
00055 void writeData(uint64_t addr, uint64_t clockcycle);
00056
00057 std::deque<PHXSim::Transaction> m_transQ;
00058 PHXSim::LinearChain* m_memorySystem;
00059 memChan_t* m_memChan;
00060 std::string m_printStats;
00061 Log< PHXSIMC_DBG >& m_dbg;
00062 Log<>& m_log;
00063
00064 #if WANT_CHECKPOINT_SUPPORT
00065 BOOST_SERIALIZE {
00066 _AR_DBG(PHXSimC,"start\n");
00067 BOOST_VOID_CAST_REGISTER( PHXSimC*, Component* );
00068 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Component );
00069 ar & BOOST_SERIALIZATION_NVP( bus );
00070 _AR_DBG(PHXSimC,"done\n");
00071 }
00072 SAVE_CONSTRUCT_DATA( PHXSimC ) {
00073 _AR_DBG(PHXSimC,"\n");
00074 ComponentId_t id = t->_id;
00075 Clock* clock = t->_clock;
00076 Params_t params = t->params;
00077 ar << BOOST_SERIALIZATION_NVP( id );
00078 ar << BOOST_SERIALIZATION_NVP( clock );
00079 ar << BOOST_SERIALIZATION_NVP( params );
00080 }
00081 LOAD_CONSTRUCT_DATA( PHXSimC ) {
00082 _AR_DBG(PHXSimC,"\n");
00083 ComponentId_t id;
00084 Clock* clock;
00085 Params_t params;
00086 ar >> BOOST_SERIALIZATION_NVP( id );
00087 ar >> BOOST_SERIALIZATION_NVP( clock );
00088 ar >> BOOST_SERIALIZATION_NVP( params );
00089 ::new(t)PHXSimC( id, clock, params );
00090 }
00091 #endif
00092 };
00093 #if 0
00094
00095 inline bool
00096 PHXSimC::convertType( memChan_t::event_t::reqType_t type )
00097 {
00098 switch( type ) {
00099 case memChan_t::event_t::READ:
00100 return false;
00101 case memChan_t::event_t::WRITE:
00102 return true;
00103 }
00104 return false;
00105 }
00106 #else
00107
00108 inline PHXSim::TransactionType
00109 PHXSimC::convertType( memChan_t::event_t::reqType_t type )
00110 {
00111 switch( type ) {
00112 case memChan_t::event_t::READ:
00113 return PHXSim::DATA_READ;
00114 case memChan_t::event_t::WRITE:
00115 return PHXSim::DATA_WRITE;
00116 case memChan_t::event_t::RMW:
00117 return PHXSim::DATA_RMW;
00118 }
00119 return (PHXSim::TransactionType)-1;
00120 }
00121
00122 #endif
00123
00124 #endif