1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include "ICounterDirectory.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "ICounterRegistry.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <string> 12*89c4ff92SAndroid Build Coastguard Worker #include <unordered_set> 13*89c4ff92SAndroid Build Coastguard Worker #include <unordered_map> 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker #include <common/include/NumericCast.hpp> 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker namespace arm 18*89c4ff92SAndroid Build Coastguard Worker { 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker namespace pipe 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker class CounterDirectory final : public ICounterDirectory, public ICounterRegistry 24*89c4ff92SAndroid Build Coastguard Worker { 25*89c4ff92SAndroid Build Coastguard Worker public: 26*89c4ff92SAndroid Build Coastguard Worker CounterDirectory() = default; 27*89c4ff92SAndroid Build Coastguard Worker ~CounterDirectory() = default; 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker // Register profiling objects 30*89c4ff92SAndroid Build Coastguard Worker const Category* RegisterCategory (const std::string& categoryName) override; 31*89c4ff92SAndroid Build Coastguard Worker const Device* RegisterDevice (const std::string& deviceName, 32*89c4ff92SAndroid Build Coastguard Worker uint16_t cores = 0, 33*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<std::string>& parentCategoryName 34*89c4ff92SAndroid Build Coastguard Worker = arm::pipe::EmptyOptional()) override; 35*89c4ff92SAndroid Build Coastguard Worker const CounterSet* RegisterCounterSet(const std::string& counterSetName, 36*89c4ff92SAndroid Build Coastguard Worker uint16_t count = 0, 37*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<std::string>& parentCategoryName 38*89c4ff92SAndroid Build Coastguard Worker = arm::pipe::EmptyOptional()) override; 39*89c4ff92SAndroid Build Coastguard Worker const Counter* RegisterCounter(const std::string& backendId, 40*89c4ff92SAndroid Build Coastguard Worker const uint16_t uid, 41*89c4ff92SAndroid Build Coastguard Worker const std::string& parentCategoryName, 42*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass, 43*89c4ff92SAndroid Build Coastguard Worker uint16_t interpolation, 44*89c4ff92SAndroid Build Coastguard Worker double multiplier, 45*89c4ff92SAndroid Build Coastguard Worker const std::string& name, 46*89c4ff92SAndroid Build Coastguard Worker const std::string& description, 47*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<std::string>& units = arm::pipe::EmptyOptional(), 48*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<uint16_t>& numberOfCores = arm::pipe::EmptyOptional(), 49*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<uint16_t>& deviceUid = arm::pipe::EmptyOptional(), 50*89c4ff92SAndroid Build Coastguard Worker const arm::pipe::Optional<uint16_t>& counterSetUid = arm::pipe::EmptyOptional()) override; 51*89c4ff92SAndroid Build Coastguard Worker 52*89c4ff92SAndroid Build Coastguard Worker // Getters for counts GetCategoryCount() const53*89c4ff92SAndroid Build Coastguard Worker uint16_t GetCategoryCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Categories.size()); } GetDeviceCount() const54*89c4ff92SAndroid Build Coastguard Worker uint16_t GetDeviceCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Devices.size()); } GetCounterSetCount() const55*89c4ff92SAndroid Build Coastguard Worker uint16_t GetCounterSetCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_CounterSets.size()); } GetCounterCount() const56*89c4ff92SAndroid Build Coastguard Worker uint16_t GetCounterCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Counters.size()); } 57*89c4ff92SAndroid Build Coastguard Worker 58*89c4ff92SAndroid Build Coastguard Worker // Getters for collections GetCategories() const59*89c4ff92SAndroid Build Coastguard Worker const Categories& GetCategories() const override { return m_Categories; } GetDevices() const60*89c4ff92SAndroid Build Coastguard Worker const Devices& GetDevices() const override { return m_Devices; } GetCounterSets() const61*89c4ff92SAndroid Build Coastguard Worker const CounterSets& GetCounterSets() const override { return m_CounterSets; } GetCounters() const62*89c4ff92SAndroid Build Coastguard Worker const Counters& GetCounters() const override { return m_Counters; } 63*89c4ff92SAndroid Build Coastguard Worker 64*89c4ff92SAndroid Build Coastguard Worker // Getters for profiling objects 65*89c4ff92SAndroid Build Coastguard Worker const Category* GetCategory(const std::string& name) const override; 66*89c4ff92SAndroid Build Coastguard Worker const Device* GetDevice(uint16_t uid) const override; 67*89c4ff92SAndroid Build Coastguard Worker const CounterSet* GetCounterSet(uint16_t uid) const override; 68*89c4ff92SAndroid Build Coastguard Worker const Counter* GetCounter(uint16_t uid) const override; 69*89c4ff92SAndroid Build Coastguard Worker 70*89c4ff92SAndroid Build Coastguard Worker // Queries for profiling objects 71*89c4ff92SAndroid Build Coastguard Worker bool IsCategoryRegistered(const std::string& categoryName) const; 72*89c4ff92SAndroid Build Coastguard Worker bool IsDeviceRegistered(uint16_t deviceUid) const; 73*89c4ff92SAndroid Build Coastguard Worker bool IsDeviceRegistered(const std::string& deviceName) const; 74*89c4ff92SAndroid Build Coastguard Worker bool IsCounterSetRegistered(uint16_t counterSetUid) const; 75*89c4ff92SAndroid Build Coastguard Worker bool IsCounterSetRegistered(const std::string& counterSetName) const; 76*89c4ff92SAndroid Build Coastguard Worker bool IsCounterRegistered(uint16_t counterUid) const; 77*89c4ff92SAndroid Build Coastguard Worker bool IsCounterRegistered(const std::string& counterName) const; 78*89c4ff92SAndroid Build Coastguard Worker 79*89c4ff92SAndroid Build Coastguard Worker // Clears all the counter directory contents 80*89c4ff92SAndroid Build Coastguard Worker void Clear(); 81*89c4ff92SAndroid Build Coastguard Worker 82*89c4ff92SAndroid Build Coastguard Worker private: 83*89c4ff92SAndroid Build Coastguard Worker // The profiling collections owned by the counter directory 84*89c4ff92SAndroid Build Coastguard Worker Categories m_Categories; 85*89c4ff92SAndroid Build Coastguard Worker Devices m_Devices; 86*89c4ff92SAndroid Build Coastguard Worker CounterSets m_CounterSets; 87*89c4ff92SAndroid Build Coastguard Worker Counters m_Counters; 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker // Helper functions 90*89c4ff92SAndroid Build Coastguard Worker CategoriesIt FindCategory(const std::string& categoryName) const; 91*89c4ff92SAndroid Build Coastguard Worker DevicesIt FindDevice(uint16_t deviceUid) const; 92*89c4ff92SAndroid Build Coastguard Worker DevicesIt FindDevice(const std::string& deviceName) const; 93*89c4ff92SAndroid Build Coastguard Worker CounterSetsIt FindCounterSet(uint16_t counterSetUid) const; 94*89c4ff92SAndroid Build Coastguard Worker CounterSetsIt FindCounterSet(const std::string& counterSetName) const; 95*89c4ff92SAndroid Build Coastguard Worker CountersIt FindCounter(uint16_t counterUid) const; 96*89c4ff92SAndroid Build Coastguard Worker CountersIt FindCounter(const std::string& counterName) const; 97*89c4ff92SAndroid Build Coastguard Worker uint16_t GetNumberOfCores(const arm::pipe::Optional<uint16_t>& numberOfCores, 98*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid); 99*89c4ff92SAndroid Build Coastguard Worker }; 100*89c4ff92SAndroid Build Coastguard Worker 101*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 102*89c4ff92SAndroid Build Coastguard Worker 103*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 104