CIRCT 23.0.0git
Loading...
Searching...
No Matches
CIRCTModule.cpp
Go to the documentation of this file.
1//===- CIRCTModule.cpp - Main nanobind module -----------------------------===//
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#include "CIRCTModules.h"
10
11#include "circt-c/Conversion.h"
12#include "circt-c/Dialect/Arc.h"
14#include "circt-c/Dialect/DC.h"
16#include "circt-c/Dialect/ESI.h"
18#include "circt-c/Dialect/FSM.h"
19#include "circt-c/Dialect/HW.h"
23#include "circt-c/Dialect/LTL.h"
25#include "circt-c/Dialect/OM.h"
27#include "circt-c/Dialect/RTG.h"
29#include "circt-c/Transforms.h"
30#ifdef CIRCT_INCLUDE_TESTS
32#endif
33#include "circt-c/Dialect/SV.h"
34#include "circt-c/Dialect/Seq.h"
35#include "circt-c/Dialect/Sim.h"
37#include "circt-c/ExportLLVM.h"
39#include "mlir-c/Bindings/Python/Interop.h"
40#include "mlir-c/Dialect/ControlFlow.h"
41#include "mlir-c/Dialect/Func.h"
42#include "mlir-c/Dialect/Index.h"
43#include "mlir-c/Dialect/LLVM.h"
44#include "mlir-c/Dialect/SCF.h"
45#include "mlir-c/Dialect/SMT.h"
46#include "mlir-c/IR.h"
47#include "mlir-c/Transforms.h"
48#include "mlir/Bindings/Python/NanobindAdaptors.h"
49
50#include "llvm-c/ErrorHandling.h"
51#include "llvm/ADT/StringRef.h"
52#include "llvm/Support/Signals.h"
53
54#include "NanobindUtils.h"
55#include <nanobind/nanobind.h>
56namespace nb = nanobind;
57
58static void registerPasses() {
67 mlirRegisterRTGPasses();
73 mlirRegisterCIRCTConversionPasses();
74 mlirRegisterCIRCTTransformsPasses();
75 mlirRegisterTransformsCSEPass();
76}
77
78NB_MODULE(_circt, m) {
79 m.doc() = "CIRCT Python Native Extension";
81 llvm::sys::PrintStackTraceOnErrorSignal(/*argv=*/"");
82 LLVMEnablePrettyStackTrace();
83
84 m.def(
85 "register_dialects",
86 [](nb::object capsule) {
87 // Get the MlirContext capsule from PyMlirContext capsule.
88 auto wrappedCapsule = capsule.attr(MLIR_PYTHON_CAPI_PTR_ATTR);
89 MlirContext context = mlirPythonCapsuleToContext(wrappedCapsule.ptr());
90
91 // Collect CIRCT dialects to register.
92
93 MlirDialectHandle arc = mlirGetDialectHandle__arc__();
94 mlirDialectHandleRegisterDialect(arc, context);
95 mlirDialectHandleLoadDialect(arc, context);
96
97 MlirDialectHandle comb = mlirGetDialectHandle__comb__();
98 mlirDialectHandleRegisterDialect(comb, context);
99 mlirDialectHandleLoadDialect(comb, context);
100
101 MlirDialectHandle debug = mlirGetDialectHandle__debug__();
102 mlirDialectHandleRegisterDialect(debug, context);
103 mlirDialectHandleLoadDialect(debug, context);
104
105 MlirDialectHandle emit = mlirGetDialectHandle__emit__();
106 mlirDialectHandleRegisterDialect(emit, context);
107 mlirDialectHandleLoadDialect(emit, context);
108
109 MlirDialectHandle esi = mlirGetDialectHandle__esi__();
110 mlirDialectHandleRegisterDialect(esi, context);
111 mlirDialectHandleLoadDialect(esi, context);
112
113 MlirDialectHandle msft = mlirGetDialectHandle__msft__();
114 mlirDialectHandleRegisterDialect(msft, context);
115 mlirDialectHandleLoadDialect(msft, context);
116
117 MlirDialectHandle hw = mlirGetDialectHandle__hw__();
118 mlirDialectHandleRegisterDialect(hw, context);
119 mlirDialectHandleLoadDialect(hw, context);
120
121 MlirDialectHandle hwarith = mlirGetDialectHandle__hwarith__();
122 mlirDialectHandleRegisterDialect(hwarith, context);
123 mlirDialectHandleLoadDialect(hwarith, context);
124
125 MlirDialectHandle index = mlirGetDialectHandle__index__();
126 mlirDialectHandleRegisterDialect(index, context);
127 mlirDialectHandleLoadDialect(index, context);
128
129 MlirDialectHandle llvm = mlirGetDialectHandle__llvm__();
130 mlirDialectHandleRegisterDialect(llvm, context);
131 // We don't load the LLVM, cf, or func dialects here since they don't
132 // load all of their promised interfaces. If you need to load them, you
133 // can do so by calling `Context().load_all_available_dialects()` in
134 // Python.
135
136 MlirDialectHandle scf = mlirGetDialectHandle__scf__();
137 mlirDialectHandleRegisterDialect(scf, context);
138 mlirDialectHandleLoadDialect(scf, context);
139
140 MlirDialectHandle cf = mlirGetDialectHandle__cf__();
141 mlirDialectHandleRegisterDialect(cf, context);
142 // no eager-load
143
144 MlirDialectHandle func = mlirGetDialectHandle__func__();
145 mlirDialectHandleRegisterDialect(func, context);
146 // no eager-load
147
148 MlirDialectHandle om = mlirGetDialectHandle__om__();
149 mlirDialectHandleRegisterDialect(om, context);
150 mlirDialectHandleLoadDialect(om, context);
151
152 MlirDialectHandle pipeline = mlirGetDialectHandle__pipeline__();
153 mlirDialectHandleRegisterDialect(pipeline, context);
154 mlirDialectHandleLoadDialect(pipeline, context);
155
156 MlirDialectHandle rtg = mlirGetDialectHandle__rtg__();
157 mlirDialectHandleRegisterDialect(rtg, context);
158 mlirDialectHandleLoadDialect(rtg, context);
159
160#ifdef CIRCT_INCLUDE_TESTS
161 MlirDialectHandle rtgtest = mlirGetDialectHandle__rtgtest__();
162 mlirDialectHandleRegisterDialect(rtgtest, context);
163 mlirDialectHandleLoadDialect(rtgtest, context);
164#endif
165
166 MlirDialectHandle seq = mlirGetDialectHandle__seq__();
167 mlirDialectHandleRegisterDialect(seq, context);
168 mlirDialectHandleLoadDialect(seq, context);
169
170 MlirDialectHandle sim = mlirGetDialectHandle__sim__();
171 mlirDialectHandleRegisterDialect(sim, context);
172 mlirDialectHandleLoadDialect(sim, context);
173
174 MlirDialectHandle sv = mlirGetDialectHandle__sv__();
175 mlirDialectHandleRegisterDialect(sv, context);
176 mlirDialectHandleLoadDialect(sv, context);
177
178 MlirDialectHandle synth = mlirGetDialectHandle__synth__();
179 mlirDialectHandleRegisterDialect(synth, context);
180 mlirDialectHandleLoadDialect(synth, context);
181
182 MlirDialectHandle fsm = mlirGetDialectHandle__fsm__();
183 mlirDialectHandleRegisterDialect(fsm, context);
184 mlirDialectHandleLoadDialect(fsm, context);
185
186 MlirDialectHandle handshake = mlirGetDialectHandle__handshake__();
187 mlirDialectHandleRegisterDialect(handshake, context);
188 mlirDialectHandleLoadDialect(handshake, context);
189
190 MlirDialectHandle kanagawa = mlirGetDialectHandle__kanagawa__();
191 mlirDialectHandleRegisterDialect(kanagawa, context);
192 mlirDialectHandleLoadDialect(kanagawa, context);
193
194 MlirDialectHandle ltl = mlirGetDialectHandle__ltl__();
195 mlirDialectHandleRegisterDialect(ltl, context);
196 mlirDialectHandleLoadDialect(ltl, context);
197
198 MlirDialectHandle verif = mlirGetDialectHandle__verif__();
199 mlirDialectHandleRegisterDialect(verif, context);
200 mlirDialectHandleLoadDialect(verif, context);
201
202 MlirDialectHandle smt = mlirGetDialectHandle__smt__();
203 mlirDialectHandleRegisterDialect(smt, context);
204 mlirDialectHandleLoadDialect(smt, context);
205 },
206 "Register CIRCT dialects on a PyMlirContext.");
207
208 m.def("export_verilog", [](MlirModule mod, nb::object fileObject) {
209 circt::python::PyFileAccumulator accum(fileObject, false);
210 mlirExportVerilog(mod, accum.getCallback(), accum.getUserData());
211 });
212
213 m.def("export_split_verilog", [](MlirModule mod, std::string directory) {
214 auto cDirectory = mlirStringRefCreateFromCString(directory.c_str());
215 mlirExportSplitVerilog(mod, cDirectory);
216 });
217
218 m.def("export_llvm_ir", [](MlirModule mod, nb::object fileObject) {
219 circt::python::PyFileAccumulator accum(fileObject, false);
220 mlirExportLLVMIR(mod, accum.getCallback(), accum.getUserData());
221 });
222
223 nb::module_ arc = m.def_submodule("_arc", "Arc API");
225 nb::module_ synth = m.def_submodule("_synth", "synth API");
227 nb::module_ esi = m.def_submodule("_esi", "ESI API");
229 nb::module_ msft = m.def_submodule("_msft", "MSFT API");
231 nb::module_ hw = m.def_submodule("_hw", "HW API");
233 nb::module_ seq = m.def_submodule("_seq", "Seq API");
235 nb::module_ om = m.def_submodule("_om", "OM API");
237 nb::module_ pipeline = m.def_submodule("_pipeline", "Pipeline API");
239 nb::module_ rtg = m.def_submodule("_rtg", "RTG API");
241#ifdef CIRCT_INCLUDE_TESTS
242 nb::module_ rtgtest = m.def_submodule("_rtgtest", "RTGTest API");
243 circt::python::populateDialectRTGTestSubmodule(rtgtest);
244#endif
245 nb::module_ sv = m.def_submodule("_sv", "SV API");
247 nb::module_ support = m.def_submodule("_support", "CIRCT support");
249}
MLIR_CAPI_EXPORTED void registerArcPasses(void)
Definition Arc.cpp:21
NB_MODULE(_circt, m)
static void registerPasses()
MLIR_CAPI_EXPORTED void registerCombPasses(void)
Definition Comb.cpp:16
MLIR_CAPI_EXPORTED void registerDCPasses(void)
Definition DC.cpp:18
static std::unique_ptr< Context > context
MLIR_CAPI_EXPORTED MlirLogicalResult mlirExportLLVMIR(MlirModule, MlirStringCallback, void *userData)
Exports LLVM IR for the specified module using the provided callback and user data.
MLIR_CAPI_EXPORTED void registerFSMPasses(void)
Definition FSM.cpp:19
MLIR_CAPI_EXPORTED void registerHWArithPasses(void)
Definition HWArith.cpp:16
MLIR_CAPI_EXPORTED void registerHWPasses(void)
Definition HW.cpp:32
MLIR_CAPI_EXPORTED void registerHandshakePasses(void)
Definition Handshake.cpp:18
MLIR_CAPI_EXPORTED void registerKanagawaPasses(void)
MLIR_CAPI_EXPORTED void registerPipelinePasses(void)
MLIR_CAPI_EXPORTED void registerRTGPipelines(void)
Definition RTG.cpp:28
MLIR_CAPI_EXPORTED void registerSVPasses(void)
Definition SV.cpp:19
MLIR_CAPI_EXPORTED void registerSeqPasses(void)
Definition Seq.cpp:22
MLIR_CAPI_EXPORTED void registerSynthesisPipeline(void)
Definition Synth.cpp:34
MLIR_CAPI_EXPORTED MlirLogicalResult mlirExportSplitVerilog(MlirModule, MlirStringRef)
Emits split Verilog files for the specified module into the given directory.
MLIR_CAPI_EXPORTED MlirLogicalResult mlirExportVerilog(MlirModule, MlirStringCallback, void *userData)
Emits verilog for the specified module using the provided callback and user data.
Taken from NanobindUtils.h in MLIR.
MlirStringCallback getCallback()
Definition arc.py:1
void populateDialectSVSubmodule(nanobind::module_ &m)
void populateDialectArcSubmodule(nanobind::module_ &m)
void populateDialectRTGSubmodule(nanobind::module_ &m)
void populateDialectPipelineSubmodule(nanobind::module_ &m)
void populateDialectESISubmodule(nanobind::module_ &m)
void populateDialectHWSubmodule(nanobind::module_ &m)
void populateSupportSubmodule(nanobind::module_ &m)
void populateDialectOMSubmodule(nanobind::module_ &m)
void populateDialectSynthSubmodule(nanobind::module_ &m)
void populateDialectMSFTSubmodule(nanobind::module_ &m)
void populateDialectSeqSubmodule(nanobind::module_ &m)
Definition comb.py:1
Definition debug.py:1
Definition emit.py:1
Definition esi.py:1
Definition fsm.py:1
Definition hw.py:1
Definition ltl.py:1
Definition msft.py:1
Definition om.py:1
Definition rtg.py:1
Definition seq.py:1
Definition sim.py:1
Definition sv.py:1
Definition synth.py:1
Definition verif.py:1