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