CIRCT 20.0.0git
Loading...
Searching...
No Matches
FIRRTLOpInterfaces.h
Go to the documentation of this file.
1//===- FIRRTLOpInterfaces.h - Declare FIRRTL op interfaces ------*- 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// This file declares the operation interfaces for the FIRRTL IR and supporting
10// types.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef CIRCT_DIALECT_FIRRTL_OP_INTERFACES_H
15#define CIRCT_DIALECT_FIRRTL_OP_INTERFACES_H
16
22#include "mlir/IR/Attributes.h"
23#include "mlir/IR/BuiltinTypes.h"
24#include "mlir/IR/OpDefinition.h"
25#include "mlir/IR/SymbolTable.h"
26#include "llvm/ADT/TypeSwitch.h"
27
28namespace mlir {
29class PatternRewriter;
30} // end namespace mlir
31
32namespace circt {
33namespace firrtl {
34
35class FIRRTLType;
36class Forceable;
37class ClassLike;
38class ClassType;
39
40/// This holds the name and type that describes the module's ports.
41struct PortInfo {
42 StringAttr name;
43 Type type;
45 hw::InnerSymAttr sym = {};
46 Location loc = UnknownLoc::get(type.getContext());
48
49 StringRef getName() const { return name ? name.getValue() : ""; }
50
51 /// Return true if this is a simple output-only port. If you want the
52 /// direction of the port, use the \p direction parameter.
53 bool isOutput() const { return direction == Direction::Out && !isInOut(); }
54
55 /// Return true if this is a simple input-only port. If you want the
56 /// direction of the port, use the \p direction parameter.
57 bool isInput() const { return direction == Direction::In && !isInOut(); }
58
59 /// Return true if this is an inout port. This will be true if the port
60 /// contains either bi-directional signals or analog types.
61 /// Non-HW types (e.g., ref types) are never considered InOut.
62 bool isInOut() const { return isTypeInOut(type); }
63
64 /// Default constructors
65 PortInfo(StringAttr name, Type type, Direction dir, StringAttr symName = {},
66 std::optional<Location> location = {},
67 std::optional<AnnotationSet> annos = {})
68 : name(name), type(type), direction(dir) {
69 if (symName)
70 sym = hw::InnerSymAttr::get(symName);
71 if (location)
72 loc = *location;
73 if (annos)
74 annotations = *annos;
75 };
76 PortInfo(StringAttr name, Type type, Direction dir, hw::InnerSymAttr sym,
77 Location loc, AnnotationSet annos)
78 : name(name), type(type), direction(dir), sym(sym), loc(loc),
79 annotations(annos) {}
80};
81
83 /// Classic FIRRTL connections: last connect 'wins' across paths;
84 /// conditionally applied under 'when'.
86 /// Exclusive connection to the destination, unconditional.
88};
89
90/// Verification hook for verifying module like operations.
91LogicalResult verifyModuleLikeOpInterface(FModuleLike module);
92
93namespace detail {
94/// Return null or forceable reference result type.
95RefType getForceableResultType(bool forceable, Type type);
96/// Verify a Forceable op.
97LogicalResult verifyForceableOp(Forceable op);
98/// Replace a Forceable op with equivalent, changing whether forceable.
99/// No-op if already has specified forceability.
100Forceable
101replaceWithNewForceability(Forceable op, bool forceable,
102 ::mlir::PatternRewriter *rewriter = nullptr);
103} // end namespace detail
104
105//===----------------------------------------------------------------------===//
106// ClassLike Helpers
107//===----------------------------------------------------------------------===//
108
109namespace detail {
110ClassType getInstanceTypeForClassLike(ClassLike classOp);
111
112/// Assuming that the classOp is the source of truth, verify that the type
113/// accurately matches the signature of the class.
114LogicalResult
115verifyTypeAgainstClassLike(ClassLike classOp, ClassType type,
116 function_ref<InFlightDiagnostic()> emitError);
117} // namespace detail
118
119} // namespace firrtl
120} // namespace circt
121
122#include "circt/Dialect/FIRRTL/FIRRTLOpInterfaces.h.inc"
123#endif // CIRCT_DIALECT_FIRRTL_OP_INTERFACES_H
This class provides a read-only projection over the MLIR attributes that represent a set of annotatio...
ClassType getInstanceTypeForClassLike(ClassLike classOp)
LogicalResult verifyForceableOp(Forceable op)
Verify a Forceable op.
LogicalResult verifyTypeAgainstClassLike(ClassLike classOp, ClassType type, function_ref< InFlightDiagnostic()> emitError)
Assuming that the classOp is the source of truth, verify that the type accurately matches the signatu...
Forceable replaceWithNewForceability(Forceable op, bool forceable, ::mlir::PatternRewriter *rewriter=nullptr)
Replace a Forceable op with equivalent, changing whether forceable.
RefType getForceableResultType(bool forceable, Type type)
Return null or forceable reference result type.
Direction
This represents the direction of a single port.
LogicalResult verifyModuleLikeOpInterface(FModuleLike module)
Verification hook for verifying module like operations.
@ LastConnect
Classic FIRRTL connections: last connect 'wins' across paths; conditionally applied under 'when'.
@ StaticSingleConnect
Exclusive connection to the destination, unconditional.
bool isTypeInOut(mlir::Type type)
Returns true if the given type has some flipped (aka unaligned) dataflow.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
This holds the name and type that describes the module's ports.
bool isOutput() const
Return true if this is a simple output-only port.
PortInfo(StringAttr name, Type type, Direction dir, hw::InnerSymAttr sym, Location loc, AnnotationSet annos)
PortInfo(StringAttr name, Type type, Direction dir, StringAttr symName={}, std::optional< Location > location={}, std::optional< AnnotationSet > annos={})
Default constructors.
bool isInput() const
Return true if this is a simple input-only port.
bool isInOut() const
Return true if this is an inout port.