Commit c808afa0 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Hook validation to MLIR via runtime impl



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 025fc48e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -538,6 +538,15 @@ void __quantum__rt__end_multi_ctrl_u_region(
  return;
}

void __quantum__rt__start_validated_region() {
  // TODO: Implement this
  std::cout << "__quantum__rt__start_validated_region() not implemented\n";
}
void __quantum__rt__end_validated_region() {
  // TODO: Implement this
  std::cout << "__quantum__rt__end_validated_region() not implemented\n";
}

int8_t *__quantum__rt__array_get_element_ptr_1d(Array *q, uint64_t idx) {
  Array &arr = *q;
  int8_t *ptr = arr[idx];
+4 −0
Original line number Diff line number Diff line
@@ -100,6 +100,10 @@ void __quantum__rt__end_pow_u_region(int64_t power);

void __quantum__rt__mark_compute();
void __quantum__rt__unmark_compute();

// Validation API:
void __quantum__rt__start_validated_region();
void __quantum__rt__end_validated_region();
// -------

// Array API
+42 −1
Original line number Diff line number Diff line
@@ -18,6 +18,47 @@ void MirrorCircuitTransformPass::getDependentDialects(
}

void MirrorCircuitTransformPass::runOnOperation() {
    // TODO
  std::cout << "MirrorCircuitTransformPass:\n";
  getOperation().dump();
  
  
  getOperation().walk([&](mlir::FuncOp funcOp) {
    if (funcOp.getName().str().rfind("__internal_mlir_", 0) == 0) {
      mlir::OpBuilder builder(funcOp);

      {
        mlir::OpBuilder::InsertionGuard guard(builder);
        auto parentModule = funcOp->getParentOfType<mlir::ModuleOp>();
        builder.setInsertionPointToStart(
            &parentModule.getRegion().getBlocks().front());

        auto func_decl = builder.create<mlir::FuncOp>(
            builder.getUnknownLoc(), "__quantum__rt__start_validated_region",
            builder.getFunctionType(llvm::None, llvm::None));
        func_decl.setVisibility(mlir::SymbolTable::Visibility::Private);

        mlir::Block &fnBody = funcOp.getBody().getBlocks().front();
        builder.setInsertionPointToStart(&fnBody);
        builder.create<mlir::CallOp>(builder.getUnknownLoc(), func_decl);
      }

      {
        mlir::OpBuilder::InsertionGuard guard(builder);
        auto parentModule = funcOp->getParentOfType<mlir::ModuleOp>();
        builder.setInsertionPointToStart(
            &parentModule.getRegion().getBlocks().front());

        auto func_decl = builder.create<mlir::FuncOp>(
            builder.getUnknownLoc(), "__quantum__rt__end_validated_region",
            builder.getFunctionType(llvm::None, llvm::None));
        func_decl.setVisibility(mlir::SymbolTable::Visibility::Private);
        mlir::Block &fnBody = funcOp.getBody().getBlocks().back();
        builder.setInsertionPoint(fnBody.getTerminator());
        builder.create<mlir::CallOp>(builder.getUnknownLoc(), func_decl);
      }
    }
  });
  std::cout << "After MirrorCircuitTransformPass:\n";
  getOperation().dump();
}
} // namespace qcor
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -714,6 +714,10 @@ def main(argv=None):
        if '--q-optimize' in sys.argv[1:]:
            sys.argv.remove('--q-optimize')
            extra_args.append('--q-optimize')
        # Passing -validate to qcor-mlir will enable execution validation
        if '-D__internal__qcor__validate__execution' in sys.argv:
            extra_args.append('--q-validate')

        # Parse clang -Ox optimization level:
        opt_level_options = ['-O0', '-O1', '-O2', '-O3'] 
        for opt_level_option in opt_level_options: