AccessTraceForAddress.cc revision 6145
16145Snate@binkert.org 26145Snate@binkert.org/* 36145Snate@binkert.org * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 46145Snate@binkert.org * All rights reserved. 56145Snate@binkert.org * 66145Snate@binkert.org * Redistribution and use in source and binary forms, with or without 76145Snate@binkert.org * modification, are permitted provided that the following conditions are 86145Snate@binkert.org * met: redistributions of source code must retain the above copyright 96145Snate@binkert.org * notice, this list of conditions and the following disclaimer; 106145Snate@binkert.org * redistributions in binary form must reproduce the above copyright 116145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 126145Snate@binkert.org * documentation and/or other materials provided with the distribution; 136145Snate@binkert.org * neither the name of the copyright holders nor the names of its 146145Snate@binkert.org * contributors may be used to endorse or promote products derived from 156145Snate@binkert.org * this software without specific prior written permission. 166145Snate@binkert.org * 176145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286145Snate@binkert.org */ 296145Snate@binkert.org 306145Snate@binkert.org/* 316145Snate@binkert.org * $Id$ 326145Snate@binkert.org * 336145Snate@binkert.org */ 346145Snate@binkert.org 356145Snate@binkert.org#include "AccessTraceForAddress.hh" 366145Snate@binkert.org#include "Histogram.hh" 376145Snate@binkert.org 386145Snate@binkert.orgAccessTraceForAddress::AccessTraceForAddress() 396145Snate@binkert.org{ 406145Snate@binkert.org m_histogram_ptr = NULL; 416145Snate@binkert.org} 426145Snate@binkert.org 436145Snate@binkert.orgAccessTraceForAddress::AccessTraceForAddress(const Address& addr) 446145Snate@binkert.org{ 456145Snate@binkert.org m_addr = addr; 466145Snate@binkert.org m_total = 0; 476145Snate@binkert.org m_loads = 0; 486145Snate@binkert.org m_stores = 0; 496145Snate@binkert.org m_atomics = 0; 506145Snate@binkert.org m_user = 0; 516145Snate@binkert.org m_sharing = 0; 526145Snate@binkert.org m_histogram_ptr = NULL; 536145Snate@binkert.org} 546145Snate@binkert.org 556145Snate@binkert.orgAccessTraceForAddress::~AccessTraceForAddress() 566145Snate@binkert.org{ 576145Snate@binkert.org if (m_histogram_ptr != NULL) { 586145Snate@binkert.org delete m_histogram_ptr; 596145Snate@binkert.org m_histogram_ptr = NULL; 606145Snate@binkert.org } 616145Snate@binkert.org} 626145Snate@binkert.org 636145Snate@binkert.orgvoid AccessTraceForAddress::print(ostream& out) const 646145Snate@binkert.org{ 656145Snate@binkert.org out << m_addr; 666145Snate@binkert.org 676145Snate@binkert.org if (m_histogram_ptr == NULL) { 686145Snate@binkert.org out << " " << m_total; 696145Snate@binkert.org out << " | " << m_loads; 706145Snate@binkert.org out << " " << m_stores; 716145Snate@binkert.org out << " " << m_atomics; 726145Snate@binkert.org out << " | " << m_user; 736145Snate@binkert.org out << " " << m_total-m_user; 746145Snate@binkert.org out << " | " << m_sharing; 756145Snate@binkert.org out << " | " << m_touched_by.count(); 766145Snate@binkert.org } else { 776145Snate@binkert.org assert(m_total == 0); 786145Snate@binkert.org out << " " << (*m_histogram_ptr); 796145Snate@binkert.org } 806145Snate@binkert.org} 816145Snate@binkert.org 826145Snate@binkert.orgvoid AccessTraceForAddress::update(CacheRequestType type, AccessModeType access_mode, NodeID cpu, bool sharing_miss) 836145Snate@binkert.org{ 846145Snate@binkert.org m_touched_by.add(cpu); 856145Snate@binkert.org m_total++; 866145Snate@binkert.org if(type == CacheRequestType_ATOMIC) { 876145Snate@binkert.org m_atomics++; 886145Snate@binkert.org } else if(type == CacheRequestType_LD){ 896145Snate@binkert.org m_loads++; 906145Snate@binkert.org } else if (type == CacheRequestType_ST){ 916145Snate@binkert.org m_stores++; 926145Snate@binkert.org } else { 936145Snate@binkert.org // ERROR_MSG("Trying to add invalid access to trace"); 946145Snate@binkert.org } 956145Snate@binkert.org 966145Snate@binkert.org if (access_mode == AccessModeType_UserMode) { 976145Snate@binkert.org m_user++; 986145Snate@binkert.org } 996145Snate@binkert.org 1006145Snate@binkert.org if (sharing_miss) { 1016145Snate@binkert.org m_sharing++; 1026145Snate@binkert.org } 1036145Snate@binkert.org} 1046145Snate@binkert.org 1056145Snate@binkert.orgint AccessTraceForAddress::getTotal() const 1066145Snate@binkert.org{ 1076145Snate@binkert.org if (m_histogram_ptr == NULL) { 1086145Snate@binkert.org return m_total; 1096145Snate@binkert.org } else { 1106145Snate@binkert.org return m_histogram_ptr->getTotal(); 1116145Snate@binkert.org } 1126145Snate@binkert.org} 1136145Snate@binkert.org 1146145Snate@binkert.orgvoid AccessTraceForAddress::addSample(int value) 1156145Snate@binkert.org{ 1166145Snate@binkert.org assert(m_total == 0); 1176145Snate@binkert.org if (m_histogram_ptr == NULL) { 1186145Snate@binkert.org m_histogram_ptr = new Histogram; 1196145Snate@binkert.org } 1206145Snate@binkert.org m_histogram_ptr->add(value); 1216145Snate@binkert.org} 1226145Snate@binkert.org 1236145Snate@binkert.orgbool node_less_then_eq(const AccessTraceForAddress* n1, const AccessTraceForAddress* n2) 1246145Snate@binkert.org{ 1256145Snate@binkert.org return (n1->getTotal() > n2->getTotal()); 1266145Snate@binkert.org} 127