QkQuantumRegister
typedef struct QkQuantumRegister QkQuantumRegisterA common way to instantiate several bits at once is to create a register. A register is a named collection of bits. Creating a register enables giving a collection of bits a name which can be use as metadata around specific bits in a circuit. This name will also typically be preseserved when exporting the circuit to interchange languages.
You can create a register by calling qk_quantum_register_new(), for example:
#include <qiskit.h>
QkQuantumRegister *qreg = qk_quantum_register_new(5, "my_qreg");Which creates a new 5 qubit register named "my_qreg".
Then to add the register to a circuit you use the qk_circuit_add_quantum_register() function:
QkCircuit *qc = qk_circuit_new(0, 0);
qk_circuit_add_quantum_register(qc, qreg);
uint32_t num_qubits = qk_circuit_num_qubits(qc); // 5While circuits track registers, the registers themselves impart almost no behavioral differences on circuits.
Functions
qk_quantum_register_new
QkQuantumRegister *qk_quantum_register_new(uint32_t num_qubits, const char *name)
Construct a new owning quantum register with a given number of qubits and name
Example
QkQuantumRegister *qr = qk_quantum_register_new(5, "five_qubits");Safety
The name parameter must be a pointer to memory that contains a valid nul terminator at the end of the string. It also must be valid for reads of bytes up to and including the nul terminator.
Parameters
- num_qubits – The number of qubits to create the register for
- name – The name string for the created register. The name must be comprised of valid UTF-8 characters.
Returns
A pointer to the created register
qk_quantum_register_free
void qk_quantum_register_free(QkQuantumRegister *reg)
Free a quantum register.
Example
QkQuantumRegister *qr = qk_quantum_register_new(1024, "qreg");
qk_quantum_register_free(qr);Safety
Behavior is undefined if reg is not either null or a valid pointer to a QkQuantumRegister.
Parameters
- reg – A pointer to the register to free.
qk_quantum_register_name
char *qk_quantum_register_name(const QkQuantumRegister *qreg)
Get the name of a quantum register.
Returns a newly allocated C string containing the name of the quantum register.
Example
QkQuantumRegister *qr = qk_quantum_register_new(5, "my_qreg");
char *name = qk_quantum_register_name(qr);
printf("Register name: %s\n", name);
qk_str_free(name);
qk_quantum_register_free(qr);Safety
Behavior is undefined if qreg is not a valid, non-null pointer to a QkQuantumRegister.
Parameters
- qreg – A pointer to the quantum register.
Returns
A pointer to a newly allocated null-terminated string containing the register name. The caller must free this string using qk_str_free.
qk_quantum_register_num_bits
size_t qk_quantum_register_num_bits(const QkQuantumRegister *qreg)
Get the number of bits in a quantum register.
Returns the size (number of bits) of the quantum register.
Example
QkQuantumRegister *qr = qk_quantum_register_new(5, "my_qreg");
size_t num_qubits = qk_quantum_register_num_bits(qr);
printf("Number of qubits: %zu\n", num_qubits); // Prints: 5
qk_quantum_register_free(qr);Safety
Behavior is undefined if qreg is not a valid, non-null pointer to a QkQuantumRegister.
Parameters
- qreg – A pointer to the quantum register.
Returns
The number of bits in the register.
qk_quantum_register_circuit_bits
void qk_quantum_register_circuit_bits(const QkQuantumRegister *qreg, const QkCircuit *circuit, uint32_t *out_bits)
Get the circuit bit indices for all qubits in a quantum register.
Outputs a mapping from each qubit in the quantum register to its corresponding index in the circuit’s qubit list. If a qubit from the register is not present in the circuit, its index in the mapping will be UINT32_MAX.
Example
QkCircuit *qc = qk_circuit_new(2, 0);
QkQuantumRegister *qr = qk_quantum_register_new(3, "my_qreg");
qk_circuit_add_quantum_register(qc, qr);
uint32_t bit_indices[3];
qk_quantum_register_circuit_bits(qr, qc, bit_indices);
// bit_indices now contains [2, 3, 4] since all qubits are in the circuit
// and the circuit has 2 anonymous qubits
qk_quantum_register_free(qr);
qk_circuit_free(qc);Safety
Behavior is undefined if:
qregis not a valid, non-null pointer to aQkQuantumRegister.circuitis not a valid, non-null pointer to aQkCircuit.qreghas one or more bits andout_bitsis not an aligned, non-null pointer to an array with at leastqk_quantum_register_num_bits(qreg)elements.
Parameters
- qreg – A pointer to the quantum register to map.
- circuit – A pointer to the circuit containing the qubits.
- out_bits – A pointer to an array where the mapped indices will be written. The array must be pre-allocated with at least
qk_quantum_register_num_bitselements forqreg. Each element will contain either the circuit bit index orUINT32_MAXif the qubit is not in the circuit.