Commit f6ec5a87 authored by Mccaskey, Alex's avatar Mccaskey, Alex
Browse files

fix bug in tracing qubit lifelines for return values from gate def

parent 48a33bd7
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -12,8 +12,6 @@ antlrcpp::Any qasm3_visitor::visitCompute_action_stmt(
  builder.create<mlir::quantum::ComputeUnMarkerOp>(location);
  visit(context->action_block);

  std::cout << context->getText() << "\n";

  builder.create<mlir::quantum::ComputeMarkerOp>(location);
  builder.create<mlir::quantum::StartAdjointURegion>(location);
  visit(context->compute_block);
+24 −6
Original line number Diff line number Diff line
@@ -150,21 +150,39 @@ antlrcpp::Any qasm3_visitor::visitQuantumGateDefinition(
  // from this custom gate definition
  std::vector<mlir::Value> result_qubit_vals;
  for (auto arg : entryBlock.getArguments()) {
    auto users = arg.getUsers();
    mlir::Value last_user;
    if (!users.empty()) {
      last_user = (*users.begin())->getResult(0);
    mlir::Value last_user = arg;
    auto users = last_user.getUsers();

    while (!users.empty()) {
      // Get the first and only user
      auto only_user = *users.begin();

      // figure out which operand idx last_user 
      // corresponds to
      int idx = -1;
      for (auto op : only_user->getOperands()) {
        idx++;
        if (op == last_user) {
          break;
        }
      }

      // set the new last user as the correct 
      // return value of the user
      last_user = (*users.begin())->getResult(idx);
      users = last_user.getUsers();
    }
    result_qubit_vals.push_back(last_user);
  }

  // std::cout << "GATE " << gate_call_name << " has " << result_qubit_vals.size() << " to return.\n";
  // std::cout << "GATE " << gate_call_name << " has " << result_qubit_vals.size()
  //           << " to return.\n";
  // for (auto v : result_qubit_vals) {
  //   v.dump();
  // }

  builder.create<mlir::ReturnOp>(builder.getUnknownLoc(), llvm::makeArrayRef(result_qubit_vals));
  builder.create<mlir::ReturnOp>(builder.getUnknownLoc(),
                                 llvm::makeArrayRef(result_qubit_vals));

  m_module.push_back(function);