Loading [MathJax]/extensions/tex2jax.js
CIRCT 22.0.0git
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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/AIG.h"
13#include "circt-c/Dialect/Arc.h"
15#include "circt-c/Dialect/DC.h"
17#include "circt-c/Dialect/ESI.h"
19#include "circt-c/Dialect/FSM.h"
20#include "circt-c/Dialect/HW.h"
24#include "circt-c/Dialect/LTL.h"
26#include "circt-c/Dialect/OM.h"
28#include "circt-c/Dialect/RTG.h"
29#include "circt-c/Synthesis.h"
30#include "circt-c/Transforms.h"
31#ifdef CIRCT_INCLUDE_TESTS
33#endif
34#include "circt-c/Dialect/SV.h"
35#include "circt-c/Dialect/Seq.h"
38#include "mlir-c/Bindings/Python/Interop.h"
39#include "mlir-c/Dialect/Index.h"
40#include "mlir-c/Dialect/SCF.h"
41#include "mlir-c/Dialect/SMT.h"
42#include "mlir-c/IR.h"
43#include "mlir-c/Transforms.h"
44#include "mlir/Bindings/Python/NanobindAdaptors.h"
45
46#include "llvm-c/ErrorHandling.h"
47#include "llvm/Support/Signals.h"
48
49#include "NanobindUtils.h"
50#include <nanobind/nanobind.h>
51namespace nb = nanobind;
52
53static void registerPasses() {
68 mlirRegisterCIRCTConversionPasses();
69 mlirRegisterCIRCTTransformsPasses();
70 mlirRegisterTransformsCSE();
71}
72
73NB_MODULE(_circt, m) {
74 m.doc() = "CIRCT Python Native Extension";
76 llvm::sys::PrintStackTraceOnErrorSignal(/*argv=*/"");
77 LLVMEnablePrettyStackTrace();
78
79 m.def(
80 "register_dialects",
81 [](nb::object capsule) {
82 // Get the MlirContext capsule from PyMlirContext capsule.
83 auto wrappedCapsule = capsule.attr(MLIR_PYTHON_CAPI_PTR_ATTR);
84 MlirContext context = mlirPythonCapsuleToContext(wrappedCapsule.ptr());
85
86 // Collect CIRCT dialects to register.
87 MlirDialectHandle aig = mlirGetDialectHandle__aig__();
88 mlirDialectHandleRegisterDialect(aig, context);
89 mlirDialectHandleLoadDialect(aig, context);
90
91 MlirDialectHandle comb = mlirGetDialectHandle__comb__();
92 mlirDialectHandleRegisterDialect(comb, context);
93 mlirDialectHandleLoadDialect(comb, context);
94
95 MlirDialectHandle debug = mlirGetDialectHandle__debug__();
96 mlirDialectHandleRegisterDialect(debug, context);
97 mlirDialectHandleLoadDialect(debug, context);
98
99 MlirDialectHandle emit = mlirGetDialectHandle__emit__();
100 mlirDialectHandleRegisterDialect(emit, context);
101 mlirDialectHandleLoadDialect(emit, context);
102
103 MlirDialectHandle esi = mlirGetDialectHandle__esi__();
104 mlirDialectHandleRegisterDialect(esi, context);
105 mlirDialectHandleLoadDialect(esi, context);
106
107 MlirDialectHandle msft = mlirGetDialectHandle__msft__();
108 mlirDialectHandleRegisterDialect(msft, context);
109 mlirDialectHandleLoadDialect(msft, context);
110
111 MlirDialectHandle hw = mlirGetDialectHandle__hw__();
112 mlirDialectHandleRegisterDialect(hw, context);
113 mlirDialectHandleLoadDialect(hw, context);
114
115 MlirDialectHandle hwarith = mlirGetDialectHandle__hwarith__();
116 mlirDialectHandleRegisterDialect(hwarith, context);
117 mlirDialectHandleLoadDialect(hwarith, context);
118
119 MlirDialectHandle index = mlirGetDialectHandle__index__();
120 mlirDialectHandleRegisterDialect(index, context);
121 mlirDialectHandleLoadDialect(index, context);
122
123 MlirDialectHandle scf = mlirGetDialectHandle__scf__();
124 mlirDialectHandleRegisterDialect(scf, context);
125 mlirDialectHandleLoadDialect(scf, context);
126
127 MlirDialectHandle om = mlirGetDialectHandle__om__();
128 mlirDialectHandleRegisterDialect(om, context);
129 mlirDialectHandleLoadDialect(om, context);
130
131 MlirDialectHandle pipeline = mlirGetDialectHandle__pipeline__();
132 mlirDialectHandleRegisterDialect(pipeline, context);
133 mlirDialectHandleLoadDialect(pipeline, context);
134
135 MlirDialectHandle rtg = mlirGetDialectHandle__rtg__();
136 mlirDialectHandleRegisterDialect(rtg, context);
137 mlirDialectHandleLoadDialect(rtg, context);
138
139#ifdef CIRCT_INCLUDE_TESTS
140 MlirDialectHandle rtgtest = mlirGetDialectHandle__rtgtest__();
141 mlirDialectHandleRegisterDialect(rtgtest, context);
142 mlirDialectHandleLoadDialect(rtgtest, context);
143#endif
144
145 MlirDialectHandle seq = mlirGetDialectHandle__seq__();
146 mlirDialectHandleRegisterDialect(seq, context);
147 mlirDialectHandleLoadDialect(seq, context);
148
149 MlirDialectHandle sv = mlirGetDialectHandle__sv__();
150 mlirDialectHandleRegisterDialect(sv, context);
151 mlirDialectHandleLoadDialect(sv, context);
152
153 MlirDialectHandle fsm = mlirGetDialectHandle__fsm__();
154 mlirDialectHandleRegisterDialect(fsm, context);
155 mlirDialectHandleLoadDialect(fsm, context);
156
157 MlirDialectHandle handshake = mlirGetDialectHandle__handshake__();
158 mlirDialectHandleRegisterDialect(handshake, context);
159 mlirDialectHandleLoadDialect(handshake, context);
160
161 MlirDialectHandle kanagawa = mlirGetDialectHandle__kanagawa__();
162 mlirDialectHandleRegisterDialect(kanagawa, context);
163 mlirDialectHandleLoadDialect(kanagawa, context);
164
165 MlirDialectHandle ltl = mlirGetDialectHandle__ltl__();
166 mlirDialectHandleRegisterDialect(ltl, context);
167 mlirDialectHandleLoadDialect(ltl, context);
168
169 MlirDialectHandle verif = mlirGetDialectHandle__verif__();
170 mlirDialectHandleRegisterDialect(verif, context);
171 mlirDialectHandleLoadDialect(verif, context);
172
173 MlirDialectHandle smt = mlirGetDialectHandle__smt__();
174 mlirDialectHandleRegisterDialect(smt, context);
175 mlirDialectHandleLoadDialect(smt, context);
176 },
177 "Register CIRCT dialects on a PyMlirContext.");
178
179 m.def("export_verilog", [](MlirModule mod, nb::object fileObject) {
180 circt::python::PyFileAccumulator accum(fileObject, false);
181 nb::gil_scoped_release();
182 mlirExportVerilog(mod, accum.getCallback(), accum.getUserData());
183 });
184
185 m.def("export_split_verilog", [](MlirModule mod, std::string directory) {
186 auto cDirectory = mlirStringRefCreateFromCString(directory.c_str());
187 mlirExportSplitVerilog(mod, cDirectory);
188 });
189
190 nb::module_ aig = m.def_submodule("_aig", "AIG API");
192 nb::module_ esi = m.def_submodule("_esi", "ESI API");
194 nb::module_ msft = m.def_submodule("_msft", "MSFT API");
196 nb::module_ hw = m.def_submodule("_hw", "HW API");
198 nb::module_ seq = m.def_submodule("_seq", "Seq API");
200 nb::module_ om = m.def_submodule("_om", "OM API");
202 nb::module_ rtg = m.def_submodule("_rtg", "RTG API");
204 nb::module_ rtgtool = m.def_submodule("_rtgtool", "RTGTool API");
206#ifdef CIRCT_INCLUDE_TESTS
207 nb::module_ rtgtest = m.def_submodule("_rtgtest", "RTGTest API");
208 circt::python::populateDialectRTGTestSubmodule(rtgtest);
209#endif
210 nb::module_ sv = m.def_submodule("_sv", "SV API");
212 nb::module_ support = m.def_submodule("_support", "CIRCT support");
214}
MLIR_CAPI_EXPORTED void registerAIGPasses(void)
Definition AIG.cpp:34
MLIR_CAPI_EXPORTED void registerArcPasses(void)
Definition Arc.cpp:18
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
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 registerRTGPasses(void)
Definition RTG.cpp:27
MLIR_CAPI_EXPORTED void registerSVPasses(void)
Definition SV.cpp:19
MLIR_CAPI_EXPORTED void registerSeqPasses(void)
Definition Seq.cpp:20
MLIR_CAPI_EXPORTED void registerSynthesisPipeline(void)
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 aig.py:1
void populateDialectSVSubmodule(nanobind::module_ &m)
void populateDialectRTGSubmodule(nanobind::module_ &m)
void populateDialectRTGToolSubmodule(nanobind::module_ &m)
void populateDialectESISubmodule(nanobind::module_ &m)
void populateDialectHWSubmodule(nanobind::module_ &m)
void populateSupportSubmodule(nanobind::module_ &m)
void populateDialectOMSubmodule(nanobind::module_ &m)
void populateDialectMSFTSubmodule(nanobind::module_ &m)
void populateDialectAIGSubmodule(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 sv.py:1
Definition verif.py:1