Skip to content

Commit df3a1b6

Browse files
committed
Added test and supporting data for generator.
1 parent 5284c18 commit df3a1b6

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

test/generator_data.pickle

55.7 KB
Binary file not shown.

test/test_generator.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
""" Testing module for the generator and devices classes"""
2+
3+
import pickle
4+
import numpy as np
5+
from c3.generator.devices import LO, AWG, Mixer, Response, Digital_to_Analog, Volts_to_Hertz
6+
from c3.generator.generator import Generator
7+
from c3.signal.gates import Instruction
8+
from c3.signal.pulse import Envelope, Carrier
9+
from c3.c3objs import Quantity
10+
import c3.libraries.envelopes as env_lib
11+
12+
sim_res = 100e9 # Resolution for numerical simulation
13+
awg_res = 2e9 # Realistic, limited resolution of an AWG
14+
lo = LO(name='lo', resolution=sim_res)
15+
awg = AWG(name='awg', resolution=awg_res)
16+
mixer = Mixer(name='mixer')
17+
18+
resp = Response(
19+
name='resp',
20+
rise_time=Quantity(
21+
value=0.3e-9,
22+
min=0.05e-9,
23+
max=0.6e-9,
24+
unit='s'
25+
),
26+
resolution=sim_res
27+
)
28+
29+
dig_to_an = Digital_to_Analog(
30+
name="dac",
31+
resolution=sim_res
32+
)
33+
34+
v2hz = 1e9
35+
v_to_hz = Volts_to_Hertz(
36+
name='v_to_hz',
37+
V_to_Hz=Quantity(
38+
value=v2hz,
39+
min=0.9e9,
40+
max=1.1e9,
41+
unit='Hz 2pi/V'
42+
)
43+
)
44+
45+
generator = Generator([lo, awg, mixer, v_to_hz, dig_to_an, resp])
46+
47+
t_final = 7e-9 # Time for single qubit gates
48+
sideband = 50e6 * 2 * np.pi
49+
gauss_params_single = {
50+
'amp': Quantity(
51+
value=0.5,
52+
min=0.4,
53+
max=0.6,
54+
unit="V"
55+
),
56+
't_final': Quantity(
57+
value=t_final,
58+
min=0.5 * t_final,
59+
max=1.5 * t_final,
60+
unit="s"
61+
),
62+
'sigma': Quantity(
63+
value=t_final / 4,
64+
min=t_final / 8,
65+
max=t_final / 2,
66+
unit="s"
67+
),
68+
'xy_angle': Quantity(
69+
value=0.0,
70+
min=-0.5 * np.pi,
71+
max=2.5 * np.pi,
72+
unit='rad'
73+
),
74+
'freq_offset': Quantity(
75+
value=-sideband - 3e6 * 2 * np.pi,
76+
min=-56 * 1e6 * 2 * np.pi,
77+
max=-52 * 1e6 * 2 * np.pi,
78+
unit='Hz 2pi'
79+
),
80+
'delta': Quantity(
81+
value=-1,
82+
min=-5,
83+
max=3,
84+
unit=""
85+
)
86+
}
87+
gauss_env_single = Envelope(
88+
name="gauss",
89+
desc="Gaussian comp for single-qubit gates",
90+
params=gauss_params_single,
91+
shape=env_lib.gaussian_nonorm
92+
)
93+
94+
95+
lo_freq_q1 = 5e9 * 2 * np.pi + sideband
96+
carrier_parameters = {
97+
'freq': Quantity(
98+
value=lo_freq_q1,
99+
min=4.5e9 * 2 * np.pi,
100+
max=6e9 * 2 * np.pi,
101+
unit='Hz 2pi'
102+
),
103+
'framechange': Quantity(
104+
value=0.0,
105+
min= -np.pi,
106+
max= 3 * np.pi,
107+
unit='rad'
108+
)
109+
}
110+
carr = Carrier(
111+
name="carrier",
112+
desc="Frequency of the local oscillator",
113+
params=carrier_parameters
114+
)
115+
116+
X90p_q1 = Instruction(
117+
name="X90p",
118+
t_start=0.0,
119+
t_end=t_final,
120+
channels=["d1"]
121+
)
122+
X90p_q1.add_component(gauss_env_single, "d1")
123+
X90p_q1.add_component(carr, "d1")
124+
125+
tstart = X90p_q1.t_start
126+
tend = X90p_q1.t_end
127+
chan = "d1"
128+
129+
with open("test/generator_data.pickle", "rb") as filename:
130+
data = pickle.load(filename)
131+
132+
133+
def test_LO() -> None:
134+
lo_sig = lo.create_signal(X90p_q1.comps["d1"], tstart, tend)[0]
135+
assert (lo_sig["values"][0].numpy() == data["lo_sig"]["values"][0].numpy()).all()
136+
assert (lo_sig["values"][1].numpy() == data["lo_sig"]["values"][1].numpy()).all()
137+
assert (lo_sig["ts"].numpy() == data["lo_sig"]["ts"].numpy()).all()
138+
139+
140+
def test_AWG() -> None:
141+
awg_sig = awg.create_IQ("d1", X90p_q1.comps["d1"], tstart, tend)
142+
assert (awg_sig["inphase"].numpy() == data["awg_sig"]["inphase"].numpy()).all()
143+
assert (awg_sig["quadrature"].numpy() == data["awg_sig"]["quadrature"].numpy()).all()
144+
145+
146+
def test_DAC() -> None:
147+
dac_sig = dig_to_an.resample(data["awg_sig"], tstart, tend)
148+
assert (dac_sig["inphase"].numpy() == data["dig_to_an_sig"]["inphase"].numpy()).all()
149+
assert (dac_sig["quadrature"].numpy() == data["dig_to_an_sig"]["quadrature"].numpy()).all()
150+
151+
152+
def test_Response() -> None:
153+
resp_sig = resp.process(data["dig_to_an_sig"])
154+
assert (resp_sig["inphase"].numpy() == data["resp_sig"]["inphase"].numpy()).all()
155+
assert (resp_sig["quadrature"].numpy() == data["resp_sig"]["quadrature"].numpy()).all()
156+
157+
158+
def test_mixer() -> None:
159+
mixed_sig = mixer.combine(data["lo_sig"], data["resp_sig"])
160+
assert (mixed_sig.numpy() == data["mixer_sig"].numpy()).all()
161+
162+
163+
def test_v2hz() -> None:
164+
final_sig = v_to_hz.transform(data["mixer_sig"], 0)
165+
assert (final_sig.numpy() == data["v2hz_sig"].numpy()).all()
166+
167+
168+
def test_full_signal_chain() -> None:
169+
full_signal = generator.generate_signals(X90p_q1)
170+
assert (full_signal[0]["d1"]["values"].numpy() == data["full_signal"][0]["d1"]["values"].numpy()).all()
171+
assert (full_signal[1].numpy() == data["full_signal"][1].numpy()).all()

0 commit comments

Comments
 (0)