CIRCT  18.0.0git
CIRCTModule.cpp
Go to the documentation of this file.
1 //===- CIRCTModule.cpp - Main pybind 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 "DialectModules.h"
10 
11 #include "circt-c/Conversion.h"
12 #include "circt-c/Dialect/Comb.h"
13 #include "circt-c/Dialect/ESI.h"
14 #include "circt-c/Dialect/FSM.h"
15 #include "circt-c/Dialect/HW.h"
18 #include "circt-c/Dialect/LTL.h"
19 #include "circt-c/Dialect/MSFT.h"
20 #include "circt-c/Dialect/OM.h"
21 #include "circt-c/Dialect/SV.h"
22 #include "circt-c/Dialect/Seq.h"
23 #include "circt-c/Dialect/Verif.h"
24 #include "circt-c/ExportVerilog.h"
25 #include "mlir-c/Bindings/Python/Interop.h"
26 #include "mlir-c/IR.h"
27 #include "mlir-c/Transforms.h"
28 #include "mlir/Bindings/Python/PybindAdaptors.h"
29 
30 #include "llvm-c/ErrorHandling.h"
31 #include "llvm/Support/Signals.h"
32 
33 #include "PybindUtils.h"
34 #include <pybind11/pybind11.h>
35 namespace py = pybind11;
36 
37 static void registerPasses() {
43  mlirRegisterConversionPasses();
44  mlirRegisterTransformsPasses();
45 }
46 
47 PYBIND11_MODULE(_circt, m) {
48  m.doc() = "CIRCT Python Native Extension";
50  llvm::sys::PrintStackTraceOnErrorSignal(/*argv=*/"");
51  LLVMEnablePrettyStackTrace();
52 
53  m.def(
54  "register_dialects",
55  [](py::object capsule) {
56  // Get the MlirContext capsule from PyMlirContext capsule.
57  auto wrappedCapsule = capsule.attr(MLIR_PYTHON_CAPI_PTR_ATTR);
58  MlirContext context = mlirPythonCapsuleToContext(wrappedCapsule.ptr());
59 
60  // Collect CIRCT dialects to register.
61  MlirDialectHandle comb = mlirGetDialectHandle__comb__();
62  mlirDialectHandleRegisterDialect(comb, context);
63  mlirDialectHandleLoadDialect(comb, context);
64 
65  MlirDialectHandle esi = mlirGetDialectHandle__esi__();
66  mlirDialectHandleRegisterDialect(esi, context);
67  mlirDialectHandleLoadDialect(esi, context);
68 
69  MlirDialectHandle msft = mlirGetDialectHandle__msft__();
70  mlirDialectHandleRegisterDialect(msft, context);
71  mlirDialectHandleLoadDialect(msft, context);
72 
73  MlirDialectHandle hw = mlirGetDialectHandle__hw__();
74  mlirDialectHandleRegisterDialect(hw, context);
75  mlirDialectHandleLoadDialect(hw, context);
76 
77  MlirDialectHandle hwarith = mlirGetDialectHandle__hwarith__();
78  mlirDialectHandleRegisterDialect(hwarith, context);
79  mlirDialectHandleLoadDialect(hwarith, context);
80 
81  MlirDialectHandle om = mlirGetDialectHandle__om__();
82  mlirDialectHandleRegisterDialect(om, context);
83  mlirDialectHandleLoadDialect(om, context);
84 
85  MlirDialectHandle seq = mlirGetDialectHandle__seq__();
86  mlirDialectHandleRegisterDialect(seq, context);
87  mlirDialectHandleLoadDialect(seq, context);
88 
89  MlirDialectHandle sv = mlirGetDialectHandle__sv__();
90  mlirDialectHandleRegisterDialect(sv, context);
91  mlirDialectHandleLoadDialect(sv, context);
92 
93  MlirDialectHandle fsm = mlirGetDialectHandle__fsm__();
94  mlirDialectHandleRegisterDialect(fsm, context);
95  mlirDialectHandleLoadDialect(fsm, context);
96 
97  MlirDialectHandle handshake = mlirGetDialectHandle__handshake__();
98  mlirDialectHandleRegisterDialect(handshake, context);
99  mlirDialectHandleLoadDialect(handshake, context);
100 
101  MlirDialectHandle ltl = mlirGetDialectHandle__ltl__();
102  mlirDialectHandleRegisterDialect(ltl, context);
103  mlirDialectHandleLoadDialect(ltl, context);
104 
105  MlirDialectHandle verif = mlirGetDialectHandle__verif__();
106  mlirDialectHandleRegisterDialect(verif, context);
107  mlirDialectHandleLoadDialect(verif, context);
108  },
109  "Register CIRCT dialects on a PyMlirContext.");
110 
111  m.def("export_verilog", [](MlirModule mod, py::object fileObject) {
112  circt::python::PyFileAccumulator accum(fileObject, false);
113  py::gil_scoped_release();
114  mlirExportVerilog(mod, accum.getCallback(), accum.getUserData());
115  });
116 
117  m.def("export_split_verilog", [](MlirModule mod, std::string directory) {
118  auto cDirectory = mlirStringRefCreateFromCString(directory.c_str());
119  mlirExportSplitVerilog(mod, cDirectory);
120  });
121 
122  py::module esi = m.def_submodule("_esi", "ESI API");
124  py::module msft = m.def_submodule("_msft", "MSFT API");
126  py::module hw = m.def_submodule("_hw", "HW API");
128  py::module seq = m.def_submodule("_seq", "Seq API");
130  py::module om = m.def_submodule("_om", "OM API");
132  py::module sv = m.def_submodule("_sv", "SV API");
134 }
static void registerPasses()
Definition: CIRCTModule.cpp:37
PYBIND11_MODULE(_circt, m)
Definition: CIRCTModule.cpp:47
MLIR_CAPI_EXPORTED void registerFSMPasses(void)
Definition: FSM.cpp:17
MLIR_CAPI_EXPORTED void registerHWArithPasses(void)
Definition: HWArith.cpp:12
MLIR_CAPI_EXPORTED void registerHandshakePasses(void)
Definition: Handshake.cpp:16
MLIR_CAPI_EXPORTED void registerSVPasses(void)
Definition: SV.cpp:17
MLIR_CAPI_EXPORTED void registerSeqPasses(void)
Definition: Seq.cpp:20
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 PybindUtils.h in MLIR.
Definition: PybindUtils.h:36
MlirStringCallback getCallback()
Definition: PybindUtils.h:43
void populateDialectMSFTSubmodule(pybind11::module &m)
void populateDialectOMSubmodule(pybind11::module &m)
void populateDialectHWSubmodule(pybind11::module &m)
void populateDialectESISubmodule(pybind11::module &m)
void populateDialectSeqSubmodule(pybind11::module &m)
void populateDialectSVSubmodule(pybind11::module &m)
Definition: comb.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: seq.py:1
Definition: sv.py:1
Definition: verif.py:1