Commit 5eb848c2 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

My terrible mistake: reading the spec and the llvm file wrongly w.r.t. the control-r



The arguments (angle, pauli, qubit) are wrapped in a struct then passed by pointer.
I kept using the flat argument pack and debug bogus values...

Tested by: checking the IQFT circuit w/ used controlled rotation gates.

Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent da4504e6
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -86,38 +86,34 @@ void __quantum__qis__r__adj(Pauli pauli, double theta, Qubit *q) {
  __quantum__qis__r__body(pauli, -theta, q);
}

void __quantum__qis__r__ctl(Array *ctls, bool pauli_raw[2], double theta, Qubit *q) {
  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";
  
void __quantum__qis__r__ctl(Array *ctls, RotationCtrlArgs *args) {
  // std::cout << "Control rotation:\n";
  // std::cout << "Angle = " << args->theta << "\n";
  // std::cout << "Pauli: " << args->pauli << "\n";
  // std::cout << "Qubit: " << args->q->id << "\n";
  std::vector<Qubit *> ctrl_qubits;
  for (int i = 0; i < ctls->size(); ++i) {
    int8_t *arrayPtr = (*ctls)[i];
    Qubit *ctrl_qubit = *(reinterpret_cast<Qubit **>(arrayPtr));
    ctrl_qubits.emplace_back(ctrl_qubit);
  }
  Pauli pauli = static_cast<Pauli>(*pauli_raw);
  __quantum__rt__start_ctrl_u_region();
  __quantum__qis__r__body(pauli, theta, q);
  __quantum__qis__r__body(args->pauli, args->theta, args->q);
  __quantum__rt__end_multi_ctrl_u_region(ctrl_qubits);
}

void __quantum__qis__r__ctladj(Array *ctls, bool pauli_raw[2], double theta,
                               Qubit *q) {
  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";

void __quantum__qis__r__ctladj(Array *ctls, RotationCtrlArgs *args) {
  std::vector<Qubit *> ctrl_qubits;
  for (int i = 0; i < ctls->size(); ++i) {
    int8_t *arrayPtr = (*ctls)[i];
    Qubit *ctrl_qubit = *(reinterpret_cast<Qubit **>(arrayPtr));
    ctrl_qubits.emplace_back(ctrl_qubit);
  }
  Pauli pauli = static_cast<Pauli>(*pauli_raw);
  __quantum__rt__start_ctrl_u_region();
  __quantum__qis__r__body(pauli, -theta, q);
  __quantum__qis__r__body(args->pauli, -args->theta, args->q);
  __quantum__rt__end_multi_ctrl_u_region(ctrl_qubits);
}

void __quantum__qis__s__body(Qubit *q) {
  if (verbose)
    std::cout << "CALL: " << __PRETTY_FUNCTION__ << "\n";
+10 −5
Original line number Diff line number Diff line
@@ -17,11 +17,16 @@ 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);
// Use bool array to get the i2 Pauli from LLVM:
// To prevent any potential padding issues for these function signatures.
void __quantum__qis__r__ctl(Array *ctls, bool pauli[2], double theta, Qubit *q);
void __quantum__qis__r__ctladj(Array *ctls, bool pauli[2], double theta,
                               Qubit *q);

// The *wrapped* controlled arguments of rotation...
struct RotationCtrlArgs {
  Pauli pauli;
  double theta;
  Qubit *q;
};
void __quantum__qis__r__ctl(Array *ctls, RotationCtrlArgs *args);
void __quantum__qis__r__ctladj(Array *ctls, RotationCtrlArgs *args);

void __quantum__qis__s__body(Qubit *q);
void __quantum__qis__s__adj(Qubit *q);
void __quantum__qis__s__ctl(Array *ctls, Qubit *q);