00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef PROC_H_
00013 #define PROC_H_
00014
00015 #include "sst/core/eventFunctor.h"
00016 #include "sst/core/component.h"
00017 #include <sst/core/link.h>
00018 #include <sst/core/cpunicEvent.h>
00019 #include <memory.h>
00020 #include "fe_memory.h"
00021
00022 #include "ssBackEnd/ssb_mainProc.h"
00023 #include "FE/thread.h"
00024 #include "FE/processor.h"
00025
00026 using namespace SST;
00027
00028 #define DBG_GPROC 1
00029 #if DBG_GPROC
00030 #define _GPROC_DBG( lvl, fmt, args...)\
00031 if (gproc_debug >= lvl) { \
00032 printf( "%d:genericProc::%s():%d: "fmt, _debug_rank,__FUNCTION__,__LINE__, ## args ); \
00033 }
00034 #else
00035 #define _GPROC_DBG( lvl, fmt, args...)
00036 #endif
00037
00038 #define TIME_MEM 1
00039
00040 extern int gproc_debug;
00041
00042
00043
00044 class proc : public processor {
00045
00046 #if WANT_CHECKPOINT_SUPPORT
00047 BOOST_SERIALIZE {
00048 _GPROC_DBG(1, "begin\n");
00049 BOOST_VOID_CAST_REGISTER(proc*,processor*);
00050 _GPROC_DBG(1, "base\n");
00051 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( processor );
00052 _GPROC_DBG(1, "links\n");
00053 ar & BOOST_SERIALIZATION_NVP( memLinks );
00054 ar & BOOST_SERIALIZATION_NVP( netLinks );
00055 _GPROC_DBG(1, "tSource\n");
00056 ar & BOOST_SERIALIZATION_NVP( tSource );
00057 _GPROC_DBG(1, "thread\n");
00058 ar & BOOST_SERIALIZATION_NVP( myThread );
00059 _GPROC_DBG(1, "ss\n");
00060 ar & BOOST_SERIALIZATION_NVP( ssBackEnd );
00061
00062 _GPROC_DBG(1, "end\n");
00063 }
00064 SAVE_CONSTRUCT_DATA( proc ) {
00065 _GPROC_DBG(1, "begin\n");
00066 ar << BOOST_SERIALIZATION_NVP( t->id );
00067 ar << BOOST_SERIALIZATION_NVP( t->params );
00068 _GPROC_DBG(1, "end\n");
00069 }
00070 LOAD_CONSTRUCT_DATA( proc ) {
00071 _GPROC_DBG(1, "begin\n");
00072 ComponentId_t id;
00073 Params_t params;
00074 ar >> BOOST_SERIALIZATION_NVP( id );
00075 ar >> BOOST_SERIALIZATION_NVP( params );
00076
00077 ::new(t)proc( id, params, 0 );
00078 }
00079 #endif
00080
00081
00082 typedef Memory< uint64_t, instruction* > memory_t;
00083
00084 std::vector< memory_t* > memory;
00085
00086 std::vector<Link*> netLinks;
00087
00088 threadSource tSource;
00089
00090 thread *myThread;
00091
00092 int ssBackEnd;
00093
00094 int externalMem;
00095
00096 int maxMMOut;
00097
00098 int cores;
00099
00100 int coherent;
00101
00102 int maxOutstandingSpecReq;
00103
00104 vector<mainProc *> mProcs;
00105
00106 vector <int> outstandingSpecReq;
00107
00108 typedef pair<int, uint64_t> memReqRec_t;
00109
00110 typedef map<instruction *, memReqRec_t> memReqMap_t;
00111
00112
00113
00114 memReqMap_t memReqMap;
00115
00116
00117
00118 memReqMap_t memSpecReqMap;
00119 instruction* onDeckInst;
00120
00121 #if TIME_MEM
00122 uint64_t totalMemReq;
00123 uint64_t totalSpecialMemReq;
00124 uint64_t numMemReq;
00125 uint64_t memReqLat;
00126 uint64_t memSpecialReqLat;
00127 uint64_t memStores;
00128 #endif
00129
00130 ClockHandler_t* clockHandler;
00131 EventHandler_t *NICeventHandler;
00132
00133 ComponentId_t id;
00134 Params_t& params;
00135
00136 bool addThread(thread *);
00137 void swapThreads(bool quanta, bool refill);
00138
00139
00140 bool needThreadSwap;
00141 std::deque<thread*> threadQ;
00142
00143 public:
00144
00145
00146 typedef enum {READ_MISS, WRITE_MISS, WRITE_HIT} msgType;
00147
00148 int postMessage(msgType t, simAddress addr, mainProc* poster);
00149
00150 void registerPost() {;};
00151 const bool isCoherent() const {return coherent;}
00152
00153 virtual int Setup();
00154 virtual int Finish();
00155 virtual bool preTic( Cycle_t );
00156 void processMemDevResp( );
00157 virtual bool handle_nic_events( Event* );
00158 proc(ComponentId_t id, Params_t& params);
00159 proc(ComponentId_t id, Params_t& params, int dummy);
00160
00161
00162 virtual int getNumCores() const {return mProcs.size();}
00163 virtual bool insertThread(thread*);
00164 virtual bool isLocal(const simAddress, const simPID);
00165 virtual bool spawnToCoProc(const PIM_coProc, thread* t, simRegister hint);
00166 virtual bool switchAddrMode(PIM_addrMode);
00167 virtual exceptType writeSpecial(const PIM_cmd, const int nargs,
00168 const uint *args);
00169 virtual bool forwardToNetsimNIC(int call_num, char *params,
00170 const size_t params_length,
00171 char *buf, const size_t buf_len);
00172 virtual bool pickupNetsimNIC(CPUNicEvent **event);
00173 virtual bool externalMemoryModel();
00174 virtual bool sendMemoryReq( instType, uint64_t address,
00175 instruction*, int mProcID);
00176 virtual bool sendMemoryParcel(uint64_t address, instruction *inst,
00177 int mProcID);
00178 };
00179
00180 #endif