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

Tidy up the QRT file structure



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent bf400746
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
#include "qir-qrt.hpp"
#include "qir-qrt-ms-compat.hpp"
#include <iostream>

// QRT QIS (quantum instructions) implementation for MSFT Compatability
+48 −0
Original line number Diff line number Diff line
// These are MSFT QIR API generated by the Q# compiler.
// They might be *ahead* of the official spec release
// hence, we keep them separate here.
#pragma once

#include "qir-types.hpp"

extern "C" {
void __quantum__qis__exp__body(Array *paulis, double angle, Array *qubits);
void __quantum__qis__exp__adj(Array *paulis, double angle, Array *qubits);
void __quantum__qis__exp__ctl(Array *ctls, Array *paulis, double angle,
                              Array *qubits);
void __quantum__qis__exp__ctladj(Array *ctls, Array *paulis, double angle,
                                 Array *qubits);
void __quantum__qis__h__body(Qubit *q);
void __quantum__qis__h__ctl(Array *ctls, Qubit *q);
void __quantum__qis__r__body(Pauli pauli, double theta, Qubit *q);
void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit *q);
void __quantum__qis__r__ctl(Array *ctls, Pauli pauli, double theta, Qubit *q);
void __quantum__qis__r__ctladj(Array *ctls, Pauli pauli, double theta,
                               Qubit *q);
void __quantum__qis__s__body(Qubit *q);
void __quantum__qis__s__adj(Qubit *q);
void __quantum__qis__s__ctl(Array *ctls, Qubit *q);
void __quantum__qis__s__ctladj(Array *ctls, Qubit *q);
void __quantum__qis__t__body(Qubit *q);
void __quantum__qis__t__adj(Qubit *q);
void __quantum__qis__t__ctl(Array *ctls, Qubit *q);
void __quantum__qis__t__ctladj(Array *ctls, Qubit *q);
void __quantum__qis__x__body(Qubit *q);
void __quantum__qis__x__adj(Qubit *q);
void __quantum__qis__x__ctl(Array *ctls, Qubit *q);
void __quantum__qis__x__ctladj(Array *ctls, Qubit *q);
void __quantum__qis__y__body(Qubit *q);
void __quantum__qis__y__adj(Qubit *q);
void __quantum__qis__y__ctl(Array *ctls, Qubit *q);
void __quantum__qis__y__ctladj(Array *ctls, Qubit *q);
void __quantum__qis__z__body(Qubit *q);
void __quantum__qis__z__adj(Qubit *q);
void __quantum__qis__z__ctl(Array *ctls, Qubit *q);
void __quantum__qis__z__ctladj(Array *ctls, Qubit *q);
void __quantum__qis__rx__body(double theta, Qubit *q);
void __quantum__qis__ry__body(double theta, Qubit *q);
void __quantum__qis__rz__body(double theta, Qubit *q);
void __quantum__qis__cnot__body(Qubit *src, Qubit *tgt);
Result *__quantum__qis__measure__body(Array *bases, Array *qubits);
double __quantum__qis__intasdouble__body(int32_t intVal);
}
+10 −2
Original line number Diff line number Diff line
@@ -224,10 +224,18 @@ void __quantum__rt__finalize() {

bool __quantum__rt__result_equal(Result *res, Result *comp) {
  if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";
  if (mode == QRT_MODE::NISQ) {
    throw std::runtime_error(
        "Comparing Measure results in NISQ mode is prohibited.");
  }

  // std::cout << "RES = " << res << "\n";
  // std::cout << "COMP = " << comp << "\n";
  // We can do pointer comparison here.
  return res == comp;
  if (res && comp) {
    // Do pointer comparison here then fallback by deref the result.
    return (res == comp) || (*res) == (*comp);
  }
  return false;
}

void __quantum__rt__string_update_reference_count(void *str, int64_t count) {
+7 −50
Original line number Diff line number Diff line
#pragma once

#include <memory>
#include <vector>
#include "qalloc.hpp"
@@ -19,11 +21,13 @@ extern std::shared_ptr<xacc::AcceleratorBuffer> global_qreg;
extern QRT_MODE mode;

void initialize();

// Initialize/Finalize/Config API
void __quantum__rt__initialize(int argc, int8_t** argv);
void __quantum__rt__finalize();

void __quantum__rt__set_external_qreg(qreg* q);

// QIS API (i.e. quantum instructions)
void __quantum__qis__cnot(Qubit* src, Qubit* tgt);
void __quantum__qis__h(Qubit* q);
void __quantum__qis__s(Qubit* q);
@@ -40,56 +44,9 @@ void __quantum__qis__rx(double x, Qubit* q);
void __quantum__qis__ry(double x, Qubit* q);
void __quantum__qis__rz(double x, Qubit* q);
void __quantum__qis__u3(double theta, double phi, double lambda, Qubit* q);

// New QIR runtime API:
void __quantum__qis__exp__body(Array* paulis, double angle, Array* qubits);
void __quantum__qis__exp__adj(Array* paulis, double angle, Array* qubits);
void __quantum__qis__exp__ctl(Array* ctls, Array* paulis, double angle, Array* qubits);
void __quantum__qis__exp__ctladj(Array* ctls, Array* paulis, double angle, Array* qubits);
void __quantum__qis__h__body(Qubit* q);
void __quantum__qis__h__ctl(Array* ctls, Qubit* q);
void __quantum__qis__r__body(Pauli pauli, double theta, Qubit* q);
void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit* q);    
void __quantum__qis__r__ctl(Array* ctls, Pauli pauli, double theta, Qubit* q);
void __quantum__qis__r__ctladj(Array* ctls, Pauli pauli, double theta, Qubit* q);
void __quantum__qis__s__body(Qubit* q);
void __quantum__qis__s__adj(Qubit* q);
void __quantum__qis__s__ctl(Array* ctls, Qubit* q);
void __quantum__qis__s__ctladj(Array* ctls, Qubit* q);
void __quantum__qis__t__body(Qubit* q);
void __quantum__qis__t__adj(Qubit* q);
void __quantum__qis__t__ctl(Array* ctls, Qubit* q);
void __quantum__qis__t__ctladj(Array* ctls, Qubit* q);
void __quantum__qis__x__body(Qubit* q);
void __quantum__qis__x__adj(Qubit* q);
void __quantum__qis__x__ctl(Array* ctls, Qubit* q);
void __quantum__qis__x__ctladj(Array* ctls, Qubit* q);
void __quantum__qis__y__body(Qubit* q);
void __quantum__qis__y__adj(Qubit* q);
void __quantum__qis__y__ctl(Array* ctls, Qubit* q);
void __quantum__qis__y__ctladj(Array* ctls, Qubit* q);
void __quantum__qis__z__body(Qubit* q);
void __quantum__qis__z__adj(Qubit* q);
void __quantum__qis__z__ctl(Array* ctls, Qubit* q);
void __quantum__qis__z__ctladj(Array* ctls, Qubit* q);

void __quantum__qis__rx__body(double theta, Qubit* q);
void __quantum__qis__ry__body(double theta, Qubit* q);
void __quantum__qis__rz__body(double theta, Qubit* q);
void __quantum__qis__cnot__body(Qubit* src, Qubit* tgt);

Result* __quantum__qis__measure__body(Array* bases, Array* qubits);
double __quantum__qis__intasdouble__body(int32_t intVal);
void __quantum__rt__array_update_alias_count(Array* bases, int64_t count);
bool __quantum__rt__result_equal(Result* res, Result* comp);
int64_t __quantum__rt__array_get_size_1d(Array* state1);
int8_t* __quantum__rt__tuple_create(int64_t state);
void __quantum__rt__string_update_reference_count(void* str, int64_t count);
void __quantum__rt__array_update_reference_count(Array* aux, int64_t count);
void __quantum__rt__result_update_reference_count(Result *, int64_t count);
// =====================================================

Result* __quantum__qis__mz(Qubit* q);
// Compare results.
bool __quantum__rt__result_equal(Result *res, Result *comp);

// Qubit Alloc/Dealloc API
Array* __quantum__rt__qubit_allocate_array(uint64_t idx);
+2 −0
Original line number Diff line number Diff line
#pragma once

#include <cassert>

// Defines implementations of QIR Opaque types
Loading