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

added valuesemanticsinstop, hooked up to qasm3 for simple one qubit gates and...


added valuesemanticsinstop, hooked up to qasm3 for simple one qubit gates and cnot. added first pass at optimizations using value semantics

Signed-off-by: Mccaskey, Alex's avatarAlex McCaskey <mccaskeyaj@ornl.gov>
parent dbc5c59f
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -15,4 +15,3 @@

#define GET_OP_CLASSES
#include "Quantum/QuantumOps.h.inc"
 No newline at end of file
+27 −0
Original line number Diff line number Diff line
@@ -15,6 +15,10 @@ def StringType : OpaqueType<"quantum", "StringType", "opaque string type">;
def QallocOp : QuantumOp<"qalloc", []> {
    let arguments = (ins AnyI64Attr:$size, StrAttr:$name);
    let results = (outs ArrayType:$qubits);

    let printer = [{  auto op = *this;
  p << "q.qalloc(" << op.size() << ") { name = " << op.name() << " }";
  p << " : " << op.qubits().getType(); }];
}

// Create an array holding Qubit pointers for aliasing purposes,
@@ -27,6 +31,9 @@ def QaliasArrayAllocOp : QuantumOp<"createQubitArray", []> {
def ExtractQubitOp : QuantumOp<"qextract", []> {
    let arguments = (ins ArrayType:$qreg, AnyInteger:$idx);
    let results = (outs QubitType:$qbit);
    let printer = [{  auto op = *this;
  p << "q.extract(" << op.getOperands() << ")";
  p << " : " << op.qbit().getType(); }];
}

def GeneralArrayExtractOp : QuantumOp<"array_extract", []> {
@@ -85,26 +92,46 @@ def EndPowURegion : QuantumOp<"end_pow_u_region", []> {
def InstOp : QuantumOp<"inst", [AttrSizedOperandSegments]> {
    let arguments = (ins StrAttr:$name, Variadic<QubitType>:$qubits, Variadic<F64>:$params);
    let results = (outs Optional<ResultType>:$bit);

    let printer = [{  auto op = *this;
  p << "q." << op.name() << "(" << op.getOperands() << ") : ";
  p.printFunctionalType(op.getOperandTypes(), op.getResultTypes()); }];
}

def ValueSemanticsInstOp : QuantumOp<"value_inst", [AttrSizedOperandSegments]> {
    let arguments = (ins StrAttr:$name, Variadic<QubitType>:$qubits, Variadic<F64>:$params);
    let results = (outs Variadic<AnyTypeOf<[ResultType, QubitType]>>:$result);

    let printer = [{  auto op = *this;
  p << "qvs." << op.name() << "(" << op.getOperands() << ") : " << op.result().getType(); }];
  
}

def DeallocOp : QuantumOp<"dealloc", []> {
    let arguments = (ins ArrayType:$qubits);
    let results = (outs);
    let printer = [{  auto op = *this;
  p << "q.dealloc(" << op.qubits() << ")"; }];
}

def QRTInitOp : QuantumOp<"init", []> {
    let arguments = (ins AnyI32:$argc, ArgvType:$argv);
    let results = (outs);
    let printer = [{  auto op = *this;
  p << "q.init(" << op.getOperands() << ")"; }];
}

def QRTFinalizeOp : QuantumOp<"finalize", []> {
    let arguments = (ins);
    let results = (outs);
    let printer = [{  p << "q.finalize()"; }];
}

def SetQregOp : QuantumOp<"set_qreg", []> {
    let arguments = (ins QregType:$qreg);
    let results = (outs);
    let printer = [{  auto op = *this;
  p << "q.set_qreg(" << op.qreg() << ")"; }];
}

def PrintOp : QuantumOp<"print", []> {
+10 −0
Original line number Diff line number Diff line

#include "Quantum/QuantumDialect.h"
#include "Quantum/QuantumOps.h"
#include "mlir/IR/OpImplementation.h"

using namespace mlir;
using namespace mlir::quantum;
@@ -15,3 +16,12 @@ void QuantumDialect::initialize() {
#include "Quantum/QuantumOps.cpp.inc"
      >();
}

// static void print(mlir::OpAsmPrinter &printer, mlir::quantum::InstOp op) {
//   printer << "q." << op.name() << "(" << *(op.qubits().begin());
//   for (auto i = 1; i < op.qubits().size(); i++) {
//     printer << ", " << op.qubits()[i]; 
//   }
//   printer << ")";

// }
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
@@ -20,3 +20,5 @@ bool isOpaqueTypeWithName(mlir::Type type, std::string dialect,

#define GET_OP_CLASSES
#include "Quantum/QuantumOps.cpp.inc"

+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ void Qasm3SyntaxHandler::GetReplacement(Preprocessor &PP, Declarator &D,
  std::vector<std::string> unique_f_names{kernel_name};
  mlir::PassManager pm(&context);
  applyPassManagerCLOptions(pm);
  pm.addPass(std::make_unique<qcor::QuantumToLLVMLoweringPass>(unique_f_names));
  pm.addPass(std::make_unique<qcor::QuantumToLLVMLoweringPass>(pm, unique_f_names));
  auto module_op = (*module).getOperation();
  if (mlir::failed(pm.run(module_op))) {
    std::cout << "Pass Manager Failed\n";
Loading