CIRCT 22.0.0git
Loading...
Searching...
No Matches
pipelines.h
Go to the documentation of this file.
1//===- pipelines.h - Arcilator lowering pipelines -------------------------===//
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 'arcilator' lowering pipelines.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef TOOLS_ARCILATOR_PIPELINES_H
14#define TOOLS_ARCILATOR_PIPELINES_H
15
16#include "mlir/Pass/PassManager.h"
17#include "mlir/Pass/PassOptions.h"
18#include "llvm/Support/CommandLine.h"
19
20namespace circt {
21
22// Pre-process the input such that it no longer contains any SV dialect ops
23// and external modules that are relevant to the arc transformation are
24// represented as intrinsic ops.
26 : mlir::PassPipelineOptions<ArcPreprocessingOptions> {
27 Option<bool> observePorts{*this, "observe-ports",
28 llvm::cl::desc("Make all ports observable"),
29 llvm::cl::init(false)};
30
31 Option<bool> observeWires{*this, "observe-wires",
32 llvm::cl::desc("Make all wires observable"),
33 llvm::cl::init(false)};
34
35 Option<bool> observeNamedValues{
36 *this, "observe-named-values",
37 llvm::cl::desc("Make values with `sv.namehint` observable"),
38 llvm::cl::init(false)};
39
40 Option<bool> observeMemories{
41 *this, "observe-memories",
42 llvm::cl::desc("Make all memory contents observable"),
43 llvm::cl::init(false)};
44
45 Option<bool> asyncResetsAsSync{
46 *this, "async-resets-as-sync",
47 llvm::cl::desc("Treat asynchronous firreg resets as synchronous"),
48 llvm::cl::init(false)};
49};
51 mlir::OpPassManager &pm, const ArcPreprocessingOptions &options = {});
52
53// Restructure the input from a `hw.module` hierarchy to a collection of arcs.
54struct ArcConversionOptions : mlir::PassPipelineOptions<ArcConversionOptions> {
55 Option<bool> observeRegisters{*this, "observe-registers",
56 llvm::cl::desc("Make all registers observable"),
57 llvm::cl::init(false)};
58
59 Option<bool> shouldDedup{*this, "dedup", llvm::cl::desc("Deduplicate arcs"),
60 llvm::cl::init(true)};
61};
62void populateArcConversionPipeline(mlir::OpPassManager &pm,
63 const ArcConversionOptions &options = {});
64
65// Perform arc-level optimizations that are not specific to software
66// simulation.
68 : mlir::PassPipelineOptions<ArcOptimizationOptions> {
69 Option<bool> shouldDedup{*this, "dedup", llvm::cl::desc("Deduplicate arcs"),
70 llvm::cl::init(true)};
71
72 Option<bool> shouldDetectEnables{
73 *this, "detect-enables",
74 llvm::cl::desc("Infer enable conditions for states to avoid computation"),
75 llvm::cl::init(true)};
76
77 Option<bool> shouldDetectResets{
78 *this, "detect-resets",
79 llvm::cl::desc("Infer reset conditions for states to avoid computation"),
80 llvm::cl::init(false)};
81
82 Option<bool> shouldMakeLUTs{
83 *this, "lookup-tables",
84 llvm::cl::desc("Optimize arcs into lookup tables"), llvm::cl::init(true)};
85};
87 mlir::OpPassManager &pm, const ArcOptimizationOptions &options = {});
88
89// Lower stateful arcs into explicit state reads and writes.
91 : mlir::PassPipelineOptions<ArcStateLoweringOptions> {
92 Option<bool> shouldInline{*this, "inline", llvm::cl::desc("Inline arcs"),
93 llvm::cl::init(true)};
94};
96 mlir::OpPassManager &pm, const ArcStateLoweringOptions &options = {});
97
98// Allocate states.
100 : mlir::PassPipelineOptions<ArcStateAllocationOptions> {
101 Option<unsigned> splitFuncsThreshold{
102 *this, "split-funcs-threshold",
103 llvm::cl::desc("Split large MLIR functions that occur above the given "
104 "size threshold"),
105 llvm::cl::ValueOptional};
106 Option<bool> insertTraceTaps{
107 *this, "trace-taps",
108 llvm::cl::desc("Insert trace instrumentation for observed values"),
109 llvm::cl::init(false)};
110};
112 mlir::OpPassManager &pm, const ArcStateAllocationOptions &options = {});
113
114// Lower the arcs and update functions to LLVM. This pipeline lowers modules to
115// LLVM IR.
116struct ArcToLLVMOptions : mlir::PassPipelineOptions<ArcToLLVMOptions> {
117 Option<bool> noRuntime{
118 *this, "no-runtime",
119 llvm::cl::desc("Don't emit calls to the runtime library"),
120 llvm::cl::init(false)};
121 Option<std::string> extraRuntimeArgs{
122 *this, "extra-runtime-args",
123 llvm::cl::desc(
124 "Extra arguments passed to the runtime library for JIT runs"),
125 llvm::cl::init("")};
126 Option<std::string> traceFileName{
127 *this, "trace-file", llvm::cl::desc("Output file for signal traces"),
128 llvm::cl::init("")};
129};
130void populateArcToLLVMPipeline(mlir::OpPassManager &pm,
131 const ArcToLLVMOptions &options = {});
132
133} // namespace circt
134
135#endif // TOOLS_ARCILATOR_PIPELINE_H
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
void populateArcStateLoweringPipeline(mlir::OpPassManager &pm, const ArcStateLoweringOptions &options={})
void populateArcToLLVMPipeline(mlir::OpPassManager &pm, const ArcToLLVMOptions &options={})
void populateArcOptimizationPipeline(mlir::OpPassManager &pm, const ArcOptimizationOptions &options={})
void populateArcConversionPipeline(mlir::OpPassManager &pm, const ArcConversionOptions &options={})
void populateArcPreprocessingPipeline(mlir::OpPassManager &pm, const ArcPreprocessingOptions &options={})
void populateArcStateAllocationPipeline(mlir::OpPassManager &pm, const ArcStateAllocationOptions &options={})
Option< bool > observeRegisters
Definition pipelines.h:55
Option< bool > shouldDedup
Definition pipelines.h:59
Option< bool > shouldMakeLUTs
Definition pipelines.h:82
Option< bool > shouldDetectResets
Definition pipelines.h:77
Option< bool > shouldDetectEnables
Definition pipelines.h:72
Option< bool > observeNamedValues
Definition pipelines.h:35
Option< bool > observeMemories
Definition pipelines.h:40
Option< bool > asyncResetsAsSync
Definition pipelines.h:45
Option< unsigned > splitFuncsThreshold
Definition pipelines.h:101
Option< std::string > traceFileName
Definition pipelines.h:126
Option< bool > noRuntime
Definition pipelines.h:117
Option< std::string > extraRuntimeArgs
Definition pipelines.h:121