CIRCT 20.0.0git
Loading...
Searching...
No Matches
Passes.h
Go to the documentation of this file.
1//===- Passes.h - Helpers for pipeline instrumentation ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef CIRCT_SUPPORT_PASSES_H
10#define CIRCT_SUPPORT_PASSES_H
11
12#include "circt/Support/LLVM.h"
13#include "mlir/Pass/Pass.h"
14#include "mlir/Pass/PassInstrumentation.h"
15#include "llvm/Support/Chrono.h"
16#include "llvm/Support/Format.h"
17
18namespace circt {
19// This class prints logs before and after of pass executions when its pass
20// operation is in `LoggedOpTypes`. Note that `runBeforePass` and `runAfterPass`
21// are not thread safe so `LoggedOpTypes` must be a set of operations whose
22// passes are ran sequentially (e.g. mlir::ModuleOp, firrtl::CircuitOp).
23template <class... LoggedOpTypes>
24class VerbosePassInstrumentation : public mlir::PassInstrumentation {
25 // This stores start time points of passes.
26 using TimePoint = llvm::sys::TimePoint<>;
27 llvm::SmallVector<TimePoint> timePoints;
28 int level = 0;
29 const char *toolName;
30
31public:
33 void runBeforePass(Pass *pass, Operation *op) override {
34 if (isa<LoggedOpTypes...>(op)) {
35 timePoints.push_back(TimePoint::clock::now());
36 auto &os = llvm::errs();
37 os << llvm::format("[%s] ", toolName);
38 os.indent(2 * level++);
39 os << "Running \"";
40 pass->printAsTextualPipeline(llvm::errs());
41 os << "\"\n";
42 }
43 }
44
45 void runAfterPass(Pass *pass, Operation *op) override {
46 using namespace std::chrono;
47 if (isa<LoggedOpTypes...>(op)) {
48 auto &os = llvm::errs();
49 auto elapsed = duration<double>(TimePoint::clock::now() -
50 timePoints.pop_back_val()) /
51 seconds(1);
52 os << llvm::format("[%s] ", toolName);
53 os.indent(2 * --level);
54 os << "-- Done in " << llvm::format("%.3f", elapsed) << " sec\n";
55 }
56 }
57};
58
59/// Create a simple canonicalizer pass.
60std::unique_ptr<Pass> createSimpleCanonicalizerPass();
61
62} // namespace circt
63
64#endif // CIRCT_SUPPORT_PASSES_H
llvm::SmallVector< TimePoint > timePoints
Definition Passes.h:27
void runAfterPass(Pass *pass, Operation *op) override
Definition Passes.h:45
void runBeforePass(Pass *pass, Operation *op) override
Definition Passes.h:33
VerbosePassInstrumentation(const char *toolName)
Definition Passes.h:32
llvm::sys::TimePoint<> TimePoint
Definition Passes.h:26
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< Pass > createSimpleCanonicalizerPass()
Create a simple canonicalizer pass.
Definition Passes.cpp:15