12 #include "mlir/IR/PatternMatch.h"
14 using namespace circt;
22 if (
auto intAttr = dyn_cast<IntegerAttr>(attr))
23 return intAttr.getValue().isZero();
29 static SmallVector<Value>
concatValues(ValueRange a, ValueRange b) {
31 v.append(a.begin(), a.end());
32 v.append(b.begin(), b.end());
38 SmallVector<Value> flatInputs;
39 for (
auto value : values) {
40 if (
auto concatOp = value.getDefiningOp<ConcatOp>()) {
41 auto inputs = concatOp.getInputs();
44 flatInputs.push_back(value);
55 #include "circt/Dialect/LTL/LTLFolds.cpp.inc"
62 OpFoldResult DelayOp::fold(FoldAdaptor adaptor) {
64 if (adaptor.getDelay() == 0 && adaptor.getLength() == 0 &&
65 !isa<SequenceType>(getResult().getType()))
71 void DelayOp::getCanonicalizationPatterns(RewritePatternSet &results,
72 MLIRContext *context) {
73 results.add<patterns::NestedDelays>(results.getContext());
74 results.add<patterns::MoveDelayIntoConcat>(results.getContext());
81 OpFoldResult ConcatOp::fold(FoldAdaptor adaptor) {
83 if (getInputs().size() == 1)
84 return getInputs()[0];
89 void ConcatOp::getCanonicalizationPatterns(RewritePatternSet &results,
90 MLIRContext *context) {
91 results.add<patterns::FlattenConcats>(results.getContext());
98 OpFoldResult DisableOp::fold(FoldAdaptor adaptor) {
static SmallVector< Value > flattenConcats(ValueRange values)
Inline all ConcatOps in a range of values.
static SmallVector< Value > concatValues(ValueRange a, ValueRange b)
Concatenate two value ranges into a larger range.
llvm::SmallVector< StringAttr > inputs
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
static bool isConstantZero(Attribute operand)
Determine whether a constant operand is a zero value.