00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SHAREDMEMORY_H
00014 #define SHAREDMEMORY_H
00015
00016 #include "memory.h"
00017 #include <vector>
00018
00019
00020
00021
00022
00023
00024
00025
00026 class sharedMemProc {
00027 public:
00028 virtual ~sharedMemProc() {;}
00029 virtual void busReadMiss(simAddress)=0;
00030 virtual void busWriteMiss(simAddress)=0;
00031 virtual void busWriteHit(simAddress)=0;
00032 };
00033
00034
00035
00036
00037
00038
00039
00040 class sharedMemory : public memory_interface {
00041 base_memory *myMem;
00042
00043 vector<sharedMemProc*> procs;
00044 public:
00045
00046 typedef enum {READ_MISS, WRITE_MISS, WRITE_HIT} msgType;
00047
00048 void registerProcessor(sharedMemProc* p) {procs.push_back(p);}
00049
00050 virtual void registerPost() = 0;
00051
00052 int postMessage(msgType t, simAddress addr, sharedMemProc* poster) {
00053 int nP = procs.size();
00054 for(int i=0; i < nP; ++i) {
00055 sharedMemProc* targP = procs[i];
00056 if (targP != poster) {
00057 switch(t) {
00058 case READ_MISS:
00059 targP->busReadMiss(addr); break;
00060 case WRITE_MISS:
00061 targP->busWriteMiss(addr); break;
00062 case WRITE_HIT:
00063 targP->busWriteHit(addr); break;
00064 default:
00065 printf("unknown bus message tyoe %d\n", t);
00066 }
00067 }
00068 }
00069 registerPost();
00070 return 0;
00071 }
00072
00073 #define MEM_FUNC_GEN(S) \
00074 virtual uint##S ReadMemory##S(const simAddress sa, const bool s) { \
00075 return myMem->ReadMemory##S(sa, s); \
00076 } \
00077 virtual bool WriteMemory##S(const simAddress sa, const uint##S d, const bool s) { \
00078 return myMem->WriteMemory##S(sa, d, s); \
00079 }
00080
00081 MEM_FUNC_GEN(8)
00082 MEM_FUNC_GEN(16)
00083 MEM_FUNC_GEN(32)
00084
00085 virtual uint8 getFE(const simAddress sa) {return myMem->getFE(sa);}
00086 virtual void setFE(const simAddress sa, const uint8 FEValue) {
00087 myMem->setFE(sa, FEValue);
00088 }
00089 virtual void squashSpec() {myMem->squashSpec();}
00090
00091
00092 base_memory *getBaseMem() {return myMem;}
00093
00094 sharedMemory(string cfgstr) {myMem = new base_memory(cfgstr);}
00095 ~sharedMemory() {
00096 delete myMem;
00097 }
00098 virtual void setup()=0;
00099 virtual void finish()=0;
00100 virtual void handleParcel(parcel *p)=0;
00101 virtual void preTic()=0;
00102 virtual void postTic()=0;
00103 };
00104
00105
00106 #endif