QuEST_qasm.c File Reference
#include "QuEST.h"
#include "QuEST_precision.h"
#include "QuEST_internal.h"
#include "QuEST_qasm.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

Go to the source code of this file.

Macros

#define BUF_GROW_FAC   2
 
#define BUF_INIT_SIZE   1024
 
#define COMMENT_PREF   "//"
 
#define CTRL_LABEL_PREF   "c"
 
#define INIT_ZERO_CMD   "reset"
 
#define MAX_LINE_LEN   1024
 
#define MEASURE_CMD   "measure"
 
#define MESREG_LABEL   "c"
 
#define QUREG_LABEL   "q"
 TODO. More...
 

Functions

void addGateToQASM (Qureg qureg, TargetGate gate, int *controlQubits, int numControlQubits, int targetQubit, qreal *params, int numParams)
 
void addStringToQASM (Qureg qureg, char line[], int lineLen)
 
void bufferOverflow (void)
 
void qasm_clearRecorded (Qureg qureg)
 
void qasm_free (Qureg qureg)
 
void qasm_printRecorded (Qureg qureg)
 
void qasm_recordAxisRotation (Qureg qureg, qreal angle, Vector axis, int targetQubit)
 
void qasm_recordComment (Qureg qureg, char *comment,...)
 
void qasm_recordCompactUnitary (Qureg qureg, Complex alpha, Complex beta, int targetQubit)
 
void qasm_recordControlledAxisRotation (Qureg qureg, qreal angle, Vector axis, int controlQubit, int targetQubit)
 
void qasm_recordControlledCompactUnitary (Qureg qureg, Complex alpha, Complex beta, int controlQubit, int targetQubit)
 
void qasm_recordControlledGate (Qureg qureg, TargetGate gate, int controlQubit, int targetQubit)
 
void qasm_recordControlledParamGate (Qureg qureg, TargetGate gate, int controlQubit, int targetQubit, qreal param)
 
void qasm_recordControlledUnitary (Qureg qureg, ComplexMatrix2 u, int controlQubit, int targetQubit)
 additionally performs Rz on target to restore the global phase lost from u in QASM U(a,b,c) More...
 
void qasm_recordGate (Qureg qureg, TargetGate gate, int targetQubit)
 
void qasm_recordInitClassical (Qureg qureg, long long int stateInd)
 
void qasm_recordInitPlus (Qureg qureg)
 
void qasm_recordInitZero (Qureg qureg)
 
void qasm_recordMeasurement (Qureg qureg, int measureQubit)
 
void qasm_recordMultiControlledGate (Qureg qureg, TargetGate gate, int *controlQubits, int numControlQubits, int targetQubit)
 
void qasm_recordMultiControlledParamGate (Qureg qureg, TargetGate gate, int *controlQubits, int numControlQubits, int targetQubit, qreal param)
 
void qasm_recordMultiControlledUnitary (Qureg qureg, ComplexMatrix2 u, int *controlQubits, int numControlQubits, int targetQubit)
 additionally performs Rz on target to restore the global phase lost from u in QASM U(a,b,c) More...
 
void qasm_recordMultiStateControlledUnitary (Qureg qureg, ComplexMatrix2 u, int *controlQubits, int *controlState, int numControlQubits, int targetQubit)
 
void qasm_recordParamGate (Qureg qureg, TargetGate gate, int targetQubit, qreal param)
 
void qasm_recordUnitary (Qureg qureg, ComplexMatrix2 u, int targetQubit)
 
void qasm_setup (Qureg *qureg)
 
void qasm_startRecording (Qureg qureg)
 
void qasm_stopRecording (Qureg qureg)
 
int qasm_writeRecordedToFile (Qureg qureg, char *filename)
 returns success of file write More...
 

Variables

static const char * qasmGateLabels []
 

Detailed Description

Functions for generating QASM output from QuEST circuits

Author
Tyson Jones

Definition in file QuEST_qasm.c.

Macro Definition Documentation

◆ BUF_GROW_FAC

#define BUF_GROW_FAC   2

Definition at line 36 of file QuEST_qasm.c.

◆ BUF_INIT_SIZE

#define BUF_INIT_SIZE   1024

Definition at line 35 of file QuEST_qasm.c.

◆ COMMENT_PREF

#define COMMENT_PREF   "//"

Definition at line 32 of file QuEST_qasm.c.

◆ CTRL_LABEL_PREF

#define CTRL_LABEL_PREF   "c"

Definition at line 29 of file QuEST_qasm.c.

◆ INIT_ZERO_CMD

#define INIT_ZERO_CMD   "reset"

Definition at line 31 of file QuEST_qasm.c.

◆ MAX_LINE_LEN

#define MAX_LINE_LEN   1024

Definition at line 34 of file QuEST_qasm.c.

◆ MEASURE_CMD

#define MEASURE_CMD   "measure"

Definition at line 30 of file QuEST_qasm.c.

◆ MESREG_LABEL

#define MESREG_LABEL   "c"

Definition at line 28 of file QuEST_qasm.c.

◆ QUREG_LABEL

#define QUREG_LABEL   "q"

TODO.

  • allow user-set decimal precision (useful for when QASM is passed to a plotter)
  • sort out fixing global phase in controlledPhaseShift to controlledRotateZ plug
  • add functions to directly add comments to QASM by user
  • add abilitiy for user to directly add strings to QASM buffer??

Definition at line 27 of file QuEST_qasm.c.

Function Documentation

◆ addGateToQASM()

void addGateToQASM ( Qureg  qureg,
TargetGate  gate,
int *  controlQubits,
int  numControlQubits,
int  targetQubit,
qreal params,
int  numParams 
)

Definition at line 138 of file QuEST_qasm.c.

138  {
139 
140  int len = 0;
141  char line[MAX_LINE_LEN + 1]; // for trailing \0
142 
143  // add control labels
144  for (int i=0; i < numControlQubits; i++)
145  len += snprintf(line+len, MAX_LINE_LEN-len, "%s", CTRL_LABEL_PREF);
146 
147  // add target gate
148  len += snprintf(line+len, MAX_LINE_LEN-len, "%s", qasmGateLabels[gate]);
149 
150  // add parameters
151  if (numParams > 0) {
152  len += snprintf(line+len, MAX_LINE_LEN-len, "(");
153  for (int i=0; i < numParams; i++) {
154  len += snprintf(line+len, MAX_LINE_LEN-len, REAL_QASM_FORMAT, params[i]);
155  if (i != numParams - 1)
156  len += snprintf(line+len, MAX_LINE_LEN-len, ",");
157  }
158  len += snprintf(line+len, MAX_LINE_LEN-len, ")");
159  }
160 
161  // add space
162  len += snprintf(line+len, MAX_LINE_LEN-len, " ");
163 
164  // add control qubits
165  for (int i=0; i < numControlQubits; i++)
166  len += snprintf(line+len, MAX_LINE_LEN-len, "%s[%d],", QUREG_LABEL, controlQubits[i]);
167 
168  // add target qubit, colon and newline
169  len += snprintf(line+len, MAX_LINE_LEN-len, "%s[%d];\n", QUREG_LABEL, targetQubit);
170 
171  // check whether we overflowed buffer
172  if (len >= MAX_LINE_LEN)
173  bufferOverflow();
174 
175  addStringToQASM(qureg, line, len);
176 }

References addStringToQASM(), bufferOverflow(), CTRL_LABEL_PREF, MAX_LINE_LEN, qasmGateLabels, and QUREG_LABEL.

Referenced by qasm_recordAxisRotation(), qasm_recordCompactUnitary(), qasm_recordControlledAxisRotation(), qasm_recordControlledCompactUnitary(), qasm_recordControlledGate(), qasm_recordControlledParamGate(), qasm_recordControlledUnitary(), qasm_recordGate(), qasm_recordMultiControlledGate(), qasm_recordMultiControlledParamGate(), qasm_recordMultiControlledUnitary(), qasm_recordMultiStateControlledUnitary(), qasm_recordParamGate(), and qasm_recordUnitary().

◆ addStringToQASM()

void addStringToQASM ( Qureg  qureg,
char  line[],
int  lineLen 
)

Definition at line 92 of file QuEST_qasm.c.

92  {
93 
94  char* buf = qureg.qasmLog->buffer;
95  int bufSize = qureg.qasmLog->bufferSize;
96  int bufFill = qureg.qasmLog->bufferFill;
97 
98  // grow QASM buffer if necessary
99  if (lineLen + bufFill > bufSize) {
100 
101  int newBufSize = BUF_GROW_FAC * bufSize;
102  if (lineLen + bufFill > newBufSize)
103  bufferOverflow();
104 
105  char* newBuffer = malloc(newBufSize * sizeof *newBuffer);
106  sprintf(newBuffer, "%s", buf);
107  free(buf);
108 
109  qureg.qasmLog->bufferSize = newBufSize;
110  qureg.qasmLog->buffer = newBuffer;
111  bufSize = newBufSize;
112  buf = newBuffer;
113  }
114 
115  // add new str
116  int addedChars = snprintf(buf+bufFill, bufSize-bufFill, "%s", line);
117  qureg.qasmLog->bufferFill += addedChars;
118 }

References BUF_GROW_FAC, bufferOverflow(), and Qureg::qasmLog.

Referenced by addGateToQASM(), qasm_recordComment(), qasm_recordInitPlus(), qasm_recordInitZero(), and qasm_recordMeasurement().

◆ bufferOverflow()

void bufferOverflow ( void  )

Definition at line 55 of file QuEST_qasm.c.

55  {
56  printf("!!!\nINTERNAL ERROR: QASM line buffer filled!\n!!!");
57  exit(1);
58 }

Referenced by addGateToQASM(), addStringToQASM(), qasm_recordInitPlus(), qasm_recordInitZero(), qasm_recordMeasurement(), and qasm_setup().

◆ qasm_clearRecorded()

void qasm_clearRecorded ( Qureg  qureg)

Definition at line 477 of file QuEST_qasm.c.

477  {
478 
479  // maintains current buffer size
480  (qureg.qasmLog->buffer)[0] = '\0';
481  qureg.qasmLog->bufferFill = 0;
482 }

References Qureg::qasmLog.

Referenced by clearRecordedQASM().

◆ qasm_free()

void qasm_free ( Qureg  qureg)

Definition at line 500 of file QuEST_qasm.c.

500  {
501 
502  free(qureg.qasmLog->buffer);
503  free(qureg.qasmLog);
504 }

References Qureg::qasmLog.

Referenced by destroyQureg().

◆ qasm_printRecorded()

void qasm_printRecorded ( Qureg  qureg)

Definition at line 484 of file QuEST_qasm.c.

484  {
485  printf("%s", qureg.qasmLog->buffer);
486 }

References Qureg::qasmLog.

Referenced by printRecordedQASM().

◆ qasm_recordAxisRotation()

void qasm_recordAxisRotation ( Qureg  qureg,
qreal  angle,
Vector  axis,
int  targetQubit 
)

Definition at line 223 of file QuEST_qasm.c.

223  {
224 
225  if (!qureg.qasmLog->isLogging)
226  return;
227 
228  Complex alpha, beta;
229  getComplexPairFromRotation(angle, axis, &alpha, &beta);
230 
231  qreal rz2, ry, rz1;
232  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
233 
234  qreal params[3] = {rz2, ry, rz1};
235  addGateToQASM(qureg, GATE_UNITARY, NULL, 0, targetQubit, params, 3);
236 }

References addGateToQASM(), GATE_UNITARY, getComplexPairFromRotation(), getZYZRotAnglesFromComplexPair(), Qureg::qasmLog, and qreal.

Referenced by rotateAroundAxis().

◆ qasm_recordComment()

void qasm_recordComment ( Qureg  qureg,
char *  comment,
  ... 
)

Definition at line 120 of file QuEST_qasm.c.

120  {
121 
122  if (!qureg.qasmLog->isLogging)
123  return;
124 
125  // write formatted comment to buff
126  va_list argp;
127  va_start(argp, comment);
128  char buff[MAX_LINE_LEN - 4];
129  vsnprintf(buff, MAX_LINE_LEN-5, comment, argp);
130  va_end(argp);
131 
132  // add chars to buff, write to QASM logger
133  char line[MAX_LINE_LEN + 1]; // for trailing \0
134  int len = snprintf(line, MAX_LINE_LEN, "%s %s\n", COMMENT_PREF, buff);
135  addStringToQASM(qureg, line, len);
136 }

References addStringToQASM(), COMMENT_PREF, MAX_LINE_LEN, and Qureg::qasmLog.

Referenced by applyDiagonalOp(), applyExponentiatedPauliHamil(), applyMatrix2(), applyMatrix4(), applyMatrixN(), applyMultiControlledMatrixN(), applyPauliHamil(), applyPauliSum(), applyTrotterCircuit(), controlledMultiQubitUnitary(), controlledTwoQubitUnitary(), initBlankState(), initPureState(), initStateFromAmps(), mixDephasing(), mixDepolarising(), mixKrausMap(), mixMultiQubitKrausMap(), mixPauli(), mixTwoQubitDephasing(), mixTwoQubitDepolarising(), mixTwoQubitKrausMap(), multiControlledMultiQubitUnitary(), multiControlledTwoQubitUnitary(), multiQubitUnitary(), multiRotatePauli(), multiRotateZ(), qasm_recordControlledParamGate(), qasm_recordControlledUnitary(), qasm_recordInitClassical(), qasm_recordInitPlus(), qasm_recordMultiControlledParamGate(), qasm_recordMultiControlledUnitary(), qasm_recordMultiStateControlledUnitary(), setAmps(), setDensityAmps(), setWeightedQureg(), and twoQubitUnitary().

◆ qasm_recordCompactUnitary()

void qasm_recordCompactUnitary ( Qureg  qureg,
Complex  alpha,
Complex  beta,
int  targetQubit 
)

Definition at line 195 of file QuEST_qasm.c.

195  {
196 
197  if (!qureg.qasmLog->isLogging)
198  return;
199 
200  qreal rz2, ry, rz1;
201  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
202 
203  qreal params[3] = {rz2, ry, rz1};
204  addGateToQASM(qureg, GATE_UNITARY, NULL, 0, targetQubit, params, 3);
205 }

References addGateToQASM(), GATE_UNITARY, getZYZRotAnglesFromComplexPair(), Qureg::qasmLog, and qreal.

Referenced by compactUnitary().

◆ qasm_recordControlledAxisRotation()

void qasm_recordControlledAxisRotation ( Qureg  qureg,
qreal  angle,
Vector  axis,
int  controlQubit,
int  targetQubit 
)

Definition at line 300 of file QuEST_qasm.c.

300  {
301 
302  if (!qureg.qasmLog->isLogging)
303  return;
304 
305  Complex alpha, beta;
306  getComplexPairFromRotation(angle, axis, &alpha, &beta);
307 
308  qreal rz2, ry, rz1;
309  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
310 
311  int controls[1] = {controlQubit};
312  qreal params[3] = {rz2, ry, rz1};
313  addGateToQASM(qureg, GATE_UNITARY, controls, 1, targetQubit, params, 3);
314 }

References addGateToQASM(), GATE_UNITARY, getComplexPairFromRotation(), getZYZRotAnglesFromComplexPair(), Qureg::qasmLog, and qreal.

Referenced by controlledRotateAroundAxis().

◆ qasm_recordControlledCompactUnitary()

void qasm_recordControlledCompactUnitary ( Qureg  qureg,
Complex  alpha,
Complex  beta,
int  controlQubit,
int  targetQubit 
)

Definition at line 264 of file QuEST_qasm.c.

264  {
265 
266  if (!qureg.qasmLog->isLogging)
267  return;
268 
269  qreal rz2, ry, rz1;
270  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
271 
272  int controls[1] = {controlQubit};
273  qreal params[3] = {rz2, ry, rz1};
274  addGateToQASM(qureg, GATE_UNITARY, controls, 1, targetQubit, params, 3);
275 }

References addGateToQASM(), GATE_UNITARY, getZYZRotAnglesFromComplexPair(), Qureg::qasmLog, and qreal.

Referenced by controlledCompactUnitary().

◆ qasm_recordControlledGate()

void qasm_recordControlledGate ( Qureg  qureg,
TargetGate  gate,
int  controlQubit,
int  targetQubit 
)

Definition at line 238 of file QuEST_qasm.c.

238  {
239 
240  if (!qureg.qasmLog->isLogging)
241  return;
242 
243  int controls[1] = {controlQubit};
244  addGateToQASM(qureg, gate, controls, 1, targetQubit, 0, 0);
245 }

References addGateToQASM(), and Qureg::qasmLog.

Referenced by controlledNot(), controlledPauliY(), controlledPhaseFlip(), sqrtSwapGate(), and swapGate().

◆ qasm_recordControlledParamGate()

void qasm_recordControlledParamGate ( Qureg  qureg,
TargetGate  gate,
int  controlQubit,
int  targetQubit,
qreal  param 
)

Definition at line 247 of file QuEST_qasm.c.

247  {
248 
249  if (!qureg.qasmLog->isLogging)
250  return;
251 
252  int controls[1] = {controlQubit};
253  qreal params[1] = {param};
254  addGateToQASM(qureg, gate, controls, 1, targetQubit, params, 1);
255 
256  // correct the global phase of controlled phase shifts
257  if (gate == GATE_PHASE_SHIFT) {
258  qasm_recordComment(qureg, "Restoring the discarded global phase of the previous controlled phase gate");
259  qreal phaseFix[1] = {param/2.0};
260  addGateToQASM(qureg, GATE_ROTATE_Z, NULL, 0, targetQubit, phaseFix, 1);
261  }
262 }

References addGateToQASM(), GATE_PHASE_SHIFT, GATE_ROTATE_Z, qasm_recordComment(), Qureg::qasmLog, and qreal.

Referenced by controlledPhaseShift(), controlledRotateX(), controlledRotateY(), and controlledRotateZ().

◆ qasm_recordControlledUnitary()

void qasm_recordControlledUnitary ( Qureg  qureg,
ComplexMatrix2  u,
int  controlQubit,
int  targetQubit 
)

additionally performs Rz on target to restore the global phase lost from u in QASM U(a,b,c)

Definition at line 278 of file QuEST_qasm.c.

278  {
279 
280  if (!qureg.qasmLog->isLogging)
281  return;
282 
283  Complex alpha, beta;
284  qreal globalPhase;
285  getComplexPairAndPhaseFromUnitary(u, &alpha, &beta, &globalPhase);
286 
287  qreal rz2, ry, rz1;
288  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
289 
290  int controls[1] = {controlQubit};
291  qreal params[3] = {rz2, ry, rz1};
292  addGateToQASM(qureg, GATE_UNITARY, controls, 1, targetQubit, params, 3);
293 
294  // add Rz
295  qasm_recordComment(qureg, "Restoring the discarded global phase of the previous controlled unitary");
296  qreal phaseFix[1] = {globalPhase};
297  addGateToQASM(qureg, GATE_ROTATE_Z, NULL, 0, targetQubit, phaseFix, 1);
298 }

References addGateToQASM(), GATE_ROTATE_Z, GATE_UNITARY, getComplexPairAndPhaseFromUnitary(), getZYZRotAnglesFromComplexPair(), qasm_recordComment(), Qureg::qasmLog, and qreal.

Referenced by controlledUnitary().

◆ qasm_recordGate()

void qasm_recordGate ( Qureg  qureg,
TargetGate  gate,
int  targetQubit 
)

Definition at line 178 of file QuEST_qasm.c.

178  {
179 
180  if (!qureg.qasmLog->isLogging)
181  return;
182 
183  addGateToQASM(qureg, gate, NULL, 0, targetQubit, NULL, 0);
184 }

References addGateToQASM(), and Qureg::qasmLog.

Referenced by hadamard(), pauliX(), pauliY(), pauliZ(), qasm_recordInitClassical(), sGate(), and tGate().

◆ qasm_recordInitClassical()

void qasm_recordInitClassical ( Qureg  qureg,
long long int  stateInd 
)

Definition at line 458 of file QuEST_qasm.c.

458  {
459 
460  if (!qureg.qasmLog->isLogging)
461  return;
462 
463  // add an explanatory comment
464  char cmt[MAX_LINE_LEN+1];
465  sprintf(cmt, "Initialising state |%lld>", stateInd);
466  qasm_recordComment(qureg, cmt);
467 
468  // start in |0>
469  qasm_recordInitZero(qureg);
470 
471  // NOT the 1 bits in stateInd
472  for (int q=0; q < qureg.numQubitsRepresented; q++)
473  if ((stateInd >> q) & 1)
474  qasm_recordGate(qureg, GATE_SIGMA_X, q);
475 }

References GATE_SIGMA_X, MAX_LINE_LEN, Qureg::numQubitsRepresented, qasm_recordComment(), qasm_recordGate(), qasm_recordInitZero(), and Qureg::qasmLog.

Referenced by initClassicalState().

◆ qasm_recordInitPlus()

void qasm_recordInitPlus ( Qureg  qureg)

Definition at line 430 of file QuEST_qasm.c.

430  {
431 
432  if (!qureg.qasmLog->isLogging)
433  return;
434 
435  // add an explanatory comment
436  char buf[MAX_LINE_LEN+1];
437  sprintf(buf, "Initialising state |+>");
438  qasm_recordComment(qureg, buf);
439 
440  // it's valid QASM to h the register (I think)
441  // |+> = H |0>
442  qasm_recordInitZero(qureg);
443  int charsWritten = snprintf(
444  buf, MAX_LINE_LEN, "%s %s;\n",
446  if (charsWritten >= MAX_LINE_LEN)
447  bufferOverflow();
448  addStringToQASM(qureg, buf, charsWritten);
449 
450  // old code (before above QASM shortcut)
451  /*
452  qasm_recordInitZero(qureg);
453  for (int q=0; q < qureg.numQubitsRepresented; q++)
454  qasm_recordGate(qureg, GATE_HADAMARD, q);
455  */
456 }

References addStringToQASM(), bufferOverflow(), GATE_HADAMARD, MAX_LINE_LEN, qasm_recordComment(), qasm_recordInitZero(), qasmGateLabels, Qureg::qasmLog, and QUREG_LABEL.

Referenced by initPlusState().

◆ qasm_recordInitZero()

void qasm_recordInitZero ( Qureg  qureg)

Definition at line 415 of file QuEST_qasm.c.

415  {
416 
417  if (!qureg.qasmLog->isLogging)
418  return;
419 
420  char line[MAX_LINE_LEN + 1]; // for trailing \0
421  int len = snprintf(line, MAX_LINE_LEN, "%s %s;\n", INIT_ZERO_CMD, QUREG_LABEL);
422 
423  // check whether we overflowed buffer
424  if (len >= MAX_LINE_LEN)
425  bufferOverflow();
426 
427  addStringToQASM(qureg, line, len);
428 }

References addStringToQASM(), bufferOverflow(), INIT_ZERO_CMD, MAX_LINE_LEN, Qureg::qasmLog, and QUREG_LABEL.

Referenced by initZeroState(), qasm_recordInitClassical(), and qasm_recordInitPlus().

◆ qasm_recordMeasurement()

void qasm_recordMeasurement ( Qureg  qureg,
int  measureQubit 
)

Definition at line 398 of file QuEST_qasm.c.

398  {
399 
400  if (!qureg.qasmLog->isLogging)
401  return;
402 
403  char line[MAX_LINE_LEN + 1]; // for trailing \0
404  int len = snprintf(
405  line, MAX_LINE_LEN, "%s %s[%d] -> %s[%d];\n",
406  MEASURE_CMD, QUREG_LABEL, measureQubit, MESREG_LABEL, measureQubit);
407 
408  // check whether we overflowed buffer
409  if (len >= MAX_LINE_LEN)
410  bufferOverflow();
411 
412  addStringToQASM(qureg, line, len);
413 }

References addStringToQASM(), bufferOverflow(), MAX_LINE_LEN, MEASURE_CMD, MESREG_LABEL, Qureg::qasmLog, and QUREG_LABEL.

Referenced by collapseToOutcome(), measure(), and measureWithStats().

◆ qasm_recordMultiControlledGate()

void qasm_recordMultiControlledGate ( Qureg  qureg,
TargetGate  gate,
int *  controlQubits,
int  numControlQubits,
int  targetQubit 
)

Definition at line 316 of file QuEST_qasm.c.

316  {
317 
318  if (!qureg.qasmLog->isLogging)
319  return;
320 
321  addGateToQASM(qureg, gate, controlQubits, numControlQubits, targetQubit, NULL, 0);
322 }

References addGateToQASM(), and Qureg::qasmLog.

Referenced by multiControlledPhaseFlip().

◆ qasm_recordMultiControlledParamGate()

void qasm_recordMultiControlledParamGate ( Qureg  qureg,
TargetGate  gate,
int *  controlQubits,
int  numControlQubits,
int  targetQubit,
qreal  param 
)

Definition at line 324 of file QuEST_qasm.c.

324  {
325 
326  if (!qureg.qasmLog->isLogging)
327  return;
328 
329  qreal params[1] = {param};
330  addGateToQASM(qureg, gate, controlQubits, numControlQubits, targetQubit, params, 1);
331 
332  // correct the global phase of controlled phase shifts
333  if (gate == GATE_PHASE_SHIFT) {
334  qasm_recordComment(qureg, "Restoring the discarded global phase of the previous multicontrolled phase gate");
335  qreal phaseFix[1] = {param/2.0};
336  addGateToQASM(qureg, GATE_ROTATE_Z, NULL, 0, targetQubit, phaseFix, 1);
337  }
338 }

References addGateToQASM(), GATE_PHASE_SHIFT, GATE_ROTATE_Z, qasm_recordComment(), Qureg::qasmLog, and qreal.

Referenced by multiControlledPhaseShift().

◆ qasm_recordMultiControlledUnitary()

void qasm_recordMultiControlledUnitary ( Qureg  qureg,
ComplexMatrix2  u,
int *  controlQubits,
int  numControlQubits,
int  targetQubit 
)

additionally performs Rz on target to restore the global phase lost from u in QASM U(a,b,c)

Definition at line 341 of file QuEST_qasm.c.

341  {
342 
343  if (!qureg.qasmLog->isLogging)
344  return;
345 
346  Complex alpha, beta;
347  qreal globalPhase;
348  getComplexPairAndPhaseFromUnitary(u, &alpha, &beta, &globalPhase);
349 
350  qreal rz2, ry, rz1;
351  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
352 
353  qreal params[3] = {rz2, ry, rz1};
354  addGateToQASM(qureg, GATE_UNITARY, controlQubits, numControlQubits, targetQubit, params, 3);
355 
356  // add Rz
357  qasm_recordComment(qureg, "Restoring the discarded global phase of the previous multicontrolled unitary");
358  qreal phaseFix[1] = {globalPhase};
359  addGateToQASM(qureg, GATE_ROTATE_Z, NULL, 0, targetQubit, phaseFix, 1);
360 }

References addGateToQASM(), GATE_ROTATE_Z, GATE_UNITARY, getComplexPairAndPhaseFromUnitary(), getZYZRotAnglesFromComplexPair(), qasm_recordComment(), Qureg::qasmLog, and qreal.

Referenced by multiControlledUnitary(), and qasm_recordMultiStateControlledUnitary().

◆ qasm_recordMultiStateControlledUnitary()

void qasm_recordMultiStateControlledUnitary ( Qureg  qureg,
ComplexMatrix2  u,
int *  controlQubits,
int *  controlState,
int  numControlQubits,
int  targetQubit 
)

Definition at line 362 of file QuEST_qasm.c.

364  {
365  if (!qureg.qasmLog->isLogging)
366  return;
367 
368  qasm_recordComment(qureg, "NOTing some gates so that the subsequent unitary is controlled-on-0");
369  for (int i=0; i < numControlQubits; i++)
370  if (controlState[i] == 0)
371  addGateToQASM(qureg, GATE_SIGMA_X, NULL, 0, controlQubits[i], NULL, 0);
372 
373  qasm_recordMultiControlledUnitary(qureg, u, controlQubits, numControlQubits, targetQubit);
374 
375  qasm_recordComment(qureg, "Undoing the NOTing of the controlled-on-0 qubits of the previous unitary");
376  for (int i=0; i < numControlQubits; i++)
377  if (controlState[i] == 0)
378  addGateToQASM(qureg, GATE_SIGMA_X, NULL, 0, controlQubits[i], NULL, 0);
379 }

References addGateToQASM(), GATE_SIGMA_X, qasm_recordComment(), qasm_recordMultiControlledUnitary(), and Qureg::qasmLog.

Referenced by multiStateControlledUnitary().

◆ qasm_recordParamGate()

void qasm_recordParamGate ( Qureg  qureg,
TargetGate  gate,
int  targetQubit,
qreal  param 
)

Definition at line 186 of file QuEST_qasm.c.

186  {
187 
188  if (!qureg.qasmLog->isLogging)
189  return;
190 
191  qreal params[1] = {param};
192  addGateToQASM(qureg, gate, NULL, 0, targetQubit, params, 1);
193 }

References addGateToQASM(), Qureg::qasmLog, and qreal.

Referenced by phaseShift(), rotateX(), rotateY(), and rotateZ().

◆ qasm_recordUnitary()

void qasm_recordUnitary ( Qureg  qureg,
ComplexMatrix2  u,
int  targetQubit 
)

Definition at line 207 of file QuEST_qasm.c.

207  {
208 
209  if (!qureg.qasmLog->isLogging)
210  return;
211 
212  Complex alpha, beta;
213  qreal discardedGlobalPhase;
214  getComplexPairAndPhaseFromUnitary(u, &alpha, &beta, &discardedGlobalPhase);
215 
216  qreal rz2, ry, rz1;
217  getZYZRotAnglesFromComplexPair(alpha, beta, &rz2, &ry, &rz1);
218 
219  qreal params[3] = {rz2, ry, rz1};
220  addGateToQASM(qureg, GATE_UNITARY, NULL, 0, targetQubit, params, 3);
221 }

References addGateToQASM(), GATE_UNITARY, getComplexPairAndPhaseFromUnitary(), getZYZRotAnglesFromComplexPair(), Qureg::qasmLog, and qreal.

Referenced by unitary().

◆ qasm_setup()

void qasm_setup ( Qureg qureg)

Definition at line 60 of file QuEST_qasm.c.

60  {
61 
62  // populate and attach QASM logger
63  QASMLogger *qasmLog = malloc(sizeof *qasmLog);
64  qureg->qasmLog = qasmLog;
65  if (qasmLog == NULL)
67 
68  qasmLog->isLogging = 0;
69  qasmLog->bufferSize = BUF_INIT_SIZE;
70  qasmLog->buffer = malloc(qasmLog->bufferSize * sizeof *(qasmLog->buffer));
71  if (qasmLog->buffer == NULL)
73 
74  // add headers and quantum / classical register creation
75  qasmLog->bufferFill = snprintf(
76  qasmLog->buffer, qasmLog->bufferSize,
77  "OPENQASM 2.0;\nqreg %s[%d];\ncreg %s[%d];\n",
80  if (qasmLog->bufferFill >= qasmLog->bufferSize)
82 }

References BUF_INIT_SIZE, bufferOverflow(), MESREG_LABEL, Qureg::numQubitsRepresented, Qureg::qasmLog, and QUREG_LABEL.

Referenced by createCloneQureg(), createDensityQureg(), and createQureg().

◆ qasm_startRecording()

void qasm_startRecording ( Qureg  qureg)

Definition at line 84 of file QuEST_qasm.c.

84  {
85  qureg.qasmLog->isLogging = 1;
86 }

References Qureg::qasmLog.

Referenced by startRecordingQASM().

◆ qasm_stopRecording()

void qasm_stopRecording ( Qureg  qureg)

Definition at line 88 of file QuEST_qasm.c.

88  {
89  qureg.qasmLog->isLogging = 0;
90 }

References Qureg::qasmLog.

Referenced by stopRecordingQASM().

◆ qasm_writeRecordedToFile()

int qasm_writeRecordedToFile ( Qureg  qureg,
char *  filename 
)

returns success of file write

Definition at line 489 of file QuEST_qasm.c.

489  {
490 
491  FILE *file = fopen(filename, "w");
492  if (file == NULL)
493  return 0;
494 
495  fprintf(file, "%s", qureg.qasmLog->buffer);
496  fclose(file);
497  return 1;
498 }

References Qureg::qasmLog.

Referenced by writeRecordedQASMToFile().

Variable Documentation

◆ qasmGateLabels

const char* qasmGateLabels[]
static
Initial value:
= {
[GATE_SIGMA_X] = "x",
[GATE_SIGMA_Y] = "y",
[GATE_SIGMA_Z] = "z",
[GATE_T] = "t",
[GATE_S] = "s",
[GATE_HADAMARD] = "h",
[GATE_ROTATE_X] = "Rx",
[GATE_ROTATE_Y] = "Ry",
[GATE_ROTATE_Z] = "Rz",
[GATE_UNITARY] = "U",
[GATE_PHASE_SHIFT] = "Rz",
[GATE_SWAP] = "swap",
[GATE_SQRT_SWAP] = "sqrtswap"
}

Definition at line 38 of file QuEST_qasm.c.

Referenced by addGateToQASM(), and qasm_recordInitPlus().

#define MEASURE_CMD
Definition: QuEST_qasm.c:30
#define MAX_LINE_LEN
Definition: QuEST_qasm.c:34
#define MESREG_LABEL
Definition: QuEST_qasm.c:28
@ GATE_T
Definition: QuEST_qasm.h:24
@ GATE_PHASE_SHIFT
Definition: QuEST_qasm.h:32
void qasm_recordInitZero(Qureg qureg)
Definition: QuEST_qasm.c:415
@ GATE_ROTATE_X
Definition: QuEST_qasm.h:27
@ GATE_ROTATE_Z
Definition: QuEST_qasm.h:29
@ GATE_SIGMA_Z
Definition: QuEST_qasm.h:23
@ GATE_HADAMARD
Definition: QuEST_qasm.h:26
void getComplexPairFromRotation(qreal angle, Vector axis, Complex *alpha, Complex *beta)
Definition: QuEST_common.c:114
#define qreal
@ GATE_SQRT_SWAP
Definition: QuEST_qasm.h:34
@ GATE_SIGMA_X
Definition: QuEST_qasm.h:21
#define INIT_ZERO_CMD
Definition: QuEST_qasm.c:31
@ GATE_UNITARY
Definition: QuEST_qasm.h:31
static const char * qasmGateLabels[]
Definition: QuEST_qasm.c:38
void qasm_recordComment(Qureg qureg, char *comment,...)
Definition: QuEST_qasm.c:120
QASMLogger * qasmLog
Storage for generated QASM output.
Definition: QuEST.h:232
void bufferOverflow(void)
Definition: QuEST_qasm.c:55
void addStringToQASM(Qureg qureg, char line[], int lineLen)
Definition: QuEST_qasm.c:92
#define QUREG_LABEL
TODO.
Definition: QuEST_qasm.c:27
#define COMMENT_PREF
Definition: QuEST_qasm.c:32
void qasm_recordMultiControlledUnitary(Qureg qureg, ComplexMatrix2 u, int *controlQubits, int numControlQubits, int targetQubit)
additionally performs Rz on target to restore the global phase lost from u in QASM U(a,...
Definition: QuEST_qasm.c:341
#define BUF_INIT_SIZE
Definition: QuEST_qasm.c:35
void getZYZRotAnglesFromComplexPair(Complex alpha, Complex beta, qreal *rz2, qreal *ry, qreal *rz1)
maps U(alpha, beta) to Rz(rz2) Ry(ry) Rz(rz1)
Definition: QuEST_common.c:124
#define CTRL_LABEL_PREF
Definition: QuEST_qasm.c:29
void addGateToQASM(Qureg qureg, TargetGate gate, int *controlQubits, int numControlQubits, int targetQubit, qreal *params, int numParams)
Definition: QuEST_qasm.c:138
#define BUF_GROW_FAC
Definition: QuEST_qasm.c:36
int numQubitsRepresented
The number of qubits represented in either the state-vector or density matrix.
Definition: QuEST.h:208
@ GATE_S
Definition: QuEST_qasm.h:25
@ GATE_SWAP
Definition: QuEST_qasm.h:33
@ GATE_SIGMA_Y
Definition: QuEST_qasm.h:22
Represents one complex number.
Definition: QuEST.h:103
void qasm_recordGate(Qureg qureg, TargetGate gate, int targetQubit)
Definition: QuEST_qasm.c:178
@ GATE_ROTATE_Y
Definition: QuEST_qasm.h:28
void getComplexPairAndPhaseFromUnitary(ComplexMatrix2 u, Complex *alpha, Complex *beta, qreal *globalPhase)
maps U(r0c0, r0c1, r1c0, r1c1) to exp(i globalPhase) U(alpha, beta)
Definition: QuEST_common.c:136