14#include "mlir/Bindings/Python/NanobindAdaptors.h"
15#include "mlir/CAPI/IR.h"
16#include "mlir/CAPI/Support.h"
23using namespace mlir::python::nanobind_adaptors;
26 return nb::module_::import_(
"circt.dialects.msft")
27 .attr(
"PhysLocationAttr")(attr)
36 return mlirLogicalResultIsSuccess(
53 MlirOperation
place(MlirOperation instOp, MlirAttribute loc,
54 std::string subpath, MlirLocation srcLoc) {
55 auto cSubpath = mlirStringRefCreate(subpath.c_str(), subpath.size());
62 return mlirLogicalResultIsSuccess(
69 uint64_t nearestToY) {
72 db, cPrim, column, nearestToY);
79 std::tuple<nb::object, nb::object, nb::object, nb::object> bounds,
80 nb::object prim, nb::object walkOrder) {
82 auto handleNone = [](nb::object o) {
83 return o.is_none() ? -1 : nb::cast<int64_t>(o);
85 int64_t cBounds[4] = {
86 handleNone(std::get<0>(bounds)), handleNone(std::get<1>(bounds)),
87 handleNone(std::get<2>(bounds)), handleNone(std::get<3>(bounds))};
92 cPrim = nb::cast<CirctMSFTPrimitiveType>(prim);
95 if (!walkOrder.is_none())
96 cWalkOrder = nb::cast<CirctMSFTWalkOrder>(walkOrder);
103 [](MlirAttribute loc, MlirOperation locOp,
void *userData) {
104 nb::gil_scoped_acquire gil;
105 nb::callable pycb = *((nb::callable *)(userData));
108 cBounds, cPrim, cWalkOrder, &pycb);
118 static std::optional<MlirAttribute>
getItem(MlirAttribute locVec,
121 if (loc.ptr ==
nullptr)
131 throw nb::stop_iteration();
136 static void bind(nb::module_ &m) {
137 nb::class_<PyLocationVecIterator>(m,
"LocationVectorAttrIterator")
151 m.doc() =
"MSFT dialect Python native extension";
155 nb::enum_<PrimitiveType>(m,
"PrimitiveType")
156 .value(
"M20K", PrimitiveType::M20K)
157 .value(
"DSP", PrimitiveType::DSP)
158 .value(
"FF", PrimitiveType::FF)
161 nb::enum_<CirctMSFTDirection>(m,
"Direction")
167 mlir_attribute_subclass(m,
"PhysLocationAttr",
171 [](nb::object cls, PrimitiveType devType, uint64_t x, uint64_t y,
172 uint64_t num, MlirContext ctxt) {
176 "Create a physical location attribute", nb::arg(),
177 nb::arg(
"dev_type"), nb::arg(
"x"), nb::arg(
"y"), nb::arg(
"num"),
178 nb::arg(
"ctxt") = nb::none())
179 .def_property_readonly(
181 [](MlirAttribute self) {
185 .def_property_readonly(
"x",
186 [](MlirAttribute self) {
189 .def_property_readonly(
"y",
190 [](MlirAttribute self) {
193 .def_property_readonly(
"num", [](MlirAttribute self) {
197 mlir_attribute_subclass(m,
"PhysicalBoundsAttr",
201 [](nb::object cls, uint64_t xMin, uint64_t xMax, uint64_t yMin,
202 uint64_t yMax, MlirContext ctxt) {
203 auto physicalBounds =
205 return cls(physicalBounds);
207 "Create a PhysicalBounds attribute", nb::arg(
"cls"), nb::arg(
"xMin"),
208 nb::arg(
"xMax"), nb::arg(
"yMin"), nb::arg(
"yMax"),
209 nb::arg(
"context") = nb::none());
211 mlir_attribute_subclass(m,
"LocationVectorAttr",
215 [](nb::object cls, MlirType type, std::vector<nb::handle> pylocs,
219 SmallVector<MlirAttribute> locs;
220 for (
auto attrHandle : pylocs)
221 if (attrHandle.is_none())
222 locs.push_back({
nullptr});
224 locs.push_back(mlirPythonCapsuleToAttribute(
225 mlirApiObjectToCapsule(attrHandle).ptr()));
229 "Create a LocationVector attribute", nb::arg(
"cls"), nb::arg(
"type"),
230 nb::arg(
"locs"), nb::arg(
"context") = nb::none())
234 "Get the location at the specified position", nb::arg(
"pos"))
239 nb::class_<PrimitiveDB>(m,
"PrimitiveDB")
240 .def(nb::init<MlirContext>(), nb::arg(
"ctxt") = nb::none())
242 "Inform the DB about a new placement.", nb::arg(
"loc_and_prim"))
244 "Query the DB as to whether or not a primitive exists.",
247 nb::class_<PlacementDB>(m,
"PlacementDB")
248 .def(nb::init<MlirModule, PrimitiveDB *>(), nb::arg(
"top"),
249 nb::arg(
"seed") =
nullptr)
251 nb::arg(
"dyn_inst"), nb::arg(
"location"), nb::arg(
"subpath"),
252 nb::arg(
"src_location") = nb::none())
254 "Remove a placement.", nb::arg(
"location"))
256 "Move a placement to another location.", nb::arg(
"old_location"),
257 nb::arg(
"new_location"))
259 "Find the nearest free primitive location in column.",
260 nb::arg(
"prim_type"), nb::arg(
"column"), nb::arg(
"nearest_to_y"))
262 "Get the instance at location. Returns None if nothing exists "
263 "there. Otherwise, returns (path, subpath, op) of the instance "
266 "Walk the placements, with possible bounds. Bounds are (xmin, xmax, "
267 "ymin, ymax) with 'None' being unbounded.",
270 std::make_tuple(nb::none(), nb::none(), nb::none(), nb::none()),
271 nb::arg(
"prim_type") = nb::none(),
272 nb::arg(
"walk_order") = nb::none());
274 nb::class_<CirctMSFTWalkOrder>(m,
"WalkOrder")
275 .def(nb::init<CirctMSFTDirection, CirctMSFTDirection>(),
static nb::handle getPhysLocationAttr(MlirAttribute attr)
MLIR_CAPI_EXPORTED uint64_t circtMSFTPhysLocationAttrGetNum(MlirAttribute)
MLIR_CAPI_EXPORTED MlirType circtMSFTLocationVectorAttrGetType(MlirAttribute)
MLIR_CAPI_EXPORTED CirctMSFTPlacementDB circtMSFTCreatePlacementDB(MlirModule top, CirctMSFTPrimitiveDB seed)
MLIR_CAPI_EXPORTED CirctMSFTPrimitiveType circtMSFTPhysLocationAttrGetPrimitiveType(MlirAttribute)
MLIR_CAPI_EXPORTED void circtMSFTDeletePlacementDB(CirctMSFTPlacementDB self)
MLIR_CAPI_EXPORTED bool circtMSFTAttributeIsAPhysicalBoundsAttr(MlirAttribute)
int32_t CirctMSFTPrimitiveType
MLIR_CAPI_EXPORTED bool circtMSFTAttributeIsALocationVectorAttribute(MlirAttribute)
MLIR_CAPI_EXPORTED MlirAttribute circtMSFTPlacementDBGetNearestFreeInColumn(CirctMSFTPlacementDB, CirctMSFTPrimitiveType prim, uint64_t column, uint64_t nearestToY)
MLIR_CAPI_EXPORTED MlirAttribute circtMSFTLocationVectorAttrGet(MlirContext, MlirType type, intptr_t numElements, MlirAttribute const *elements)
MLIR_CAPI_EXPORTED intptr_t circtMSFTLocationVectorAttrGetNumElements(MlirAttribute)
MLIR_CAPI_EXPORTED MlirLogicalResult circtMSFTPlacementDBMovePlacement(CirctMSFTPlacementDB, MlirOperation locOp, MlirAttribute newLoc)
MLIR_CAPI_EXPORTED MlirAttribute circtMSFTLocationVectorAttrGetElement(MlirAttribute attr, intptr_t pos)
MLIR_CAPI_EXPORTED void circtMSFTPlacementDBRemovePlacement(CirctMSFTPlacementDB, MlirOperation locOp)
MLIR_CAPI_EXPORTED bool circtMSFTPrimitiveDBIsValidLocation(CirctMSFTPrimitiveDB, MlirAttribute locAndPrim)
MLIR_CAPI_EXPORTED MlirOperation circtMSFTPlacementDBGetInstanceAt(CirctMSFTPlacementDB, MlirAttribute loc)
MLIR_CAPI_EXPORTED CirctMSFTPrimitiveDB circtMSFTCreatePrimitiveDB(MlirContext)
MLIR_CAPI_EXPORTED void circtMSFTDeletePrimitiveDB(CirctMSFTPrimitiveDB self)
MLIR_CAPI_EXPORTED uint64_t circtMSFTPhysLocationAttrGetX(MlirAttribute)
MLIR_CAPI_EXPORTED void circtMSFTPlacementDBWalkPlacements(CirctMSFTPlacementDB, CirctMSFTPlacementCallback, int64_t bounds[4], CirctMSFTPrimitiveType primTypeFilter, CirctMSFTWalkOrder walkOrder, void *userData)
Walk all the placements within 'bounds' ([xmin, xmax, ymin, ymax], inclusive on all sides),...
MLIR_CAPI_EXPORTED MlirAttribute circtMSFTPhysicalBoundsAttrGet(MlirContext, uint64_t, uint64_t, uint64_t, uint64_t)
MLIR_CAPI_EXPORTED bool circtMSFTAttributeIsAPhysLocationAttribute(MlirAttribute)
MLIR_CAPI_EXPORTED MlirAttribute circtMSFTPhysLocationAttrGet(MlirContext, CirctMSFTPrimitiveType, uint64_t x, uint64_t y, uint64_t num)
MLIR_CAPI_EXPORTED MlirOperation circtMSFTPlacementDBPlace(CirctMSFTPlacementDB, MlirOperation inst, MlirAttribute loc, MlirStringRef subpath, MlirLocation srcLoc)
MLIR_CAPI_EXPORTED MlirLogicalResult circtMSFTPrimitiveDBAddPrimitive(CirctMSFTPrimitiveDB, MlirAttribute locAndPrim)
MLIR_CAPI_EXPORTED void mlirMSFTRegisterPasses(void)
MLIR_CAPI_EXPORTED uint64_t circtMSFTPhysLocationAttrGetY(MlirAttribute)
MLIR_CAPI_EXPORTED void circtMSFTReplaceAllUsesWith(MlirValue value, MlirValue newValue)
MlirOperation getInstanceAt(MlirAttribute loc)
MlirOperation place(MlirOperation instOp, MlirAttribute loc, std::string subpath, MlirLocation srcLoc)
bool movePlacement(MlirOperation locOp, MlirAttribute newLoc)
PlacementDB(MlirModule top, PrimitiveDB *seed)
void walkPlacements(nb::callable pycb, std::tuple< nb::object, nb::object, nb::object, nb::object > bounds, nb::object prim, nb::object walkOrder)
void removePlacement(MlirOperation locOp)
nb::handle getNearestFreeInColumn(PrimitiveType prim, uint64_t column, uint64_t nearestToY)
bool isValidLocation(MlirAttribute loc)
PrimitiveDB(MlirContext ctxt)
bool addPrimitive(MlirAttribute locAndPrim)
PyLocationVecIterator(MlirAttribute attr)
PyLocationVecIterator & dunderIter()
static void bind(nb::module_ &m)
static std::optional< MlirAttribute > getItem(MlirAttribute locVec, intptr_t pos)
Get item at the specified position, translating a nullptr to None.
std::optional< MlirAttribute > dunderNext()
void populateDialectMSFTSubmodule(nanobind::module_ &m)