CIRCT  18.0.0git
MSFT.cpp
Go to the documentation of this file.
1 //===- MSFT.cpp - C Interface for the MSFT Dialect ------------------------===//
2 //
3 //===----------------------------------------------------------------------===//
4 
5 #include "circt-c/Dialect/MSFT.h"
13 #include "circt/Support/LLVM.h"
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"
22 
23 MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(MSFT, msft, circt::msft::MSFTDialect)
24 
25 using namespace circt;
26 using namespace circt::msft;
27 
29  mlir::registerCanonicalizerPass();
31 }
32 
33 void circtMSFTReplaceAllUsesWith(MlirValue value, MlirValue newValue) {
34  unwrap(value).replaceAllUsesWith(unwrap(newValue));
35 }
36 
37 //===----------------------------------------------------------------------===//
38 // PrimitiveDB.
39 //===----------------------------------------------------------------------===//
40 
41 DEFINE_C_API_PTR_METHODS(CirctMSFTPrimitiveDB, circt::msft::PrimitiveDB)
42 
44  return wrap(new PrimitiveDB(unwrap(ctxt)));
45 }
47  delete unwrap(self);
48 }
50  MlirAttribute cLoc) {
51  PhysLocationAttr loc = unwrap(cLoc).cast<PhysLocationAttr>();
52  return wrap(unwrap(self)->addPrimitive(loc));
53 }
55  MlirAttribute cLoc) {
56  PhysLocationAttr loc = unwrap(cLoc).cast<PhysLocationAttr>();
57  return unwrap(self)->isValidLocation(loc);
58 }
59 
60 //===----------------------------------------------------------------------===//
61 // PlacementDB.
62 //===----------------------------------------------------------------------===//
63 
64 DEFINE_C_API_PTR_METHODS(CirctMSFTPlacementDB, circt::msft::PlacementDB)
65 
67  CirctMSFTPrimitiveDB seed) {
68  if (seed.ptr == nullptr)
69  return wrap(new PlacementDB(unwrap(top)));
70  return wrap(new PlacementDB(unwrap(top), *unwrap(seed)));
71 }
73  delete unwrap(self);
74 }
75 
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);
83 
84  if (auto pla = locAttr.dyn_cast<PhysLocationAttr>())
85  return wrap(unwrap(db)->place(inst, pla, unwrap(subpath), srcLoc));
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");
89 }
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);
97  else
98  assert(false && "Can only remove PDPhysLocationOp and PDRegPhysLocationOp");
99 }
101  MlirOperation clocOp,
102  MlirAttribute cnewLoc) {
103  Operation *locOp = unwrap(clocOp);
104  Attribute newLoc = unwrap(cnewLoc);
105  if (auto physLocOp = dyn_cast<PDPhysLocationOp>(locOp))
106  return wrap(
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");
112 }
114  MlirAttribute loc) {
115  return wrap(unwrap(db)->getInstanceAt(unwrap(loc).cast<PhysLocationAttr>()));
116 }
118  CirctMSFTPlacementDB db, CirctMSFTPrimitiveType prim, uint64_t column,
119  uint64_t nearestToY) {
120 
121  return wrap(unwrap(db)->getNearestFreeInColumn((PrimitiveType)prim, column,
122  nearestToY));
123 }
124 
125 /// Walk all the placements within 'bounds' ([xmin, xmax, ymin, ymax], inclusive
126 /// on all sides), with -1 meaning unbounded.
127 MLIR_CAPI_EXPORTED void circtMSFTPlacementDBWalkPlacements(
128  CirctMSFTPlacementDB cdb, CirctMSFTPlacementCallback ccb, int64_t bounds[4],
129  CirctMSFTPrimitiveType cPrimTypeFilter, CirctMSFTWalkOrder cWalkOrder,
130  void *userData) {
131 
132  PlacementDB *db = unwrap(cdb);
133  auto cb = [ccb, userData](PhysLocationAttr loc,
134  DynInstDataOpInterface locOp) {
135  ccb(wrap(loc), wrap(locOp), userData);
136  };
137  std::optional<PrimitiveType> primTypeFilter;
138  if (cPrimTypeFilter >= 0)
139  primTypeFilter = static_cast<PrimitiveType>(cPrimTypeFilter);
140 
141  std::optional<PlacementDB::WalkOrder> walkOrder;
142  if (cWalkOrder.columns != CirctMSFTDirection::NONE ||
143  cWalkOrder.rows != CirctMSFTDirection::NONE)
144  walkOrder = PlacementDB::WalkOrder{
145  static_cast<PlacementDB::Direction>(cWalkOrder.columns),
146  static_cast<PlacementDB::Direction>(cWalkOrder.rows)};
147 
148  db->walkPlacements(
149  cb, std::make_tuple(bounds[0], bounds[1], bounds[2], bounds[3]),
150  primTypeFilter, walkOrder);
151 }
152 
153 //===----------------------------------------------------------------------===//
154 // MSFT Attributes.
155 //===----------------------------------------------------------------------===//
156 
157 void mlirMSFTAddPhysLocationAttr(MlirOperation cOp, const char *entityName,
158  PrimitiveType type, long x, long y, long num) {
159  Operation *op = unwrap(cOp);
160  MLIRContext *ctxt = op->getContext();
161  PhysLocationAttr loc = PhysLocationAttr::get(
162  ctxt, PrimitiveTypeAttr::get(ctxt, type), x, y, num);
163  StringAttr entity = StringAttr::get(ctxt, entityName);
164  OpBuilder(op).create<PDPhysLocationOp>(op->getLoc(), loc, entity,
166  op->setAttr(entity, loc);
167 }
168 
170  return unwrap(attr).isa<PhysLocationAttr>();
171 }
172 MlirAttribute circtMSFTPhysLocationAttrGet(MlirContext cCtxt,
173  CirctMSFTPrimitiveType devType,
174  uint64_t x, uint64_t y,
175  uint64_t num) {
176  auto *ctxt = unwrap(cCtxt);
178  ctxt, PrimitiveTypeAttr::get(ctxt, (PrimitiveType)devType), x, y, num));
179 }
180 
183  return (CirctMSFTPrimitiveType)unwrap(attr)
184  .cast<PhysLocationAttr>()
185  .getPrimitiveType()
186  .getValue();
187 }
188 uint64_t circtMSFTPhysLocationAttrGetX(MlirAttribute attr) {
189  return (CirctMSFTPrimitiveType)unwrap(attr).cast<PhysLocationAttr>().getX();
190 }
191 uint64_t circtMSFTPhysLocationAttrGetY(MlirAttribute attr) {
192  return (CirctMSFTPrimitiveType)unwrap(attr).cast<PhysLocationAttr>().getY();
193 }
194 uint64_t circtMSFTPhysLocationAttrGetNum(MlirAttribute attr) {
195  return (CirctMSFTPrimitiveType)unwrap(attr).cast<PhysLocationAttr>().getNum();
196 }
197 
198 bool circtMSFTAttributeIsAPhysicalBoundsAttr(MlirAttribute attr) {
199  return unwrap(attr).isa<PhysicalBoundsAttr>();
200 }
201 
202 MlirAttribute circtMSFTPhysicalBoundsAttrGet(MlirContext cContext,
203  uint64_t xMin, uint64_t xMax,
204  uint64_t yMin, uint64_t yMax) {
205  auto *context = unwrap(cContext);
206  return wrap(PhysicalBoundsAttr::get(context, xMin, xMax, yMin, yMax));
207 }
208 
210  return unwrap(attr).isa<LocationVectorAttr>();
211 }
212 MlirAttribute circtMSFTLocationVectorAttrGet(MlirContext ctxt, MlirType type,
213  intptr_t numElements,
214  MlirAttribute const *elements) {
215  SmallVector<PhysLocationAttr, 32> physLocs;
216  for (intptr_t i = 0; i < numElements; ++i)
217  if (elements[i].ptr != nullptr)
218  physLocs.push_back(unwrap(elements[i]).cast<PhysLocationAttr>());
219  else
220  physLocs.push_back({});
222  physLocs));
223 }
224 MlirType circtMSFTLocationVectorAttrGetType(MlirAttribute attr) {
225  return wrap(unwrap(attr).cast<LocationVectorAttr>().getType().getValue());
226 }
227 intptr_t circtMSFTLocationVectorAttrGetNumElements(MlirAttribute attr) {
228  return unwrap(attr).cast<LocationVectorAttr>().getLocs().size();
229 }
230 MlirAttribute circtMSFTLocationVectorAttrGetElement(MlirAttribute attr,
231  intptr_t pos) {
232  return wrap(unwrap(attr).cast<LocationVectorAttr>().getLocs()[pos]);
233 }
lowerAnnotationsNoRefTypePorts FirtoolPreserveValuesMode value
Definition: Firtool.cpp:95
assert(baseType &&"element must be base type")
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
MlirType uint64_t numElements
Definition: CHIRRTL.cpp:26
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(CHIRRTL, chirrtl, circt::chirrtl::CHIRRTLDialect) MlirType chirrtlTypeGetCMemory(MlirContext ctx
static void registerPasses()
Definition: CIRCTModule.cpp:37
MlirType circtMSFTLocationVectorAttrGetType(MlirAttribute attr)
Definition: MSFT.cpp:224
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),...
Definition: MSFT.cpp:127
MlirOperation circtMSFTPlacementDBGetInstanceAt(CirctMSFTPlacementDB db, MlirAttribute loc)
Definition: MSFT.cpp:113
uint64_t circtMSFTPhysLocationAttrGetY(MlirAttribute attr)
Definition: MSFT.cpp:191
bool circtMSFTAttributeIsAPhysicalBoundsAttr(MlirAttribute attr)
Definition: MSFT.cpp:198
uint64_t circtMSFTPhysLocationAttrGetNum(MlirAttribute attr)
Definition: MSFT.cpp:194
CirctMSFTPrimitiveType circtMSFTPhysLocationAttrGetPrimitiveType(MlirAttribute attr)
Definition: MSFT.cpp:182
void circtMSFTDeletePlacementDB(CirctMSFTPlacementDB self)
Definition: MSFT.cpp:72
MlirLogicalResult circtMSFTPrimitiveDBAddPrimitive(CirctMSFTPrimitiveDB self, MlirAttribute cLoc)
Definition: MSFT.cpp:49
bool circtMSFTPrimitiveDBIsValidLocation(CirctMSFTPrimitiveDB self, MlirAttribute cLoc)
Definition: MSFT.cpp:54
void circtMSFTDeletePrimitiveDB(CirctMSFTPrimitiveDB self)
Definition: MSFT.cpp:46
bool circtMSFTAttributeIsAPhysLocationAttribute(MlirAttribute attr)
Definition: MSFT.cpp:169
void circtMSFTPlacementDBRemovePlacement(CirctMSFTPlacementDB db, MlirOperation clocOp)
Definition: MSFT.cpp:90
intptr_t circtMSFTLocationVectorAttrGetNumElements(MlirAttribute attr)
Definition: MSFT.cpp:227
CirctMSFTPlacementDB circtMSFTCreatePlacementDB(MlirModule top, CirctMSFTPrimitiveDB seed)
Definition: MSFT.cpp:66
void mlirMSFTAddPhysLocationAttr(MlirOperation cOp, const char *entityName, PrimitiveType type, long x, long y, long num)
Definition: MSFT.cpp:157
MlirAttribute circtMSFTLocationVectorAttrGet(MlirContext ctxt, MlirType type, intptr_t numElements, MlirAttribute const *elements)
Definition: MSFT.cpp:212
MlirAttribute circtMSFTLocationVectorAttrGetElement(MlirAttribute attr, intptr_t pos)
Definition: MSFT.cpp:230
MlirOperation circtMSFTPlacementDBPlace(CirctMSFTPlacementDB db, MlirOperation cinst, MlirAttribute cloc, MlirStringRef subpath, MlirLocation csrcLoc)
Definition: MSFT.cpp:76
MlirAttribute circtMSFTPhysLocationAttrGet(MlirContext cCtxt, CirctMSFTPrimitiveType devType, uint64_t x, uint64_t y, uint64_t num)
Definition: MSFT.cpp:172
MlirAttribute circtMSFTPhysicalBoundsAttrGet(MlirContext cContext, uint64_t xMin, uint64_t xMax, uint64_t yMin, uint64_t yMax)
Definition: MSFT.cpp:202
void circtMSFTReplaceAllUsesWith(MlirValue value, MlirValue newValue)
Definition: MSFT.cpp:33
void mlirMSFTRegisterPasses()
Definition: MSFT.cpp:28
MlirAttribute circtMSFTPlacementDBGetNearestFreeInColumn(CirctMSFTPlacementDB db, CirctMSFTPrimitiveType prim, uint64_t column, uint64_t nearestToY)
Definition: MSFT.cpp:117
CirctMSFTPrimitiveDB circtMSFTCreatePrimitiveDB(MlirContext ctxt)
Definition: MSFT.cpp:43
uint64_t circtMSFTPhysLocationAttrGetX(MlirAttribute attr)
Definition: MSFT.cpp:188
bool circtMSFTAttributeIsALocationVectorAttribute(MlirAttribute attr)
Definition: MSFT.cpp:209
MlirLogicalResult circtMSFTPlacementDBMovePlacement(CirctMSFTPlacementDB db, MlirOperation clocOp, MlirAttribute cnewLoc)
Definition: MSFT.cpp:100
int32_t CirctMSFTPrimitiveType
Definition: MSFT.h:26
void(* CirctMSFTPlacementCallback)(MlirAttribute loc, MlirOperation locOp, void *userData)
Definition: MSFT.h:111
@ NONE
Definition: MSFT.h:89
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
Definition: OM.cpp:100
A data structure to contain both the locations of the primitives on the device and instance assignmen...
Definition: DeviceDB.h:64
Direction
Contains the order to iterate in each dimension for walkPlacements.
Definition: DeviceDB.h:73
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.
Definition: DeviceDB.h:27
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
Definition: CalyxOps.cpp:53
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
Definition: DebugAnalysis.h:21
Definition: msft.py:1
enum CirctMSFTDirection columns
Definition: MSFT.h:91
enum CirctMSFTDirection rows
Definition: MSFT.h:92