18#include "mlir-c/BuiltinAttributes.h"
20#include "mlir-c/Support.h"
21#include "mlir/CAPI/IR.h"
22#include "mlir/CAPI/Registration.h"
23#include "mlir/CAPI/Support.h"
24#include "mlir/Pass/AnalysisManager.h"
25#include "llvm/ADT/ImmutableList.h"
26#include "llvm/ADT/PointerUnion.h"
27#include "llvm/Support/JSON.h"
55unwrap(SynthLongestPathObject
object) {
56 return llvm::PointerUnion<
61wrap(llvm::PointerUnion<Object *, DataflowPath::OutputPort *>
object) {
62 return SynthLongestPathObject{
object.getOpaqueValue()};
66 auto ptr = llvm::PointerUnion<Object *, DataflowPath::OutputPort *>(
67 const_cast<Object *
>(
object));
72 auto ptr = llvm::PointerUnion<Object *, DataflowPath::OutputPort *>(
81SynthLongestPathAnalysis
83 bool keepOnlyMaxDelayPaths,
bool lazyComputation,
84 MlirStringRef topModuleName) {
87 wrapper->analysisManager =
88 std::make_unique<mlir::ModuleAnalysisManager>(op,
nullptr);
89 mlir::AnalysisManager am = *wrapper->analysisManager;
90 auto topModuleNameAttr =
91 StringAttr::get(op->getContext(),
unwrap(topModuleName));
92 wrapper->analysis = std::make_unique<LongestPathAnalysis>(
95 keepOnlyMaxDelayPaths, topModuleNameAttr));
103SynthLongestPathCollection
105 MlirValue value, int64_t bitPos,
106 bool elaboratePaths) {
107 auto *wrapper =
unwrap(analysis);
108 auto *lpa = wrapper->analysis.get();
111 lpa->computeGlobalPaths(
unwrap(value), bitPos, collection->paths);
114 collection->sortInDescendingOrder();
115 return wrap(collection);
118SynthLongestPathCollection
120 MlirStringRef moduleName,
121 bool elaboratePaths) {
122 auto *wrapper =
unwrap(analysis);
123 auto *lpa = wrapper->analysis.get();
124 auto moduleNameAttr = StringAttr::get(lpa->getContext(),
unwrap(moduleName));
127 if (!lpa->isAnalysisAvailable(moduleNameAttr) ||
129 lpa->getAllPaths(moduleNameAttr, collection->paths, elaboratePaths)))
132 collection->sortInDescendingOrder();
133 return wrap(collection);
141 return !collection.ptr;
145 delete unwrap(collection);
150 auto *wrapper =
unwrap(collection);
151 return wrapper->paths.size();
155SynthLongestPathDataflowPath
158 auto *wrapper =
unwrap(collection);
159 auto &path = wrapper->paths[index];
164 SynthLongestPathCollection src) {
165 auto *destWrapper =
unwrap(dest);
166 auto *srcWrapper =
unwrap(src);
167 destWrapper->merge(*srcWrapper);
176 auto *wrapper =
unwrap(path);
177 return wrapper->getDelay();
180SynthLongestPathObject
182 auto *wrapper =
unwrap(path);
183 auto &startPoint = wrapper->getStartPoint();
184 return wrap(
const_cast<Object *
>(&startPoint));
187SynthLongestPathObject
189 auto *wrapper =
unwrap(path);
190 if (
auto *
object = std::get_if<Object>(&wrapper->getEndPoint())) {
193 auto *ptr = std::get_if<DataflowPath::OutputPort>(&wrapper->getEndPoint());
197SynthLongestPathHistory
199 auto *wrapper =
unwrap(path);
200 return wrap(
const_cast<llvm::ImmutableListImpl<DebugPoint> *
>(
201 wrapper->getHistory().getInternalPointer()));
206 auto *wrapper =
unwrap(path);
207 return wrap(wrapper->getRoot());
215 auto *wrapper =
unwrap(history);
216 return llvm::ImmutableList<DebugPoint>(wrapper).isEmpty();
220 SynthLongestPathObject *
object,
221 int64_t *delay, MlirStringRef *comment) {
222 auto *wrapper =
unwrap(history);
223 auto list = llvm::ImmutableList<DebugPoint>(wrapper);
225 auto &head = list.getHead();
226 *
object =
wrap(&head.object);
228 *comment = mlirStringRefCreate(head.comment.data(), head.comment.size());
231SynthLongestPathHistory
233 auto *wrapper =
unwrap(history);
234 auto list = llvm::ImmutableList<DebugPoint>(wrapper);
235 auto *tail = list.getTail().getInternalPointer();
236 return wrap(
const_cast<llvm::ImmutableListImpl<DebugPoint> *
>(tail));
245 auto *ptr = dyn_cast<Object *>(
unwrap(
object));
248 result.
ptr =
const_cast<igraph::InstanceOpInterface *
>(
249 ptr->instancePath.getPath().data());
250 result.
size = ptr->instancePath.getPath().size();
259 auto ptr =
unwrap(rawObject);
260 if (
auto *
object = dyn_cast<Object *>(ptr)) {
261 auto name =
object->getName();
262 return mlirStringRefCreate(name.data(), name.size());
264 auto [module, resultNumber, _] = *dyn_cast<DataflowPath::OutputPort *>(ptr);
265 auto name =
module.getOutputName(resultNumber);
266 return mlirStringRefCreate(name.data(), name.size());
270 auto ptr =
unwrap(rawObject);
271 if (
auto *
object = dyn_cast<Object *>(ptr))
272 return object->bitPos;
273 return std::get<2>(*dyn_cast<DataflowPath::OutputPort *>(ptr));
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(CHIRRTL, chirrtl, circt::chirrtl::CHIRRTLDialect) MlirType chirrtlTypeGetCMemory(MlirContext ctx
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
size_t synthLongestPathCollectionGetSize(SynthLongestPathCollection collection)
MlirStringRef synthLongestPathObjectName(SynthLongestPathObject rawObject)
void synthLongestPathHistoryGetHead(SynthLongestPathHistory history, SynthLongestPathObject *object, int64_t *delay, MlirStringRef *comment)
IgraphInstancePath synthLongestPathObjectGetInstancePath(SynthLongestPathObject object)
void synthLongestPathAnalysisDestroy(SynthLongestPathAnalysis analysis)
void synthLongestPathCollectionDestroy(SynthLongestPathCollection collection)
SynthLongestPathObject synthLongestPathDataflowPathGetStartPoint(SynthLongestPathDataflowPath path)
SynthLongestPathCollection synthLongestPathAnalysisGetAllPaths(SynthLongestPathAnalysis analysis, MlirStringRef moduleName, bool elaboratePaths)
SynthLongestPathCollection synthLongestPathAnalysisGetPaths(SynthLongestPathAnalysis analysis, MlirValue value, int64_t bitPos, bool elaboratePaths)
SynthLongestPathHistory synthLongestPathDataflowPathGetHistory(SynthLongestPathDataflowPath path)
SynthLongestPathAnalysis synthLongestPathAnalysisCreate(MlirOperation module, bool collectDebugInfo, bool keepOnlyMaxDelayPaths, bool lazyComputation, MlirStringRef topModuleName)
SynthLongestPathObject synthLongestPathDataflowPathGetEndPoint(SynthLongestPathDataflowPath path)
bool synthLongestPathCollectionIsNull(SynthLongestPathCollection collection)
void synthLongestPathCollectionMerge(SynthLongestPathCollection dest, SynthLongestPathCollection src)
DEFINE_C_API_PTR_METHODS(SynthLongestPathHistory, llvm::ImmutableListImpl< DebugPoint >) llvm
SynthLongestPathDataflowPath synthLongestPathCollectionGetDataflowPath(SynthLongestPathCollection collection, size_t index)
int64_t synthLongestPathDataflowPathGetDelay(SynthLongestPathDataflowPath path)
void registerSynthPasses()
bool synthLongestPathHistoryIsEmpty(SynthLongestPathHistory history)
SynthLongestPathObject wrap(llvm::PointerUnion< Object *, DataflowPath::OutputPort * > object)
MlirOperation synthLongestPathDataflowPathGetRoot(SynthLongestPathDataflowPath path)
SynthLongestPathHistory synthLongestPathHistoryGetTail(SynthLongestPathHistory history)
size_t synthLongestPathObjectBitPos(SynthLongestPathObject rawObject)
std::tuple< hw::HWModuleOp, size_t, size_t > OutputPort
void registerSynthesisPipeline()
Register the synthesis pipelines.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< LongestPathAnalysis > analysis
std::unique_ptr< mlir::ModuleAnalysisManager > analysisManager
Configuration options for the longest path analysis.