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);
228 auto graphOp = instOp.getDependenceGraph();
229 graphOp.walk([&](OperationOp opOp) {
230 prob.insertOperation(opOp);
232 prob, opOp, opOp.getSspPropertiesAttr());
233 if (
auto opName = opOp.getSymNameAttr())
234 prob.setOperationName(opOp, opName);
239 if (!prob.getLinkedOperatorType(opOp).has_value())
244 SymbolRefAttr oprRef = opOp.getLinkedOperatorTypeAttr().getValue();
248 oprOp = SymbolTable::lookupSymbolIn(libraryOp, oprRef);
251 oprOp = SymbolTable::lookupSymbolIn(instOp, oprRef);
255 SymbolTable::lookupNearestSymbolFrom(instOp->getParentOp(), oprRef);
257 assert(oprOp && isa<OperatorTypeOp>(oprOp));
260 auto &opr = operatorTypes[oprOp];
263 prob, cast<OperatorTypeOp>(oprOp), operatorTypeIds);
266 prob.setLinkedOperatorType(opOp, opr);
271 if (!prob.getLinkedResourceTypes(opOp).has_value())
276 SmallVector<ResourceType> loadedRsrcs;
277 for (
auto attr : opOp.getLinkedResourceTypesAttr().getValue()) {
278 SymbolRefAttr rsrcRef = dyn_cast<SymbolRefAttr>(attr);
280 "expected SymbolRefAttr inside LinkedResourceTypesAttr");
284 rsrcOp = SymbolTable::lookupSymbolIn(rsrcLibraryOp, rsrcRef);
288 rsrcOp = SymbolTable::lookupSymbolIn(instOp, rsrcRef);
291 rsrcOp = SymbolTable::lookupNearestSymbolFrom(instOp->getParentOp(),
294 assert(rsrcOp && isa<ResourceTypeOp>(rsrcOp));
297 auto &rsrc = resourceTypes[rsrcOp];
300 prob, cast<ResourceTypeOp>(rsrcOp), resourceTypeIds);
302 loadedRsrcs.push_back(rsrc);
306 prob.setLinkedResourceTypes(opOp, loadedRsrcs);
311 graphOp.walk([&](OperationOp opOp) {
312 ArrayAttr depsAttr = opOp.getDependencesAttr();
316 for (
auto depAttr : depsAttr.getAsRange<DependenceAttr>()) {
318 if (FlatSymbolRefAttr sourceRef = depAttr.getSourceRef()) {
319 Operation *sourceOp = SymbolTable::lookupSymbolIn(graphOp, sourceRef);
322 LogicalResult res = prob.insertDependence(dep);
326 dep =
Dependence(&opOp->getOpOperand(depAttr.getOperandIdx()));
329 prob, dep, depAttr.getProperties());
432saveProblem(ProblemT &prob, std::tuple<OperationPropertyTs...> opProps,
433 std::tuple<OperatorTypePropertyTs...> oprProps,
434 std::tuple<ResourceTypePropertyTs...> rsrcProps,
435 std::tuple<DependencePropertyTs...> depProps,
436 std::tuple<InstancePropertyTs...> instProps, OpBuilder &builder) {
437 ImplicitLocOpBuilder b(builder.getUnknownLoc(), builder);
440 auto instOp = b.create<InstanceOp>(
441 builder.getStringAttr(ProblemT::name),
443 if (
auto instName = prob.getInstanceName())
444 instOp.setSymNameAttr(instName);
447 b.setInsertionPointToEnd(instOp.getBodyBlock());
448 auto libraryOp = b.create<OperatorLibraryOp>();
449 if (
auto libName = prob.getLibraryName())
450 libraryOp.setSymNameAttr(libName);
451 b.setInsertionPointToStart(libraryOp.getBodyBlock());
453 for (
auto opr : prob.getOperatorTypes())
454 b.create<OperatorTypeOp>(
460 b.setInsertionPointToEnd(instOp.getBodyBlock());
461 auto rsrcLibraryOp = b.create<ResourceLibraryOp>();
462 if (
auto rsrcLibName = prob.getRsrcLibraryName())
463 rsrcLibraryOp.setSymNameAttr(rsrcLibName);
464 b.setInsertionPointToStart(rsrcLibraryOp.getBodyBlock());
466 for (
auto rsrc : prob.getResourceTypes())
467 b.create<ResourceTypeOp>(
474 DenseMap<Operation *, StringAttr> opNames;
475 for (
auto *op : prob.getOperations()) {
476 if (
auto opName = prob.getOperationName(op))
477 opNames[op] = opName;
479 for (
auto &dep : prob.getDependences(op)) {
480 Operation *src = dep.getSource();
481 if (!dep.isAuxiliary() || opNames.count(src))
483 if (
auto srcOpName = prob.getOperationName(src)) {
484 opNames[src] = srcOpName;
487 opNames[src] = b.getStringAttr(Twine(
"Op") + Twine(opNames.size()));
492 b.setInsertionPointToEnd(instOp.getBodyBlock());
493 auto graphOp = b.create<DependenceGraphOp>();
494 b.setInsertionPointToStart(graphOp.getBodyBlock());
498 for (
auto *op : prob.getOperations()) {
501 ArrayAttr dependences;
502 SmallVector<Attribute> depAttrs;
503 unsigned auxOperandIdx = op->getNumOperands();
504 for (
auto &dep : prob.getDependences(op)) {
508 if (dep.isDefUse() && depProps) {
509 auto depAttr = b.getAttr<DependenceAttr>(*dep.getDestinationIndex(),
510 FlatSymbolRefAttr(), depProps);
511 depAttrs.push_back(depAttr);
515 if (!dep.isAuxiliary())
518 auto sourceOpName = opNames.lookup(dep.getSource());
520 auto sourceRef = b.getAttr<FlatSymbolRefAttr>(sourceOpName);
522 b.getAttr<DependenceAttr>(auxOperandIdx, sourceRef, depProps);
523 depAttrs.push_back(depAttr);
526 if (!depAttrs.empty())
527 dependences = b.getArrayAttr(depAttrs);
530 ArrayAttr properties =
537 b.create<OperationOp>(op->getNumResults(), v.
get(op->getOperands()),
538 opNames.lookup(op), dependences, properties);
539 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...