00001 00002 #include <iostream> 00003 #include <vector> 00004 00005 #include "interconnect_interface.hh" 00006 00007 using namespace std; 00008 00009 void 00010 InterconnectInterface::setBlocked(){ 00011 if(!blocked){ 00012 blocked = true; 00013 thisInterconnect->setBlocked(interfaceID); 00014 } 00015 } 00016 00017 void 00018 InterconnectInterface::clearBlocked(){ 00019 if(blocked){ 00020 blocked = false; 00021 thisInterconnect->clearBlocked(interfaceID); 00022 } 00023 } 00024 00025 void 00026 InterconnectInterface::getRange(std::list<Range<Addr> > &range_list) 00027 { 00028 for (int i = 0; i < ranges.size(); ++i) { 00029 range_list.push_back(ranges[i]); 00030 } 00031 } 00032 00033 void 00034 InterconnectInterface::rangeChange(){ 00035 thisInterconnect->rangeChange(); 00036 } 00037 00038 00039 void 00040 InterconnectInterface::setAddrRange(list<Range<Addr> > &range_list){ 00041 ranges.clear(); 00042 while (!range_list.empty()) { 00043 ranges.push_back(range_list.front()); 00044 range_list.pop_front(); 00045 } 00046 rangeChange(); 00047 } 00048 00049 void 00050 InterconnectInterface::addAddrRange(const Range<Addr> &range){ 00051 ranges.push_back(range); 00052 rangeChange(); 00053 } 00054 00055 void 00056 InterconnectInterface::getSendSample(int* data, 00057 int* inst, 00058 int* coherence, 00059 int* total){ 00060 00061 // start profiling if this is the first call to this function 00062 if(!doProfiling) doProfiling = true; 00063 00064 // return the sampled values 00065 *data = dataSends; 00066 *inst = instSends; 00067 *coherence = coherenceSends; 00068 *total = totalSends; 00069 00070 // reset counters 00071 dataSends = 0; 00072 instSends = 0; 00073 coherenceSends = 0; 00074 totalSends = 0; 00075 } 00076 00077 void 00078 InterconnectInterface::updateProfileValues(MemReqPtr &req){ 00079 00080 if(doProfiling){ 00081 if(req->cmd.isDirectoryMessage()){ 00082 coherenceSends++; 00083 } 00084 else if(req->readOnlyCache){ 00085 instSends++; 00086 } 00087 else{ 00088 dataSends++; 00089 } 00090 totalSends++; 00091 } 00092 }