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

Added QIR string type and logging API



These API's are used when EntryPoint is created.

Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 3083524b
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -434,12 +434,15 @@ bool __quantum__rt__result_equal(Result *res, Result *comp) {
Result *__quantum__rt__result_get_one() { return ResultOne; }
Result *__quantum__rt__result_get_zero() { return ResultZero; }

void __quantum__rt__string_update_reference_count(void *str, int32_t count) {
void __quantum__rt__result_update_reference_count(Result *, int32_t count) {
  // TODO
  if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";
}

void __quantum__rt__result_update_reference_count(Result *, int32_t count) {
  // TODO
  if (verbose) std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";
void __quantum__rt__fail(QirString *str) {
  throw std::runtime_error(str->m_str);
}

void __quantum__rt__message(QirString *str) {
  std::cout << "[QIR Message] " << str->m_str << "\n";
}
 No newline at end of file
+24 −2
Original line number Diff line number Diff line
@@ -124,8 +124,25 @@ int8_t *__quantum__rt__array_get_element_ptr_nonvariadic(Array *array,
int8_t *__quantum__rt__array_get_element_ptr(Array *array, ...);
Array *__quantum__rt__array_project(Array *array, int dim, int64_t index);

// String-related API
void __quantum__rt__string_update_reference_count(void *str, int32_t count);
// String-related API:
// Specs: https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Data-Types.md#strings
void __quantum__rt__string_update_reference_count(QirString *str,
                                                  int32_t count);
QirString *__quantum__rt__string_create(char *null_terminated_buffer);
QirString *__quantum__rt__string_concatenate(QirString *in_head,
                                             QirString *in_tail);
bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs);
QirString *__quantum__rt__int_to_string(int64_t val);
QirString *__quantum__rt__double_to_string(double val);
QirString *__quantum__rt__bool_to_string(bool val);
QirString *__quantum__rt__result_to_string(Result *val);
QirString *__quantum__rt__pauli_to_string(Pauli pauli);
QirString *__quantum__rt__qubit_to_string(Qubit *q);
QirString *__quantum__rt__range_to_string(int64_t range_start,
                                          int64_t range_step,
                                          int64_t range_end);
const char *__quantum__rt__string_get_data(QirString *str);
int32_t __quantum__rt__string_get_length(QirString *str);

// Tuples:
TuplePtr __quantum__rt__tuple_create(int64_t size);
@@ -142,6 +159,11 @@ void __quantum__rt__capture_update_reference_count(Callable *clb,
void __quantum__rt__capture_update_alias_count(Callable *clb, int32_t count);
void __quantum__rt__callable_memory_management(int32_t index, Callable *clb,
                                               int64_t parameter);

// Classical Runtime: 
// https://github.com/microsoft/qsharp-language/blob/main/Specifications/QIR/Classical-Runtime.md#classical-runtime
void __quantum__rt__fail(QirString *str);
void __quantum__rt__message(QirString *str);
}

namespace qcor {
+9 −0
Original line number Diff line number Diff line
@@ -238,6 +238,15 @@ private:
  qcor::qsharp::IFunctor *m_functor;
};

// QIR string type (regular string with ref. counting)
struct QirString {
  int32_t m_refCount;
  std::string m_str;

  QirString(std::string &&str) : m_refCount(1), m_str(str) {}
  QirString(const char *cstr) : m_refCount(1), m_str(cstr) {}
};

namespace qcor {
// Helper func.
std::vector<int64_t> getRangeValues(::Array *in_array, const ::Range &in_range);
+119 −0
Original line number Diff line number Diff line

#include "qir-qrt.hpp"
#include <cstring>
#include <iostream>
extern "C" {
void __quantum__rt__string_update_reference_count(QirString *str,
                                                  int32_t count) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  if (str) {
    str->m_refCount += count;
    if (str->m_refCount <= 0) {
      // Dealloc:
      delete str;
    }
  }
}

QirString *__quantum__rt__string_create(char *null_terminated_buffer) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(null_terminated_buffer);
}

QirString *__quantum__rt__string_concatenate(QirString *in_head,
                                             QirString *in_tail) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(in_head->m_str + in_tail->m_str);
}

bool __quantum__rt__string_equal(QirString *lhs, QirString *rhs) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return (lhs->m_str == rhs->m_str);
}

QirString *__quantum__rt__int_to_string(int64_t val) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(std::to_string(val));
}

QirString *__quantum__rt__double_to_string(double val) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(std::to_string(val));
}
QirString *__quantum__rt__bool_to_string(bool val) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(std::to_string(val));
}
QirString *__quantum__rt__result_to_string(Result *val) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString(std::to_string(*val));
}

QirString *__quantum__rt__pauli_to_string(Pauli pauli) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString("Pauli");
}

QirString *__quantum__rt__qubit_to_string(Qubit *q) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString("q[" + std::to_string(q->id) + "]");
}

QirString *__quantum__rt__range_to_string(int64_t range_start,
                                          int64_t range_step,
                                          int64_t range_end) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return new QirString("Range(" + std::to_string(range_start) + "," +
                       std::to_string(range_step) + "," +
                       std::to_string(range_end) + ")");
}

const char *__quantum__rt__string_get_data(QirString *str) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return str->m_str.c_str();
}

int32_t __quantum__rt__string_get_length(QirString *str) {

  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

  return str->m_str.size();
}
}
 No newline at end of file