CIRCT 20.0.0git
Loading...
Searching...
No Matches
ClkResetInsertion.cpp
Go to the documentation of this file.
1//===- ClkResetInsertion.cpp - Clock & reset insertion pass -----*- 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// Adds assignments from a components 'clk' and 'reset' port to every
10// component that contains an input 'clk' or 'reset' port.
11//
12//===----------------------------------------------------------------------===//
13
16#include "circt/Support/LLVM.h"
17#include "mlir/IR/BuiltinTypes.h"
18#include "mlir/IR/OperationSupport.h"
19#include "mlir/Transforms/DialectConversion.h"
20#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
21
22namespace circt {
23namespace calyx {
24#define GEN_PASS_DEF_CLKINSERTION
25#define GEN_PASS_DEF_RESETINSERTION
26#include "circt/Dialect/Calyx/CalyxPasses.h.inc"
27} // namespace calyx
28} // namespace circt
29
30using namespace circt;
31using namespace calyx;
32using namespace mlir;
33
34namespace {
35
36/// Iterates over the cells in 'comp' and connects any input port with attribute
37/// 'portID' to 'fromPort'.
38static void doPortPassthrough(ComponentOp comp, Value fromPort,
39 StringRef portID) {
40 MLIRContext *ctx = comp.getContext();
41 OpBuilder builder(ctx);
42 builder.setInsertionPointToStart(comp.getWiresOp().getBodyBlock());
43
44 for (auto cell : comp.getOps<CellInterface>()) {
45 for (auto port : cell.getInputPorts()) {
46 if (!cell.portInfo(port).hasAttribute(portID))
47 continue;
48 builder.create<AssignOp>(cell.getLoc(), port, fromPort);
49 }
50 }
51}
52
53struct ClkInsertionPass
54 : public circt::calyx::impl::ClkInsertionBase<ClkInsertionPass> {
55 void runOnOperation() override {
56 doPortPassthrough(getOperation(), getOperation().getClkPort(), "clk");
57 }
58};
59
60struct ResetInsertionPass
61 : public circt::calyx::impl::ResetInsertionBase<ResetInsertionPass> {
62 void runOnOperation() override {
63 doPortPassthrough(getOperation(), getOperation().getResetPort(), "reset");
64 }
65};
66
67} // end anonymous namespace
68
69std::unique_ptr<mlir::Pass> circt::calyx::createClkInsertionPass() {
70 return std::make_unique<ClkInsertionPass>();
71}
72
73std::unique_ptr<mlir::Pass> circt::calyx::createResetInsertionPass() {
74 return std::make_unique<ResetInsertionPass>();
75}
std::unique_ptr< mlir::Pass > createResetInsertionPass()
std::unique_ptr< mlir::Pass > createClkInsertionPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.