//===--------------------- ResourceManager.h --------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// /// The classes here represent processor resource units and their management /// strategy. These classes are managed by the Scheduler. /// //===----------------------------------------------------------------------===// #ifndef LLVM_MCA_HARDWAREUNITS_RESOURCEMANAGER_H #define LLVM_MCA_HARDWAREUNITS_RESOURCEMANAGER_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCSchedule.h" #include "llvm/MCA/Instruction.h" #include "llvm/MCA/Support.h" namespace llvm { namespace mca { /// Used to notify the internal state of a processor resource. /// /// A processor resource is available if it is not reserved, and there are /// available slots in the buffer. A processor resource is unavailable if it /// is either reserved, or the associated buffer is full. A processor resource /// with a buffer size of -1 is always available if it is not reserved. /// /// Values of type ResourceStateEvent are returned by method /// ResourceManager::canBeDispatched() /// /// The naming convention for resource state events is: /// * Event names start with prefix RS_ /// * Prefix RS_ is followed by a string describing the actual resource state. enum ResourceStateEvent { … }; /// Resource allocation strategy used by hardware scheduler resources. class ResourceStrategy { … }; /// Default resource allocation strategy used by processor resource groups and /// processor resources with multiple units. class DefaultResourceStrategy final : public ResourceStrategy { … }; /// A processor resource descriptor. /// /// There is an instance of this class for every processor resource defined by /// the machine scheduling model. /// Objects of class ResourceState dynamically track the usage of processor /// resource units. class ResourceState { … }; /// A resource unit identifier. /// /// This is used to identify a specific processor resource unit using a pair /// of indices where the 'first' index is a processor resource mask, and the /// 'second' index is an index for a "sub-resource" (i.e. unit). ResourceRef; // First: a MCProcResourceDesc index identifying a buffered resource. // Second: max number of buffer entries used in this resource. BufferUsageEntry; /// A resource manager for processor resource units and groups. /// /// This class owns all the ResourceState objects, and it is responsible for /// acting on requests from a Scheduler by updating the internal state of /// ResourceState objects. /// This class doesn't know about instruction itineraries and functional units. /// In future, it can be extended to support itineraries too through the same /// public interface. class ResourceManager { … }; } // namespace mca } // namespace llvm #endif // LLVM_MCA_HARDWAREUNITS_RESOURCEMANAGER_H