180 std::tuple<OperationPropertyTs...> opProps,
181 std::tuple<OperatorTypePropertyTs...> oprProps,
182 std::tuple<ResourceTypePropertyTs...> rsrcProps,
183 std::tuple<DependencePropertyTs...> depProps,
184 std::tuple<InstancePropertyTs...> instProps) {
185 ProblemT prob(instOp);
188 prob, instOp.getSspPropertiesAttr());
189 if (
auto instName = instOp.getSymNameAttr())
190 prob.setInstanceName(instName);
200 auto libraryOp = instOp.getOperatorLibrary();
201 libraryOp.walk([&](OperatorTypeOp oprOp) {
202 operatorTypes[oprOp] =
206 if (
auto libName = libraryOp.getSymNameAttr())
207 prob.setLibraryName(libName);
217 auto rsrcLibraryOp = instOp.getResourceLibrary();
218 rsrcLibraryOp.walk([&](ResourceTypeOp rsrcOp) {
219 resourceTypes[rsrcOp] =
224 if (
auto rsrcLibName = rsrcLibraryOp.getSymNameAttr())
225 prob.setRsrcLibraryName(rsrcLibName);
231 auto graphOp = instOp.getDependenceGraph();
232 graphOp.walk([&](OperationOp opOp) {
233 prob.insertOperation(opOp);
235 prob, opOp, opOp.getSspPropertiesAttr());
236 if (StringAttr opName = opOp.getNameAttr()) {
237 prob.setOperationName(opOp, opName);
238 [[maybe_unused]]
auto [it, ins] = namedOps.try_emplace(opName, opOp);
239 assert(ins &&
"Non-unique operation name detected");
245 if (!prob.getLinkedOperatorType(opOp).has_value())
250 SymbolRefAttr oprRef = opOp.getLinkedOperatorTypeAttr().getValue();
254 oprOp = SymbolTable::lookupSymbolIn(libraryOp, oprRef);
257 oprOp = SymbolTable::lookupSymbolIn(instOp, oprRef);
261 SymbolTable::lookupNearestSymbolFrom(instOp->getParentOp(), oprRef);
263 assert(oprOp && isa<OperatorTypeOp>(oprOp));
266 auto &opr = operatorTypes[oprOp];
269 prob, cast<OperatorTypeOp>(oprOp), operatorTypeIds);
272 prob.setLinkedOperatorType(opOp, opr);
277 if (!prob.getLinkedResourceTypes(opOp).has_value())
282 SmallVector<ResourceType> loadedRsrcs;
283 for (
auto attr : opOp.getLinkedResourceTypesAttr().getValue()) {
284 SymbolRefAttr rsrcRef = dyn_cast<SymbolRefAttr>(attr);
286 "expected SymbolRefAttr inside LinkedResourceTypesAttr");
290 rsrcOp = SymbolTable::lookupSymbolIn(rsrcLibraryOp, rsrcRef);
294 rsrcOp = SymbolTable::lookupSymbolIn(instOp, rsrcRef);
297 rsrcOp = SymbolTable::lookupNearestSymbolFrom(instOp->getParentOp(),
300 assert(rsrcOp && isa<ResourceTypeOp>(rsrcOp));
303 auto &rsrc = resourceTypes[rsrcOp];
306 prob, cast<ResourceTypeOp>(rsrcOp), resourceTypeIds);
308 loadedRsrcs.push_back(rsrc);
312 prob.setLinkedResourceTypes(opOp, loadedRsrcs);
317 graphOp.walk([&](OperationOp opOp) {
318 ArrayAttr depsAttr = opOp.getDependencesAttr();
322 for (
auto depAttr : depsAttr.getAsRange<DependenceAttr>()) {
324 if (StringAttr sourceRef = depAttr.getSourceRef()) {
325 OperationOp sourceOp = namedOps.lookup(sourceRef);
328 LogicalResult res = prob.insertDependence(dep);
332 dep =
Dependence(&opOp->getOpOperand(depAttr.getOperandIdx()));
335 prob, dep, depAttr.getProperties());
438saveProblem(ProblemT &prob, std::tuple<OperationPropertyTs...> opProps,
439 std::tuple<OperatorTypePropertyTs...> oprProps,
440 std::tuple<ResourceTypePropertyTs...> rsrcProps,
441 std::tuple<DependencePropertyTs...> depProps,
442 std::tuple<InstancePropertyTs...> instProps, OpBuilder &builder) {
443 ImplicitLocOpBuilder b(builder.getUnknownLoc(), builder);
446 auto instOp = InstanceOp::create(
447 b, builder.getStringAttr(ProblemT::name),
448 saveInstanceProperties<ProblemT, InstancePropertyTs...>(prob, b));
449 if (
auto instName = prob.getInstanceName())
450 instOp.setSymNameAttr(instName);
453 b.setInsertionPointToEnd(instOp.getBodyBlock());
454 auto libraryOp = OperatorLibraryOp::create(b);
455 if (
auto libName = prob.getLibraryName())
456 libraryOp.setSymNameAttr(libName);
457 b.setInsertionPointToStart(libraryOp.getBodyBlock());
459 for (
auto opr : prob.getOperatorTypes())
460 OperatorTypeOp::create(
461 b, opr.getAttr(), {},
466 b.setInsertionPointToEnd(instOp.getBodyBlock());
467 auto rsrcLibraryOp = ResourceLibraryOp::create(b);
468 if (
auto rsrcLibName = prob.getRsrcLibraryName())
469 rsrcLibraryOp.setSymNameAttr(rsrcLibName);
470 b.setInsertionPointToStart(rsrcLibraryOp.getBodyBlock());
472 for (
auto rsrc : prob.getResourceTypes())
473 ResourceTypeOp::create(
474 b, rsrc.getAttr(), {},
480 DenseMap<Operation *, StringAttr> opNames;
481 for (
auto *op : prob.getOperations()) {
482 if (
auto opName = prob.getOperationName(op))
483 opNames[op] = opName;
485 for (
auto &dep : prob.getDependences(op)) {
486 Operation *src = dep.getSource();
487 if (!dep.isAuxiliary() || opNames.count(src))
489 if (
auto srcOpName = prob.getOperationName(src)) {
490 opNames[src] = srcOpName;
493 opNames[src] = b.getStringAttr(Twine(
"Op") + Twine(opNames.size()));
498 b.setInsertionPointToEnd(instOp.getBodyBlock());
499 auto graphOp = DependenceGraphOp::create(b);
500 b.setInsertionPointToStart(graphOp.getBodyBlock());
504 for (
auto *op : prob.getOperations()) {
507 ArrayAttr dependences;
508 SmallVector<Attribute> depAttrs;
509 unsigned auxOperandIdx = op->getNumOperands();
510 for (
auto &dep : prob.getDependences(op)) {
514 if (dep.isDefUse() && depProps) {
515 auto depAttr = b.getAttr<DependenceAttr>(*dep.getDestinationIndex(),
516 StringAttr(), depProps);
517 depAttrs.push_back(depAttr);
521 if (!dep.isAuxiliary())
524 auto sourceRef = opNames.lookup(dep.getSource());
527 b.getAttr<DependenceAttr>(auxOperandIdx, sourceRef, depProps);
528 depAttrs.push_back(depAttr);
531 if (!depAttrs.empty())
532 dependences = b.getArrayAttr(depAttrs);
535 ArrayAttr properties =
542 OperationOp::create(b, op->getNumResults(), v.
get(op->getOperands()),
543 opNames.lookup(op), dependences, properties);
544 v.
set(op->getResults(), opOp->getResults());
InstanceOp saveProblem(ProblemT &prob, std::tuple< OperationPropertyTs... > opProps, std::tuple< OperatorTypePropertyTs... > oprProps, std::tuple< ResourceTypePropertyTs... > rsrcProps, std::tuple< DependencePropertyTs... > depProps, std::tuple< InstancePropertyTs... > instProps, OpBuilder &builder)
Construct an InstanceOp from a given ProblemT instance, and create/attach attributes of the given cla...
ProblemT loadProblem(InstanceOp instOp, std::tuple< OperationPropertyTs... > opProps, std::tuple< OperatorTypePropertyTs... > oprProps, std::tuple< ResourceTypePropertyTs... > rsrcProps, std::tuple< DependencePropertyTs... > depProps, std::tuple< InstancePropertyTs... > instProps)
Construct an instance of ProblemT from instOp, and attempt to set properties from the given attribute...