CIRCT 22.0.0git
Loading...
Searching...
No Matches
TestPriorityCuts.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
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 implements a test for priority cuts implementation.
10//
11//===----------------------------------------------------------------------===//
12
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/Support/Debug.h"
18#include "llvm/Support/raw_ostream.h"
19#include <memory>
20
21namespace circt {
22namespace synth {
23#define GEN_PASS_DEF_TESTPRIORITYCUTS
24#include "circt/Dialect/Synth/Transforms/SynthPasses.h.inc"
25} // namespace synth
26} // namespace circt
27
28using namespace circt;
29using namespace circt::synth;
30
31#define DEBUG_TYPE "synth-test-priority-cuts"
32
33//===----------------------------------------------------------------------===//
34// Test Priority Cuts Pass
35//===----------------------------------------------------------------------===//
36
37namespace {
38
39// Dummy pattern that matches any cut.
40struct DummyPattern : public CutRewritePattern {
41 static constexpr unsigned kMaxInputs = 16;
42 SmallVector<DelayType, kMaxInputs> cachedDelays; // Pre-computed unit delays
43
44 DummyPattern(mlir::MLIRContext *ctx)
45 : CutRewritePattern(ctx), cachedDelays(kMaxInputs, 1) {}
46
47 std::optional<MatchResult> match(CutEnumerator &enumerator,
48 const Cut &cut) const override {
49 assert(cut.getInputSize() <= kMaxInputs && "Too many inputs");
50 return MatchResult(
51 1.0, ArrayRef<DelayType>(cachedDelays).take_front(cut.getInputSize()));
52 }
53
54 FailureOr<Operation *> rewrite(mlir::OpBuilder &builder,
55 CutEnumerator &enumerator,
56 const Cut &cut) const override {
57 return failure();
58 }
59
60 unsigned getNumOutputs() const override { return 1; }
61};
62
63struct TestPriorityCutsPass
64 : public impl::TestPriorityCutsBase<TestPriorityCutsPass> {
65 using TestPriorityCutsBase<TestPriorityCutsPass>::TestPriorityCutsBase;
66
67 void runOnOperation() override {
68 auto hwModule = getOperation();
69
70 LLVM_DEBUG(llvm::dbgs() << "Running TestPriorityCuts on module: "
71 << hwModule.getName() << "\n");
72
73 // Set up cut rewriter options for testing
74 CutRewriterOptions options;
75 options.maxCutInputSize = maxCutInputSize;
76 options.maxCutSizePerRoot = maxCutsPerRoot;
77 // Currently there is no behavioral difference between timing and area
78 // so just test with timing strategy.
80 options.testPriorityCuts = true;
81 SmallVector<std::unique_ptr<CutRewritePattern>, 4> patterns;
82 patterns.push_back(std::make_unique<DummyPattern>(hwModule->getContext()));
83 CutRewritePatternSet patternSet(std::move(patterns));
84 CutRewriter rewriter(options, patternSet);
85 CutEnumerator enumerator(options);
86 llvm::outs() << "Enumerating cuts for module: " << hwModule.getModuleName()
87 << "\n";
88
89 if (failed(rewriter.run(hwModule))) {
90 signalPassFailure();
91 return;
92 }
93 }
94};
95
96} // namespace
assert(baseType &&"element must be base type")
Cut enumeration engine for combinational logic networks.
Manages a collection of rewriting patterns for combinational logic optimization.
Main cut-based rewriting algorithm for combinational logic optimization.
LogicalResult run(Operation *topOp)
Execute the complete cut-based rewriting algorithm.
Represents a cut in the combinational logic network.
unsigned getInputSize() const
Get the number of inputs to this cut.
@ OptimizationStrategyTiming
Optimize for minimal critical path delay.
Definition SynthPasses.h:26
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition synth.py:1
Base class for cut rewriting patterns used in combinational logic optimization.
virtual FailureOr< Operation * > rewrite(mlir::OpBuilder &builder, CutEnumerator &enumerator, const Cut &cut) const =0
Return a new operation that replaces the matched cut.
virtual std::optional< MatchResult > match(CutEnumerator &enumerator, const Cut &cut) const =0
Check if a cut matches this pattern and compute area/delay metrics.
virtual unsigned getNumOutputs() const =0
Get the number of outputs this pattern produces.
Configuration options for the cut-based rewriting algorithm.
unsigned maxCutInputSize
Maximum number of inputs allowed for any cut.
unsigned maxCutSizePerRoot
Maximum number of cuts to maintain per logic node.
OptimizationStrategy strategy
Optimization strategy (area vs. timing).
bool testPriorityCuts
Run priority cuts enumeration and dump the cut sets.
Result of matching a cut against a pattern.
Definition CutRewriter.h:74