14 #include "mlir/CAPI/IR.h"
15 #include "mlir/CAPI/Registration.h"
16 #include "mlir/CAPI/Support.h"
17 #include "mlir/CAPI/Utils.h"
18 #include "mlir/IR/Builders.h"
19 #include "mlir/Transforms/Passes.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Support/raw_ostream.h"
25 using namespace circt;
29 mlir::registerCanonicalizerPass();
51 PhysLocationAttr loc =
unwrap(cLoc).cast<PhysLocationAttr>();
56 PhysLocationAttr loc =
unwrap(cLoc).cast<PhysLocationAttr>();
57 return unwrap(
self)->isValidLocation(loc);
68 if (seed.ptr ==
nullptr)
77 MlirOperation cinst, MlirAttribute cloc,
78 MlirStringRef subpath,
79 MlirLocation csrcLoc) {
80 auto inst = cast<DynamicInstanceOp>(
unwrap(cinst));
81 Location srcLoc =
unwrap(csrcLoc);
82 Attribute locAttr =
unwrap(cloc);
84 if (
auto pla = locAttr.dyn_cast<PhysLocationAttr>())
86 if (
auto locVec = locAttr.dyn_cast<LocationVectorAttr>())
87 return wrap(
unwrap(db)->place(inst, locVec, srcLoc));
88 llvm_unreachable(
"Can only place PDPhysLocationOp and PDRegPhysLocationOp");
91 MlirOperation clocOp) {
92 Operation *locOp =
unwrap(clocOp);
93 if (
auto physLocOp = dyn_cast<PDPhysLocationOp>(locOp))
94 unwrap(db)->removePlacement(physLocOp);
95 else if (
auto regPhysLocOp = dyn_cast<PDRegPhysLocationOp>(locOp))
96 unwrap(db)->removePlacement(regPhysLocOp);
98 assert(
false &&
"Can only remove PDPhysLocationOp and PDRegPhysLocationOp");
101 MlirOperation clocOp,
102 MlirAttribute cnewLoc) {
103 Operation *locOp =
unwrap(clocOp);
104 Attribute newLoc =
unwrap(cnewLoc);
105 if (
auto physLocOp = dyn_cast<PDPhysLocationOp>(locOp))
107 unwrap(db)->movePlacement(physLocOp, newLoc.cast<PhysLocationAttr>()));
108 if (
auto regPhysLocOp = dyn_cast<PDRegPhysLocationOp>(locOp))
109 return wrap(
unwrap(db)->movePlacement(regPhysLocOp,
110 newLoc.cast<LocationVectorAttr>()));
111 llvm_unreachable(
"Can only move PDPhysLocationOp and PDRegPhysLocationOp");
115 return wrap(
unwrap(db)->getInstanceAt(
unwrap(loc).cast<PhysLocationAttr>()));
119 uint64_t nearestToY) {
121 return wrap(
unwrap(db)->getNearestFreeInColumn((PrimitiveType)prim, column,
133 auto cb = [ccb, userData](PhysLocationAttr loc,
134 DynInstDataOpInterface locOp) {
135 ccb(
wrap(loc),
wrap(locOp), userData);
137 std::optional<PrimitiveType> primTypeFilter;
138 if (cPrimTypeFilter >= 0)
139 primTypeFilter =
static_cast<PrimitiveType
>(cPrimTypeFilter);
141 std::optional<PlacementDB::WalkOrder> walkOrder;
144 walkOrder = PlacementDB::WalkOrder{
149 cb, std::make_tuple(bounds[0], bounds[1], bounds[2], bounds[3]),
150 primTypeFilter, walkOrder);
158 PrimitiveType type,
long x,
long y,
long num) {
159 Operation *op =
unwrap(cOp);
160 MLIRContext *ctxt = op->getContext();
164 OpBuilder(op).create<PDPhysLocationOp>(op->getLoc(), loc, entity,
166 op->setAttr(entity, loc);
170 return unwrap(attr).isa<PhysLocationAttr>();
174 uint64_t x, uint64_t y,
176 auto *ctxt =
unwrap(cCtxt);
184 .cast<PhysLocationAttr>()
199 return unwrap(attr).isa<PhysicalBoundsAttr>();
203 uint64_t xMin, uint64_t xMax,
204 uint64_t yMin, uint64_t yMax) {
205 auto *context =
unwrap(cContext);
210 return unwrap(attr).isa<LocationVectorAttr>();
214 MlirAttribute
const *elements) {
215 SmallVector<PhysLocationAttr, 32> physLocs;
217 if (elements[i].ptr !=
nullptr)
218 physLocs.push_back(
unwrap(elements[i]).cast<PhysLocationAttr>());
220 physLocs.push_back({});
225 return wrap(
unwrap(attr).cast<LocationVectorAttr>().getType().getValue());
228 return unwrap(attr).cast<LocationVectorAttr>().getLocs().size();
232 return wrap(
unwrap(attr).cast<LocationVectorAttr>().getLocs()[pos]);
assert(baseType &&"element must be base type")
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
MlirType uint64_t numElements
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(CHIRRTL, chirrtl, circt::chirrtl::CHIRRTLDialect) MlirType chirrtlTypeGetCMemory(MlirContext ctx
static void registerPasses()
MlirType circtMSFTLocationVectorAttrGetType(MlirAttribute attr)
MLIR_CAPI_EXPORTED void circtMSFTPlacementDBWalkPlacements(CirctMSFTPlacementDB cdb, CirctMSFTPlacementCallback ccb, int64_t bounds[4], CirctMSFTPrimitiveType cPrimTypeFilter, CirctMSFTWalkOrder cWalkOrder, void *userData)
Walk all the placements within 'bounds' ([xmin, xmax, ymin, ymax], inclusive on all sides),...
MlirOperation circtMSFTPlacementDBGetInstanceAt(CirctMSFTPlacementDB db, MlirAttribute loc)
uint64_t circtMSFTPhysLocationAttrGetY(MlirAttribute attr)
bool circtMSFTAttributeIsAPhysicalBoundsAttr(MlirAttribute attr)
uint64_t circtMSFTPhysLocationAttrGetNum(MlirAttribute attr)
CirctMSFTPrimitiveType circtMSFTPhysLocationAttrGetPrimitiveType(MlirAttribute attr)
void circtMSFTDeletePlacementDB(CirctMSFTPlacementDB self)
MlirLogicalResult circtMSFTPrimitiveDBAddPrimitive(CirctMSFTPrimitiveDB self, MlirAttribute cLoc)
bool circtMSFTPrimitiveDBIsValidLocation(CirctMSFTPrimitiveDB self, MlirAttribute cLoc)
void circtMSFTDeletePrimitiveDB(CirctMSFTPrimitiveDB self)
bool circtMSFTAttributeIsAPhysLocationAttribute(MlirAttribute attr)
void circtMSFTPlacementDBRemovePlacement(CirctMSFTPlacementDB db, MlirOperation clocOp)
intptr_t circtMSFTLocationVectorAttrGetNumElements(MlirAttribute attr)
CirctMSFTPlacementDB circtMSFTCreatePlacementDB(MlirModule top, CirctMSFTPrimitiveDB seed)
void mlirMSFTAddPhysLocationAttr(MlirOperation cOp, const char *entityName, PrimitiveType type, long x, long y, long num)
MlirAttribute circtMSFTLocationVectorAttrGet(MlirContext ctxt, MlirType type, intptr_t numElements, MlirAttribute const *elements)
MlirAttribute circtMSFTLocationVectorAttrGetElement(MlirAttribute attr, intptr_t pos)
MlirOperation circtMSFTPlacementDBPlace(CirctMSFTPlacementDB db, MlirOperation cinst, MlirAttribute cloc, MlirStringRef subpath, MlirLocation csrcLoc)
MlirAttribute circtMSFTPhysLocationAttrGet(MlirContext cCtxt, CirctMSFTPrimitiveType devType, uint64_t x, uint64_t y, uint64_t num)
MlirAttribute circtMSFTPhysicalBoundsAttrGet(MlirContext cContext, uint64_t xMin, uint64_t xMax, uint64_t yMin, uint64_t yMax)
void circtMSFTReplaceAllUsesWith(MlirValue value, MlirValue newValue)
void mlirMSFTRegisterPasses()
MlirAttribute circtMSFTPlacementDBGetNearestFreeInColumn(CirctMSFTPlacementDB db, CirctMSFTPrimitiveType prim, uint64_t column, uint64_t nearestToY)
CirctMSFTPrimitiveDB circtMSFTCreatePrimitiveDB(MlirContext ctxt)
uint64_t circtMSFTPhysLocationAttrGetX(MlirAttribute attr)
bool circtMSFTAttributeIsALocationVectorAttribute(MlirAttribute attr)
MlirLogicalResult circtMSFTPlacementDBMovePlacement(CirctMSFTPlacementDB db, MlirOperation clocOp, MlirAttribute cnewLoc)
int32_t CirctMSFTPrimitiveType
void(* CirctMSFTPlacementCallback)(MlirAttribute loc, MlirOperation locOp, void *userData)
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
A data structure to contain both the locations of the primitives on the device and instance assignmen...
Direction
Contains the order to iterate in each dimension for walkPlacements.
void walkPlacements(function_ref< void(PhysLocationAttr, DynInstDataOpInterface)>, std::tuple< int64_t, int64_t, int64_t, int64_t > bounds=std::make_tuple(-1, -1, -1, -1), std::optional< PrimitiveType > primType={}, std::optional< WalkOrder >={})
Walk the placement information in some sort of reasonable order.
A data structure to contain locations of the primitives on the device.
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
enum CirctMSFTDirection columns
enum CirctMSFTDirection rows