114205Sandreas.sandberg@arm.com/* 214205Sandreas.sandberg@arm.com * Copyright (c) 2019 Arm Limited 314205Sandreas.sandberg@arm.com * All rights reserved 414205Sandreas.sandberg@arm.com * 514205Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 614205Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 714205Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 814205Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 914205Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1014205Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1114205Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1214205Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1314205Sandreas.sandberg@arm.com * 1414205Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1514205Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1614205Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1714205Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1814205Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1914205Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2014205Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2114205Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2214205Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2314205Sandreas.sandberg@arm.com * this software without specific prior written permission. 2414205Sandreas.sandberg@arm.com * 2514205Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2614205Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2714205Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2814205Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2914205Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3014205Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3114205Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3214205Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3314205Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3414205Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3514205Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3614205Sandreas.sandberg@arm.com * 3714205Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3814205Sandreas.sandberg@arm.com */ 3914205Sandreas.sandberg@arm.com 4014205Sandreas.sandberg@arm.com#include "base/stats/group.hh" 4114205Sandreas.sandberg@arm.com 4214205Sandreas.sandberg@arm.com#include <cassert> 4314205Sandreas.sandberg@arm.com 4414205Sandreas.sandberg@arm.com#include "base/stats/info.hh" 4514205Sandreas.sandberg@arm.com#include "base/trace.hh" 4614205Sandreas.sandberg@arm.com#include "debug/Stats.hh" 4714205Sandreas.sandberg@arm.com#include "sim/sim_object.hh" 4814205Sandreas.sandberg@arm.com 4914205Sandreas.sandberg@arm.comnamespace Stats { 5014205Sandreas.sandberg@arm.com 5114205Sandreas.sandberg@arm.comGroup::Group(Group *parent, const char *name) 5214205Sandreas.sandberg@arm.com : mergedParent(name ? nullptr : parent) 5314205Sandreas.sandberg@arm.com{ 5414205Sandreas.sandberg@arm.com if (parent && name) { 5514205Sandreas.sandberg@arm.com parent->addStatGroup(name, this); 5614205Sandreas.sandberg@arm.com } else if (parent && !name) { 5714205Sandreas.sandberg@arm.com parent->mergeStatGroup(this); 5814205Sandreas.sandberg@arm.com } 5914205Sandreas.sandberg@arm.com} 6014205Sandreas.sandberg@arm.com 6114205Sandreas.sandberg@arm.comGroup::~Group() 6214205Sandreas.sandberg@arm.com{ 6314205Sandreas.sandberg@arm.com} 6414205Sandreas.sandberg@arm.com 6514205Sandreas.sandberg@arm.comvoid 6614205Sandreas.sandberg@arm.comGroup::regStats() 6714205Sandreas.sandberg@arm.com{ 6814205Sandreas.sandberg@arm.com for (auto &g : mergedStatGroups) 6914205Sandreas.sandberg@arm.com g->regStats(); 7014205Sandreas.sandberg@arm.com 7114205Sandreas.sandberg@arm.com for (auto &g : statGroups) { 7214205Sandreas.sandberg@arm.com if (DTRACE(Stats)) { 7314267Stommarin@ucm.es const SimObject M5_VAR_USED *so = 7414267Stommarin@ucm.es dynamic_cast<const SimObject *>(this); 7514205Sandreas.sandberg@arm.com DPRINTF(Stats, "%s: regStats in group %s\n", 7614205Sandreas.sandberg@arm.com so ? so->name() : "?", 7714205Sandreas.sandberg@arm.com g.first); 7814205Sandreas.sandberg@arm.com } 7914205Sandreas.sandberg@arm.com g.second->regStats(); 8014205Sandreas.sandberg@arm.com } 8114205Sandreas.sandberg@arm.com} 8214205Sandreas.sandberg@arm.com 8314205Sandreas.sandberg@arm.comvoid 8414205Sandreas.sandberg@arm.comGroup::resetStats() 8514205Sandreas.sandberg@arm.com{ 8614205Sandreas.sandberg@arm.com for (auto &s : stats) 8714205Sandreas.sandberg@arm.com s->reset(); 8814205Sandreas.sandberg@arm.com 8914205Sandreas.sandberg@arm.com for (auto &g : mergedStatGroups) 9014205Sandreas.sandberg@arm.com g->resetStats(); 9114205Sandreas.sandberg@arm.com 9214205Sandreas.sandberg@arm.com for (auto &g : statGroups) 9314205Sandreas.sandberg@arm.com g.second->resetStats(); 9414205Sandreas.sandberg@arm.com} 9514205Sandreas.sandberg@arm.com 9614205Sandreas.sandberg@arm.comvoid 9714205Sandreas.sandberg@arm.comGroup::addStat(Stats::Info *info) 9814205Sandreas.sandberg@arm.com{ 9914205Sandreas.sandberg@arm.com stats.push_back(info); 10014205Sandreas.sandberg@arm.com if (mergedParent) 10114205Sandreas.sandberg@arm.com mergedParent->addStat(info); 10214205Sandreas.sandberg@arm.com} 10314205Sandreas.sandberg@arm.com 10414205Sandreas.sandberg@arm.comvoid 10514205Sandreas.sandberg@arm.comGroup::addStatGroup(const char *name, Group *block) 10614205Sandreas.sandberg@arm.com{ 10714205Sandreas.sandberg@arm.com assert(statGroups.find(name) == statGroups.end()); 10814205Sandreas.sandberg@arm.com 10914205Sandreas.sandberg@arm.com statGroups[name] = block; 11014205Sandreas.sandberg@arm.com} 11114205Sandreas.sandberg@arm.com 11214205Sandreas.sandberg@arm.comvoid 11314205Sandreas.sandberg@arm.comGroup::mergeStatGroup(Group *block) 11414205Sandreas.sandberg@arm.com{ 11514205Sandreas.sandberg@arm.com mergedStatGroups.push_back(block); 11614205Sandreas.sandberg@arm.com} 11714205Sandreas.sandberg@arm.com 11814205Sandreas.sandberg@arm.comconst std::map<std::string, Group *> & 11914205Sandreas.sandberg@arm.comGroup::getStatGroups() const 12014205Sandreas.sandberg@arm.com{ 12114205Sandreas.sandberg@arm.com return statGroups; 12214205Sandreas.sandberg@arm.com} 12314205Sandreas.sandberg@arm.com 12414205Sandreas.sandberg@arm.comconst std::vector<Info *> & 12514205Sandreas.sandberg@arm.comGroup::getStats() const 12614205Sandreas.sandberg@arm.com{ 12714205Sandreas.sandberg@arm.com return stats; 12814205Sandreas.sandberg@arm.com} 12914205Sandreas.sandberg@arm.com 13014205Sandreas.sandberg@arm.com} // namespace Stats 131