Skip to content

Commit 7910db3

Browse files
authored
Merge pull request #10 from EPCCed/analog-update
Analog module update
2 parents 1789174 + 7395a4b commit 7910db3

24 files changed

+750
-583
lines changed

examples/analog/qaa.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@
1818
#include <stdio.h>
1919
#include <unistd.h>
2020

21+
#define CQ_ADDR_GLOBAL 0
22+
#define CQ_ADDR_LOCAL 1
23+
2124
cq_status quantum_adiabatic_algo(const size_t NQUBITS, qubit *qr, cstate * cr, qkern_map * reg)
2225
{
2326
CQ_REGISTER_KERNEL(reg);
2427
set_qureg(qr, 0, NQUBITS);
2528

2629
int qreg_id = 0;
27-
HANDLE_CQ_ERROR(cq_enable_analog_qreg(qreg_id, NQUBITS));
30+
HANDLE_CQ_ERROR(cq_enable_analog_qreg(qr));
2831
channel ch0 = {0};
29-
HANDLE_CQ_ERROR(cq_get_global_channel(&ch0, 0, qreg_id));
32+
HANDLE_CQ_ERROR(cq_get_channel(&ch0, CQ_ADDR_GLOBAL, qr, NULL));
3033

3134
pulse pulse = {0};
3235
double duration = 4000.0;
@@ -42,23 +45,23 @@ cq_status quantum_adiabatic_algo(const size_t NQUBITS, qubit *qr, cstate * cr, q
4245

4346
HANDLE_CQ_ERROR(cq_interpolated_wf(pulse.detuning, duration, data_points, num_points));
4447

45-
qpos positions[5] = {
46-
{ 5.53855359, 1.7891413 , 0.0},
47-
{ 5.48899179, -6.27296412, 0.0},
48-
{-1.43242244, -2.26122822, 0.0},
49-
{ 1.62594084, 10.99193777, 0.0},
50-
{15.4687696 , 2.96846731, 0.0}};
48+
double positions[15] = {
49+
5.53855359, 1.7891413 , 0.0,
50+
5.48899179, -6.27296412, 0.0,
51+
-1.43242244, -2.26122822, 0.0,
52+
1.62594084, 10.99193777, 0.0,
53+
15.4687696 , 2.96846731, 0.0
54+
};
5155

52-
HANDLE_CQ_ERROR(cq_update_qreg_pos(positions, NQUBITS, qreg_id));
56+
HANDLE_CQ_ERROR(cq_set_qubit_pos(positions, qr));
5357
HANDLE_CQ_ERROR(cq_play(&ch0, &pulse));
5458

5559
measure_qureg(qr, NQUBITS, cr);
56-
HANDLE_CQ_ERROR(cq_disable_analog_qreg(qreg_id));
60+
HANDLE_CQ_ERROR(cq_free_pulse(&pulse));
61+
HANDLE_CQ_ERROR(cq_disable_analog_qreg(qr));
5762
return CQ_SUCCESS;
5863
};
5964

60-
#undef HANDLE_CQ_ERROR
61-
6265
int main (void)
6366
{
6467
const size_t NQUBITS = 5;
@@ -69,7 +72,7 @@ int main (void)
6972

7073
cq_init(0);
7174

72-
cq_enable_analog_mode(RYDBERG);
75+
cq_enable_analog_mode(ISING);
7376
qubit * qr = NULL;
7477
alloc_qureg(&qr, NQUBITS);
7578

include/analog.h

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,61 +14,49 @@
1414
#include <stddef.h>
1515

1616
typedef enum device_mode {
17-
RYDBERG,
17+
ISING,
1818
XY
1919
} device_mode;
2020

21-
typedef struct qpos {
22-
double x;
23-
double y;
24-
double z;
25-
} qpos;
26-
2721
typedef struct channel {
2822
int id;
2923
int type;
30-
int target;
24+
ptrdiff_t target;
3125
double time;
3226
void* params;
3327
} channel;
3428

3529
#define __CQ_ANALOG_MAX_NUM_SAMPLES__ 4096
3630
typedef struct pulse {
37-
double freq[__CQ_ANALOG_MAX_NUM_SAMPLES__];
38-
double phase[__CQ_ANALOG_MAX_NUM_SAMPLES__];
39-
double detuning[__CQ_ANALOG_MAX_NUM_SAMPLES__];
31+
double *freq;
32+
double *phase;
33+
double *detuning;
34+
4035
double duration;
4136
ptrdiff_t num_samples;
4237
} pulse;
4338

44-
cq_status cq_print_analog_device(void);
45-
cq_status cq_print_avail_channels(void);
46-
cq_status cq_print_channel(channel *ch);
47-
cq_status cq_print_qpos(int qreg_id);
48-
// TODO: cq_status cq_retarget_channel(channel *ch, int new_target);
49-
ptrdiff_t cq_duration_to_samples(double duration);
50-
double cq_samples_to_duration(ptrdiff_t num_samples);
51-
52-
cq_status cq_enable_analog_mode(device_mode mode);
53-
cq_status cq_enable_analog_qreg(int qreg_id, int num_qubits);
54-
cq_status cq_disable_analog_qreg(int qreg_id);
55-
cq_status cq_get_global_channel(channel *ch, int type, int qreg_id);
56-
cq_status cq_get_local_channel(channel *ch, int type, int target, int qreg_id);
39+
cq_status cq_enable_analog_mode(int mode);
40+
cq_status cq_enable_analog_qreg(qubit *qr);
41+
cq_status cq_disable_analog_qreg(qubit *qr);
5742

58-
cq_status cq_update_qreg_pos(const qpos *new_positions, int num_qubits, int qreg_id);
43+
cq_status cq_get_channel(channel *ch, int type, qubit *qr, qubit *target);
44+
cq_status cq_retarget_channel(channel *ch, qubit *new_target);
45+
cq_status cq_set_qubit_pos(const double *new_positions, qubit *qr);
5946

6047
cq_status cq_init_pulse(pulse *pulse, double duration);
48+
cq_status cq_free_pulse(pulse *pulse);
49+
6150
cq_status cq_play(channel *ch, pulse *pulse);
6251
cq_status cq_capture(channel *ch, pulse *pulse, int *result, int shots);
6352
cq_status cq_delay(channel *ch, double dt);
6453
cq_status cq_barrier(channel **ch, int num_channels);
6554

55+
// =============================== Waveforms ==================================
6656
cq_status cq_gaussian_wf(double *samples, double duration, double amp, double sigma);
67-
6857
// TODO: consider removing as it has limited applicability
6958
cq_status cq_gaussian_sqr_wf(double *samples, double duration, double amp,
7059
double sigma, double width);
71-
7260
cq_status cq_interpolated_wf(double *samples, double duration,
7361
double *points, int num_points);
7462
cq_status cq_sech_wf(double *samples, double duration, double amp, double sigma);
@@ -84,4 +72,22 @@ cq_status cq_composite_wf(double *samples, double **waveforms,
8472
ptrdiff_t *num_samples, int num_waveforms,
8573
ptrdiff_t *total_num_samples);
8674

75+
// =============================== Helpers ====================================
76+
cq_status cq_print_analog_device(void);
77+
cq_status cq_print_avail_channels(void);
78+
cq_status cq_print_channel(channel *ch);
79+
cq_status cq_print_qpos(qubit *qr);
80+
81+
ptrdiff_t cq_duration_to_samples(double duration);
82+
double cq_samples_to_duration(ptrdiff_t num_samples);
83+
84+
cq_status cq_set_device_sample_rate(double rate);
85+
cq_status cq_set_device_min_pulse_duration(double duration);
86+
cq_status cq_set_device_max_pulse_duration(double duration);
87+
cq_status cq_set_device_interaction_coeff(double coeff);
88+
cq_status cq_set_device_min_qubit_dist(double distance);
89+
cq_status cq_set_device_max_num_shots(int shots);
90+
cq_status cq_set_device_coupling_func(double(*coupler)(double *q0, double *q1));
91+
8792
#endif
93+

0 commit comments

Comments
 (0)