Commit 0a22ba29 authored by Mccaskey, Alex's avatar Mccaskey, Alex
Browse files

adding ability to run ir transformations programmatically with qcor api, added...


adding ability to run ir transformations programmatically with qcor api, added examples in examples/qrt/circuit_opt

Signed-off-by: Mccaskey, Alex's avatarAlex McCaskey <mccaskeyaj@ornl.gov>
parent 771167b6
Loading
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
// Demonstrate loading openqasm file with
// #include call, the
// qcor::measure_all API call, and programmatically
// optimizing a quantum kernel.
//
// run this with
// qcor -qrt -qpu aer grover.cpp
// ./a.out

#include "qcor.hpp"

__qpu__ void grover_5(qreg q) {
  using qcor::openqasm;

#include "grover_5.qasm"
}

int main() {

  // Allocate the qubits
  auto q = qalloc(9);

  // This kernel is unmeasured,
  // add measures to them
  auto measure_grov = qcor::measure_all(grover_5, q);

  std::cout << "Number of Gates Before: "
            << qcor::n_instructions(measure_grov, q) << "\n";

  // Apply some circuit optimizations
  auto optimized_kernel = qcor::apply_transformations(
      measure_grov, {"circuit-optimizer", "rotation-folding"}, q);

  std::cout << "Number of Gates After: "
            << qcor::n_instructions(optimized_kernel, q) << "\n";
}
 No newline at end of file
+164 −0
Original line number Diff line number Diff line
OPENQASM 2.0;
include "qelib1.inc";

qreg qubits[9];
creg c[9];
x qubits[5];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[8];
h qubits[5];
ccx qubits[4],qubits[8],qubits[5];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[4];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[4],qubits[8],qubits[5];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[4];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[4],qubits[8],qubits[5];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[4];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[4],qubits[8],qubits[5];
ccx qubits[3],qubits[7],qubits[8];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
ccx qubits[0],qubits[1],qubits[6];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[3],qubits[7],qubits[4];
ccx qubits[2],qubits[6],qubits[7];
ccx qubits[0],qubits[1],qubits[6];
x qubits[4];
x qubits[0];
x qubits[1];
x qubits[2];
x qubits[3];
h qubits[0];
h qubits[1];
h qubits[2];
h qubits[3];
h qubits[4];
+39 −0
Original line number Diff line number Diff line
// Demonstrate loading openqasm file with
// #include call, the
// qcor::measure_all API call, and programmatically
// optimizing a quantum kernel.
//
// run this with
// qcor -qrt -qpu aer mod5_4.cpp
// ./a.out

#include "qcor.hpp"

__qpu__ void mod5_4(qreg q) {
  using qcor::openqasm;

#include "mod5_4.qasm"
}

int main() {

  // Allocate the qubits
  auto q = qalloc(5);

  // This kernel is unmeasured,
  // add measures to them
  auto measured = qcor::measure_all(mod5_4, q);

  std::cout << "Number of Gates Before: "
            << qcor::n_instructions(measured, q) << "\n";

  // Apply some circuit optimizations
  auto optimized_kernel = qcor::apply_transformations(
      measured, {"circuit-optimizer", "rotation-folding"}, q);

  std::cout << "Number of Gates After: "
            << qcor::n_instructions(optimized_kernel, q) << "\n";
    
  optimized_kernel(q);
  q.print();
}
 No newline at end of file
+13 −0
Original line number Diff line number Diff line
OPENQASM 2.0;
include "qelib1.inc";

qreg qubits[5];
x qubits[4];
ccx qubits[0],qubits[3],qubits[4];
ccx qubits[2],qubits[3],qubits[4];
cx qubits[3],qubits[4];
ccx qubits[1],qubits[2],qubits[4];
cx qubits[2],qubits[4];
ccx qubits[0],qubits[1],qubits[4];
cx qubits[1],qubits[4];
cx qubits[0],qubits[4];
+2 −4
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ using namespace clang;
namespace {

bool qrt = false;
std::string qpu_name = "tnqvm";
std::string qpu_name = "qpp";
int shots = 0;

class QCORSyntaxHandler : public SyntaxHandler {
@@ -51,9 +51,6 @@ public:
    // If the function has no arguments, then we throw an error
    const DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
    std::string kernel_name = D.getName().Identifier->getName().str();
    if (!FTI.Params) {
      //   diagnostics.Report(D.getBeginLoc(), invalid_no_args);
    }

    function_prototype = "(";
    // Loop over the function arguments and get the
@@ -181,6 +178,7 @@ public:
        }
        ++i;
        qpu_name = args[i];

      } else if (args[i] == "-shots") {
        if (i + 1 >= e) {
          D.Report(D.getCustomDiagID(DiagnosticsEngine::Error,
Loading