xref: /llvm-project/llvm/lib/MCA/Context.cpp (revision bcc83a2e83215f998533582b55522a6e8752d899)
1cc5e6a72SClement Courbet //===---------------------------- Context.cpp -------------------*- C++ -*-===//
2cc5e6a72SClement Courbet //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cc5e6a72SClement Courbet //
7cc5e6a72SClement Courbet //===----------------------------------------------------------------------===//
8cc5e6a72SClement Courbet /// \file
9cc5e6a72SClement Courbet ///
10cc5e6a72SClement Courbet /// This file defines a class for holding ownership of various simulated
11cc5e6a72SClement Courbet /// hardware units.  A Context also provides a utility routine for constructing
12cc5e6a72SClement Courbet /// a default out-of-order pipeline with fetch, dispatch, execute, and retire
13cc5e6a72SClement Courbet /// stages.
14cc5e6a72SClement Courbet ///
15cc5e6a72SClement Courbet //===----------------------------------------------------------------------===//
16cc5e6a72SClement Courbet 
17cc5e6a72SClement Courbet #include "llvm/MCA/Context.h"
18cc5e6a72SClement Courbet #include "llvm/MCA/HardwareUnits/RegisterFile.h"
19cc5e6a72SClement Courbet #include "llvm/MCA/HardwareUnits/RetireControlUnit.h"
20cc5e6a72SClement Courbet #include "llvm/MCA/HardwareUnits/Scheduler.h"
21cc5e6a72SClement Courbet #include "llvm/MCA/Stages/DispatchStage.h"
22cc5e6a72SClement Courbet #include "llvm/MCA/Stages/EntryStage.h"
23cc5e6a72SClement Courbet #include "llvm/MCA/Stages/ExecuteStage.h"
24d791695cSAndrew Savonichev #include "llvm/MCA/Stages/InOrderIssueStage.h"
25e074ac60SAndrea Di Biagio #include "llvm/MCA/Stages/MicroOpQueueStage.h"
26cc5e6a72SClement Courbet #include "llvm/MCA/Stages/RetireStage.h"
27cc5e6a72SClement Courbet 
28cc5e6a72SClement Courbet namespace llvm {
29cc5e6a72SClement Courbet namespace mca {
30cc5e6a72SClement Courbet 
31cc5e6a72SClement Courbet std::unique_ptr<Pipeline>
createDefaultPipeline(const PipelineOptions & Opts,SourceMgr & SrcMgr,CustomBehaviour & CB)32ef16c8eaSPatrick Holland Context::createDefaultPipeline(const PipelineOptions &Opts, SourceMgr &SrcMgr,
33ef16c8eaSPatrick Holland                                CustomBehaviour &CB) {
34cc5e6a72SClement Courbet   const MCSchedModel &SM = STI.getSchedModel();
35cc5e6a72SClement Courbet 
36d791695cSAndrew Savonichev   if (!SM.isOutOfOrder())
37ef16c8eaSPatrick Holland     return createInOrderPipeline(Opts, SrcMgr, CB);
38d791695cSAndrew Savonichev 
39cc5e6a72SClement Courbet   // Create the hardware units defining the backend.
400eaee545SJonas Devlieghere   auto RCU = std::make_unique<RetireControlUnit>(SM);
410eaee545SJonas Devlieghere   auto PRF = std::make_unique<RegisterFile>(SM, MRI, Opts.RegisterFileSize);
420eaee545SJonas Devlieghere   auto LSU = std::make_unique<LSUnit>(SM, Opts.LoadQueueSize,
43cc5e6a72SClement Courbet                                       Opts.StoreQueueSize, Opts.AssumeNoAlias);
440eaee545SJonas Devlieghere   auto HWS = std::make_unique<Scheduler>(SM, *LSU);
45cc5e6a72SClement Courbet 
46cc5e6a72SClement Courbet   // Create the pipeline stages.
470eaee545SJonas Devlieghere   auto Fetch = std::make_unique<EntryStage>(SrcMgr);
489853d0dbSAndrea Di Biagio   auto Dispatch =
499853d0dbSAndrea Di Biagio       std::make_unique<DispatchStage>(STI, MRI, Opts.DispatchWidth, *RCU, *PRF);
50be3281a2SAndrea Di Biagio   auto Execute =
510eaee545SJonas Devlieghere       std::make_unique<ExecuteStage>(*HWS, Opts.EnableBottleneckAnalysis);
528d6651f7SAndrea Di Biagio   auto Retire = std::make_unique<RetireStage>(*RCU, *PRF, *LSU);
53cc5e6a72SClement Courbet 
54cc5e6a72SClement Courbet   // Pass the ownership of all the hardware units to this Context.
55cc5e6a72SClement Courbet   addHardwareUnit(std::move(RCU));
56cc5e6a72SClement Courbet   addHardwareUnit(std::move(PRF));
57cc5e6a72SClement Courbet   addHardwareUnit(std::move(LSU));
58cc5e6a72SClement Courbet   addHardwareUnit(std::move(HWS));
59cc5e6a72SClement Courbet 
60cc5e6a72SClement Courbet   // Build the pipeline.
610eaee545SJonas Devlieghere   auto StagePipeline = std::make_unique<Pipeline>();
62cc5e6a72SClement Courbet   StagePipeline->appendStage(std::move(Fetch));
63e074ac60SAndrea Di Biagio   if (Opts.MicroOpQueueSize)
640eaee545SJonas Devlieghere     StagePipeline->appendStage(std::make_unique<MicroOpQueueStage>(
65e074ac60SAndrea Di Biagio         Opts.MicroOpQueueSize, Opts.DecodersThroughput));
66cc5e6a72SClement Courbet   StagePipeline->appendStage(std::move(Dispatch));
67cc5e6a72SClement Courbet   StagePipeline->appendStage(std::move(Execute));
68cc5e6a72SClement Courbet   StagePipeline->appendStage(std::move(Retire));
69cc5e6a72SClement Courbet   return StagePipeline;
70cc5e6a72SClement Courbet }
71cc5e6a72SClement Courbet 
72d791695cSAndrew Savonichev std::unique_ptr<Pipeline>
createInOrderPipeline(const PipelineOptions & Opts,SourceMgr & SrcMgr,CustomBehaviour & CB)73ef16c8eaSPatrick Holland Context::createInOrderPipeline(const PipelineOptions &Opts, SourceMgr &SrcMgr,
74ef16c8eaSPatrick Holland                                CustomBehaviour &CB) {
75d791695cSAndrew Savonichev   const MCSchedModel &SM = STI.getSchedModel();
76d791695cSAndrew Savonichev   auto PRF = std::make_unique<RegisterFile>(SM, MRI, Opts.RegisterFileSize);
77*bcc83a2eSAndrew Savonichev   auto LSU = std::make_unique<LSUnit>(SM, Opts.LoadQueueSize,
78*bcc83a2eSAndrew Savonichev                                       Opts.StoreQueueSize, Opts.AssumeNoAlias);
79d791695cSAndrew Savonichev 
8057646d38SAndrea Di Biagio   // Create the pipeline stages.
81d791695cSAndrew Savonichev   auto Entry = std::make_unique<EntryStage>(SrcMgr);
82*bcc83a2eSAndrew Savonichev   auto InOrderIssue = std::make_unique<InOrderIssueStage>(STI, *PRF, CB, *LSU);
83d791695cSAndrew Savonichev   auto StagePipeline = std::make_unique<Pipeline>();
84d791695cSAndrew Savonichev 
8557646d38SAndrea Di Biagio   // Pass the ownership of all the hardware units to this Context.
86d791695cSAndrew Savonichev   addHardwareUnit(std::move(PRF));
87*bcc83a2eSAndrew Savonichev   addHardwareUnit(std::move(LSU));
88d791695cSAndrew Savonichev 
8957646d38SAndrea Di Biagio   // Build the pipeline.
9057646d38SAndrea Di Biagio   StagePipeline->appendStage(std::move(Entry));
9157646d38SAndrea Di Biagio   StagePipeline->appendStage(std::move(InOrderIssue));
92d791695cSAndrew Savonichev   return StagePipeline;
93d791695cSAndrew Savonichev }
94d791695cSAndrew Savonichev 
95cc5e6a72SClement Courbet } // namespace mca
96cc5e6a72SClement Courbet } // namespace llvm
97