blob: ecc349edff8dd160bf86a8158cefec6180aebc07 [file] [log] [blame]
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Matteo Martincigh6db5f202019-09-05 12:02:04 +01008#include "ICounterDirectory.hpp"
Jim Flynn97897022020-02-02 12:52:59 +00009#include "ICounterRegistry.hpp"
Matteo Martincigh6db5f202019-09-05 12:02:04 +010010
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010011#include <string>
Matteo Martincigh6db5f202019-09-05 12:02:04 +010012#include <unordered_set>
13#include <unordered_map>
14
Jim Flynn75c14f42022-03-10 22:05:42 +000015#include <common/include/NumericCast.hpp>
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010016
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000017namespace arm
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010018{
19
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000020namespace pipe
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010021{
22
Jim Flynn97897022020-02-02 12:52:59 +000023class CounterDirectory final : public ICounterDirectory, public ICounterRegistry
Matteo Martincigh149528e2019-09-05 12:02:04 +010024{
25public:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010026 CounterDirectory() = default;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010027 ~CounterDirectory() = default;
28
Matteo Martincigh6db5f202019-09-05 12:02:04 +010029 // Register profiling objects
Sadik Armagan4c998992020-02-25 12:44:44 +000030 const Category* RegisterCategory (const std::string& categoryName) override;
Matteo Martincigh6db5f202019-09-05 12:02:04 +010031 const Device* RegisterDevice (const std::string& deviceName,
32 uint16_t cores = 0,
Jim Flynndecd08b2022-03-13 22:35:46 +000033 const arm::pipe::Optional<std::string>& parentCategoryName
34 = arm::pipe::EmptyOptional()) override;
Matteo Martincigh6db5f202019-09-05 12:02:04 +010035 const CounterSet* RegisterCounterSet(const std::string& counterSetName,
36 uint16_t count = 0,
Jim Flynndecd08b2022-03-13 22:35:46 +000037 const arm::pipe::Optional<std::string>& parentCategoryName
38 = arm::pipe::EmptyOptional()) override;
Cathal Corbett6f073722022-03-04 12:11:09 +000039 const Counter* RegisterCounter(const std::string& backendId,
Jim Flynndecd08b2022-03-13 22:35:46 +000040 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;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010051
Matteo Martincigh6db5f202019-09-05 12:02:04 +010052 // Getters for counts
Jim Flynn75c14f42022-03-10 22:05:42 +000053 uint16_t GetCategoryCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Categories.size()); }
54 uint16_t GetDeviceCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Devices.size()); }
55 uint16_t GetCounterSetCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_CounterSets.size()); }
56 uint16_t GetCounterCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Counters.size()); }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010057
Matteo Martincigh6db5f202019-09-05 12:02:04 +010058 // Getters for collections
59 const Categories& GetCategories() const override { return m_Categories; }
60 const Devices& GetDevices() const override { return m_Devices; }
61 const CounterSets& GetCounterSets() const override { return m_CounterSets; }
62 const Counters& GetCounters() const override { return m_Counters; }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010063
Matteo Martincigh6db5f202019-09-05 12:02:04 +010064 // 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;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010069
Matteo Martincigha84edee2019-10-02 12:50:57 +010070 // 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
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010082private:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010083 // The profiling collections owned by the counter directory
84 Categories m_Categories;
85 Devices m_Devices;
86 CounterSets m_CounterSets;
87 Counters m_Counters;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010088
Matteo Martincigh6db5f202019-09-05 12:02:04 +010089 // 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;
Matteo Martincigha84edee2019-10-02 12:50:57 +010096 CountersIt FindCounter(const std::string& counterName) const;
Jim Flynndecd08b2022-03-13 22:35:46 +000097 uint16_t GetNumberOfCores(const arm::pipe::Optional<uint16_t>& numberOfCores,
Sadik Armagan4c998992020-02-25 12:44:44 +000098 uint16_t deviceUid);
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010099};
100
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000101} // namespace pipe
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +0100102
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000103} // namespace arm