circt/lib/Bindings/Python/CIRCTModule.cpp

182 lines
6.9 KiB
C++

//===- CIRCTModule.cpp - Main pybind module -------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "CIRCTModules.h"
#include "circt-c/Conversion.h"
#include "circt-c/Dialect/Arc.h"
#include "circt-c/Dialect/Comb.h"
#include "circt-c/Dialect/DC.h"
#include "circt-c/Dialect/Debug.h"
#include "circt-c/Dialect/ESI.h"
#include "circt-c/Dialect/Emit.h"
#include "circt-c/Dialect/FSM.h"
#include "circt-c/Dialect/HW.h"
#include "circt-c/Dialect/HWArith.h"
#include "circt-c/Dialect/Handshake.h"
#include "circt-c/Dialect/LTL.h"
#include "circt-c/Dialect/MSFT.h"
#include "circt-c/Dialect/OM.h"
#include "circt-c/Dialect/RTG.h"
#include "circt-c/Transforms.h"
#ifdef CIRCT_INCLUDE_TESTS
#include "circt-c/Dialect/RTGTest.h"
#endif
#include "circt-c/Dialect/SMT.h"
#include "circt-c/Dialect/SV.h"
#include "circt-c/Dialect/Seq.h"
#include "circt-c/Dialect/Verif.h"
#include "circt-c/ExportVerilog.h"
#include "mlir-c/Bindings/Python/Interop.h"
#include "mlir-c/IR.h"
#include "mlir-c/Transforms.h"
#include "mlir/Bindings/Python/PybindAdaptors.h"
#include "llvm-c/ErrorHandling.h"
#include "llvm/Support/Signals.h"
#include "PybindUtils.h"
#include <pybind11/pybind11.h>
namespace py = pybind11;
static void registerPasses() {
registerArcPasses();
registerCombPasses();
registerDCPasses();
registerSeqPasses();
registerSVPasses();
registerFSMPasses();
registerHWArithPasses();
registerHWPasses();
registerHandshakePasses();
mlirRegisterCIRCTConversionPasses();
mlirRegisterCIRCTTransformsPasses();
mlirRegisterTransformsCSE();
}
PYBIND11_MODULE(_circt, m) {
m.doc() = "CIRCT Python Native Extension";
registerPasses();
llvm::sys::PrintStackTraceOnErrorSignal(/*argv=*/"");
LLVMEnablePrettyStackTrace();
m.def(
"register_dialects",
[](py::object capsule) {
// Get the MlirContext capsule from PyMlirContext capsule.
auto wrappedCapsule = capsule.attr(MLIR_PYTHON_CAPI_PTR_ATTR);
MlirContext context = mlirPythonCapsuleToContext(wrappedCapsule.ptr());
// Collect CIRCT dialects to register.
MlirDialectHandle comb = mlirGetDialectHandle__comb__();
mlirDialectHandleRegisterDialect(comb, context);
mlirDialectHandleLoadDialect(comb, context);
MlirDialectHandle debug = mlirGetDialectHandle__debug__();
mlirDialectHandleRegisterDialect(debug, context);
mlirDialectHandleLoadDialect(debug, context);
MlirDialectHandle emit = mlirGetDialectHandle__emit__();
mlirDialectHandleRegisterDialect(emit, context);
mlirDialectHandleLoadDialect(emit, context);
MlirDialectHandle esi = mlirGetDialectHandle__esi__();
mlirDialectHandleRegisterDialect(esi, context);
mlirDialectHandleLoadDialect(esi, context);
MlirDialectHandle msft = mlirGetDialectHandle__msft__();
mlirDialectHandleRegisterDialect(msft, context);
mlirDialectHandleLoadDialect(msft, context);
MlirDialectHandle hw = mlirGetDialectHandle__hw__();
mlirDialectHandleRegisterDialect(hw, context);
mlirDialectHandleLoadDialect(hw, context);
MlirDialectHandle hwarith = mlirGetDialectHandle__hwarith__();
mlirDialectHandleRegisterDialect(hwarith, context);
mlirDialectHandleLoadDialect(hwarith, context);
MlirDialectHandle om = mlirGetDialectHandle__om__();
mlirDialectHandleRegisterDialect(om, context);
mlirDialectHandleLoadDialect(om, context);
MlirDialectHandle rtg = mlirGetDialectHandle__rtg__();
mlirDialectHandleRegisterDialect(rtg, context);
mlirDialectHandleLoadDialect(rtg, context);
#ifdef CIRCT_INCLUDE_TESTS
MlirDialectHandle rtgtest = mlirGetDialectHandle__rtgtest__();
mlirDialectHandleRegisterDialect(rtgtest, context);
mlirDialectHandleLoadDialect(rtgtest, context);
#endif
MlirDialectHandle seq = mlirGetDialectHandle__seq__();
mlirDialectHandleRegisterDialect(seq, context);
mlirDialectHandleLoadDialect(seq, context);
MlirDialectHandle sv = mlirGetDialectHandle__sv__();
mlirDialectHandleRegisterDialect(sv, context);
mlirDialectHandleLoadDialect(sv, context);
MlirDialectHandle fsm = mlirGetDialectHandle__fsm__();
mlirDialectHandleRegisterDialect(fsm, context);
mlirDialectHandleLoadDialect(fsm, context);
MlirDialectHandle handshake = mlirGetDialectHandle__handshake__();
mlirDialectHandleRegisterDialect(handshake, context);
mlirDialectHandleLoadDialect(handshake, context);
MlirDialectHandle ltl = mlirGetDialectHandle__ltl__();
mlirDialectHandleRegisterDialect(ltl, context);
mlirDialectHandleLoadDialect(ltl, context);
MlirDialectHandle verif = mlirGetDialectHandle__verif__();
mlirDialectHandleRegisterDialect(verif, context);
mlirDialectHandleLoadDialect(verif, context);
MlirDialectHandle smt = mlirGetDialectHandle__smt__();
mlirDialectHandleRegisterDialect(smt, context);
mlirDialectHandleLoadDialect(smt, context);
},
"Register CIRCT dialects on a PyMlirContext.");
m.def("export_verilog", [](MlirModule mod, py::object fileObject) {
circt::python::PyFileAccumulator accum(fileObject, false);
py::gil_scoped_release();
mlirExportVerilog(mod, accum.getCallback(), accum.getUserData());
});
m.def("export_split_verilog", [](MlirModule mod, std::string directory) {
auto cDirectory = mlirStringRefCreateFromCString(directory.c_str());
mlirExportSplitVerilog(mod, cDirectory);
});
py::module esi = m.def_submodule("_esi", "ESI API");
circt::python::populateDialectESISubmodule(esi);
py::module msft = m.def_submodule("_msft", "MSFT API");
circt::python::populateDialectMSFTSubmodule(msft);
py::module hw = m.def_submodule("_hw", "HW API");
circt::python::populateDialectHWSubmodule(hw);
py::module seq = m.def_submodule("_seq", "Seq API");
circt::python::populateDialectSeqSubmodule(seq);
py::module om = m.def_submodule("_om", "OM API");
circt::python::populateDialectOMSubmodule(om);
py::module rtg = m.def_submodule("_rtg", "RTG API");
circt::python::populateDialectRTGSubmodule(rtg);
py::module rtgtool = m.def_submodule("_rtgtool", "RTGTool API");
circt::python::populateDialectRTGToolSubmodule(rtgtool);
#ifdef CIRCT_INCLUDE_TESTS
py::module rtgtest = m.def_submodule("_rtgtest", "RTGTest API");
circt::python::populateDialectRTGTestSubmodule(rtgtest);
#endif
py::module sv = m.def_submodule("_sv", "SV API");
circt::python::populateDialectSVSubmodule(sv);
py::module support = m.def_submodule("_support", "CIRCT support");
circt::python::populateSupportSubmodule(support);
}