00001
00002 #ifndef LOADSTOREUNIT_H
00003 #define LOADSTOREUNIT_H
00004
00005 #include <OpteronDefs.h>
00006 #include <OffCpuIF.h>
00007
00008 class Token;
00009 class MemoryModel;
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 class LoadStoreUnit
00022 {
00023 public:
00024 LoadStoreUnit(unsigned int numSlots, unsigned int maxOpsPerCycle,
00025 MemoryModel *memModel, OffCpuIF *extIF);
00026 ~LoadStoreUnit();
00027 unsigned int add(Token *token, CycleCount atCycle);
00028 void updateStatus(CycleCount currentCycle);
00029 private:
00030 unsigned int addLoad(Token *token, CycleCount atCycle);
00031 unsigned int addStore(Token *token, CycleCount atCycle);
00032 enum LSType { EMPTY, LOAD, STORE };
00033
00034 struct LSSlot {
00035 Token *token;
00036 LSType type;
00037 CycleCount startCycle;
00038 CycleCount satisfiedCycle;
00039 };
00040 LSSlot *slots;
00041 unsigned int numSlots;
00042 unsigned int numFilled;
00043 unsigned int maxMemOpsPerCycle;
00044 unsigned long long fullStalls;
00045 MemoryModel *memoryModel;
00046 OffCpuIF *externalIF;
00047 };
00048
00049 #endif