CIRCT 20.0.0git
Loading...
Searching...
No Matches
ArcDialect.cpp
Go to the documentation of this file.
1//===- ArcDialect.cpp - Arc dialect implementation ------------------------===//
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
13#include "mlir/Transforms/InliningUtils.h"
14
15using namespace circt;
16using namespace arc;
17
18namespace {
19/// This class defines the interface for handling inlining with Arc operations.
20struct ArcInlinerInterface : public mlir::DialectInlinerInterface {
21 using mlir::DialectInlinerInterface::DialectInlinerInterface;
22
23 bool isLegalToInline(Operation *call, Operation *callable,
24 bool wouldBeCloned) const override {
25 return isa<CallOp>(call);
26 }
27 bool isLegalToInline(Region *dest, Region *src, bool wouldBeCloned,
28 IRMapping &valueMapping) const override {
29 // TODO
30 return false;
31 }
32 bool isLegalToInline(Operation *op, Region *dest, bool wouldBeCloned,
33 IRMapping &valueMapping) const override {
34 // TODO
35 return false;
36 }
37 void handleTerminator(Operation *op,
38 mlir::ValueRange valuesToRepl) const override {
39 assert(isa<arc::OutputOp>(op)); // arc does not have another terminator op
40 for (auto [from, to] : llvm::zip(valuesToRepl, op->getOperands()))
41 from.replaceAllUsesWith(to);
42 }
43};
44} // end anonymous namespace
45
46void ArcDialect::initialize() {
47 registerTypes();
48 addOperations<
49#define GET_OP_LIST
50#include "circt/Dialect/Arc/Arc.cpp.inc"
51 >();
52
53 // Register interface implementations.
54 addInterfaces<ArcInlinerInterface>();
55}
56
57/// Registered hook to materialize a single constant operation from a given
58/// attribute value with the desired resultant type. This method should use
59/// the provided builder to create the operation without changing the
60/// insertion position. The generated operation is expected to be constant
61/// like, i.e. single result, zero operands, non side-effecting, etc. On
62/// success, this hook should return the value generated to represent the
63/// constant value. Otherwise, it should return null on failure.
64Operation *ArcDialect::materializeConstant(OpBuilder &builder, Attribute value,
65 Type type, Location loc) {
66 // Integer constants.
67 if (auto intType = dyn_cast<IntegerType>(type))
68 if (auto attrValue = dyn_cast<IntegerAttr>(value))
69 return builder.create<hw::ConstantOp>(loc, type, attrValue);
70
71 // Parameter expressions materialize into hw.param.value.
72 auto *parentOp = builder.getBlock()->getParentOp();
73 auto curModule = dyn_cast<hw::HWModuleOp>(parentOp);
74 if (!curModule)
75 curModule = parentOp->getParentOfType<hw::HWModuleOp>();
76 if (curModule && isValidParameterExpression(value, curModule))
77 return builder.create<hw::ParamValueOp>(loc, type, value);
78
79 return nullptr;
80}
81
82#include "circt/Dialect/Arc/ArcDialect.cpp.inc"
83#include "circt/Dialect/Arc/ArcEnums.cpp.inc"
assert(baseType &&"element must be base type")
bool isValidParameterExpression(Attribute attr, Operation *module)
Return true if the specified attribute tree is made up of nodes that are valid in a parameter express...
Definition HWOps.cpp:221
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.