00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _CPU_H
00014 #define _CPU_H
00015
00016 #include <sst/core/eventFunctor.h>
00017 #include <sst/core/component.h>
00018 #include <sst/core/link.h>
00019 #include <sst/core/timeConverter.h>
00020
00021 using namespace SST;
00022
00023 #if DBG_CPU
00024 #define _CPU_DBG( fmt, args...)\
00025 printf( "%d:Cpu::%s():%d: "fmt, _debug_rank, __FUNCTION__,__LINE__, ## args )
00026 #else
00027 #define _CPU_DBG( fmt, args...)
00028 #endif
00029
00030 class Cpu : public Component {
00031 typedef enum { WAIT, SEND } state_t;
00032 typedef enum { WHO_NIC, WHO_MEM } who_t;
00033 public:
00034 Cpu( ComponentId_t id, Params_t& params ) :
00035 Component( id ),
00036 params( params ),
00037 state(SEND),
00038 who(WHO_MEM),
00039 frequency( "2.2GHz" )
00040 {
00041 _CPU_DBG( "new id=%lu\n", id );
00042
00043 registerExit();
00044
00045 Params_t::iterator it = params.begin();
00046 while( it != params.end() ) {
00047 _CPU_DBG("key=%s value=%s\n",
00048 it->first.c_str(),it->second.c_str());
00049 if ( ! it->first.compare("clock") ) {
00050
00051 frequency = it->second;
00052 }
00053 ++it;
00054 }
00055
00056 mem = LinkAdd( "MEM" );
00057
00058
00059 handler = new EventHandler< Cpu, bool, Cycle_t >
00060 ( this, &Cpu::clock );
00061 _CPU_DBG("-->frequency=%s\n",frequency.c_str());
00062 TimeConverter* tc = registerClock( frequency, handler );
00063 printf("CPU period: %ld\n",(long int) tc->getFactor());
00064 _CPU_DBG("Done registering clock\n");
00065
00066 }
00067 int Setup() {
00068 _CPU_DBG("\n");
00069 return 0;
00070 }
00071 int Finish() {
00072 _CPU_DBG("\n");
00073 return 0;
00074 }
00075
00076 private:
00077
00078 Cpu( const Cpu& c );
00079 Cpu() {}
00080
00081 bool clock( Cycle_t );
00082 bool handler1( Time_t time, Event *e );
00083
00084 ClockHandler_t* handler;
00085 Params_t params;
00086 Link* mem;
00087 state_t state;
00088 who_t who;
00089 std::string frequency;
00090
00091 friend class boost::serialization::access;
00092 template<class Archive>
00093 void serialize(Archive & ar, const unsigned int version )
00094 {
00095 boost::serialization::base_object<Component>(*this);
00096 ar & BOOST_SERIALIZATION_NVP(handler);
00097 ar & BOOST_SERIALIZATION_NVP(params);
00098 ar & BOOST_SERIALIZATION_NVP(mem);
00099 ar & BOOST_SERIALIZATION_NVP(state);
00100 ar & BOOST_SERIALIZATION_NVP(who);
00101 ar & BOOST_SERIALIZATION_NVP(frequency);
00102 }
00103 };
00104
00105 #endif