43                  ConversionPatternRewriter &rewriter)
 const override {
 
   44    auto affineParallelSteps = affineParallelOp.getSteps();
 
   45    if (std::any_of(affineParallelSteps.begin(), affineParallelSteps.end(),
 
   46                    [](
int step) { return step > 1; }) ||
 
   47        !affineParallelOp->getAttr(
"calyx.unroll"))
 
   48      return rewriter.notifyMatchFailure(
 
   50          "Please run the MLIR canonical '-lower-affine' pass.");
 
   52    if (!affineParallelOp.getResults().empty())
 
   53      return rewriter.notifyMatchFailure(
 
   54          affineParallelOp, 
"Currently doesn't support parallel reduction.");
 
   56    Location loc = affineParallelOp.getLoc();
 
   57    SmallVector<Value, 8> steps;
 
   58    for (int64_t step : affineParallelSteps)
 
   59      steps.push_back(arith::ConstantIndexOp::create(rewriter, loc, step));
 
   61    auto upperBoundTuple = mlir::affine::expandAffineMap(
 
   62        rewriter, loc, affineParallelOp.getUpperBoundsMap(),
 
   63        affineParallelOp.getUpperBoundsOperands());
 
   65    auto lowerBoundTuple = mlir::affine::expandAffineMap(
 
   66        rewriter, loc, affineParallelOp.getLowerBoundsMap(),
 
   67        affineParallelOp.getLowerBoundsOperands());
 
   69    auto affineParallelTerminator = cast<affine::AffineYieldOp>(
 
   70        affineParallelOp.getBody()->getTerminator());
 
   72    scf::ParallelOp scfParallelOp = scf::ParallelOp::create(
 
   73        rewriter, loc, *lowerBoundTuple, *upperBoundTuple, steps,
 
   75    scfParallelOp->setAttr(
"calyx.unroll",
 
   76                           affineParallelOp->getAttr(
"calyx.unroll"));
 
   77    rewriter.eraseBlock(scfParallelOp.getBody());
 
   78    rewriter.inlineRegionBefore(affineParallelOp.getRegion(),
 
   79                                scfParallelOp.getRegion(),
 
   80                                scfParallelOp.getRegion().end());
 
   81    rewriter.replaceOp(affineParallelOp, scfParallelOp);
 
   82    rewriter.setInsertionPoint(affineParallelTerminator);
 
   83    rewriter.replaceOpWithNewOp<scf::ReduceOp>(affineParallelTerminator);