nsqdriver 0.3.1__cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nsqdriver might be problematic. Click here for more details.

@@ -0,0 +1,310 @@
1
+ import time
2
+ from typing import Dict, Any, List
3
+
4
+ import numpy as np
5
+
6
+ from nsqdriver import MCIDriver, QSYNCDriver
7
+
8
+
9
+ try:
10
+ import Instrument
11
+ except ImportError as e:
12
+ class Instrument(object):
13
+ ...
14
+
15
+
16
+ class NSInstrument(Instrument):
17
+ """ Instrument for GuoDun devices """
18
+ ParameterMC = {
19
+ 'OUTSrate': 8e9, # 配置OUT通道采样率
20
+ 'OUTMix': 2, # 设置OUT通道增强第二奈奎斯特区信号
21
+ 'INZone': 'zone3' # 设置IN通道输入为Zone4,即要IN通道要采集的信号范围为6~8G
22
+ }
23
+ ParameterZ = {
24
+ 'OUTSrate': 2e9, # 配置OUT通道采样率
25
+ 'OUTMix': 1, # 设置OUT通道增强第一奈奎斯特区信号
26
+ 'KeepAmp': 2 # 开启Z通道的保持电平模式,2为保持drive信号电平
27
+ }
28
+ ParameterQSYNC = {
29
+ 'RefClock': 'in' # MC112的100M参考信号来源,机箱上的100M IN没有接的情况下,选择为in,反之选out
30
+ }
31
+
32
+ def __init__(self):
33
+ """ Initialization """
34
+ super(NSInstrument, self).__init__()
35
+
36
+ # 设备驱动
37
+ self.driver_mc: MCIDriver = MCIDriver('192.168.111.152')
38
+ self.driver_z: MCIDriver = MCIDriver('192.168.111.132')
39
+ self.qsync: QSYNCDriver = QSYNCDriver('192.168.111.152')
40
+
41
+ # 参数
42
+ self.waves = dict()
43
+ self.roFreq = dict()
44
+ self.roQubits = dict()
45
+ self.roLength = dict()
46
+ self.roDADelay = dict()
47
+ self.zpdc = dict()
48
+ self.group = dict()
49
+ self.roLines = dict()
50
+ self.connectDict = dict()
51
+ self.deviceDict = dict()
52
+ self.qubitROChannels = dict()
53
+ self.integrationDelay = dict()
54
+ self.inputRange = dict()
55
+ self.outputRange = dict()
56
+ self.devices = {
57
+ 'awg': self.driver_mc,
58
+ 'dc': self.driver_z,
59
+ 'qa': self.driver_mc,
60
+ } # type: Dict[str, Any]
61
+ self.shots = 1000
62
+ self.devicesList = {
63
+ 'awg': [],
64
+ 'dc': [],
65
+ 'qa': []
66
+ } # type: Dict[str, Any]
67
+
68
+ def connectDevices(self, *args, **kwargs):
69
+ """ Connect and initialize devices """
70
+ if 'devices' not in kwargs.keys():
71
+ raise ValueError('Parameter `devices` does not exist in connectDevices().')
72
+ if 'connect' not in kwargs.keys():
73
+ raise ValueError('Parameter `connect` does not exist in connectDevices().')
74
+ if 'roLines' not in kwargs.keys():
75
+ raise ValueError('Parameter `roLines` does not exist in connectDevices().')
76
+
77
+ self.roLines = kwargs['roLines']
78
+ """
79
+ The readout line dict. Example:
80
+ {"r1":["q01","q02","q03","q04","q05"], "r2": ["q06","q07","q08","q09","q10"], ...}
81
+ """
82
+
83
+ self.deviceDict = kwargs['devices']
84
+ """
85
+ The dict for all devices. Example:
86
+ {
87
+ "XY":["mc_1", ...],
88
+ "Z":["z_1", ...],
89
+ "ZDC":["z_1", ...],
90
+ "RO":["out01", "out09", ...],
91
+ "QA":["in01", "in09", ...]
92
+ }
93
+ """
94
+
95
+ self.connectDict = kwargs['connect']
96
+ """
97
+ The mapping between device channels and logical channels. Example:
98
+ {
99
+ "QA": {"r1QA": ["in01", "range(20)"], "r2QA": ["in09", "range(20)"], ...},
100
+ "RO": {"r1RO": ["out01", "range(20)"], "r2RO": ["out09", "range(20)"], ...},
101
+ "RO_qubits": {"q01RO": "r1RO", "q02RO": "r1RO", "q03RO": "r1RO", ...},
102
+ "RO_trig": {"r1RO": "AWG5M1", "r2RO": "AWG5M1", ...},
103
+ "XY": {"q03XY": ["mc_1", "out03"], "q04XY": ["mc_1", "out04"], ...},
104
+ "Z": {"q03Z": ["z_1", "out01"], "q04Z": ["z_1", "out02"]}
105
+ }
106
+
107
+ """
108
+
109
+ # Parse readout channels
110
+ for _line, _qubits in self.roLines.items():
111
+ ro_channels = [i for i in eval(self.connectDict['RO'][f'{_line}RO'][1])]
112
+ if len(ro_channels) != len(_qubits):
113
+ raise RuntimeError(f'Qubit number in {_line} does not equal to '
114
+ f'the number of channels ({ro_channels}).')
115
+ for _q, _c in zip(self.roLines[_line], ro_channels):
116
+ self.qubitROChannels[f'{_q}RO'] = _c
117
+
118
+ # Connect device
119
+ # 在kw参数中寻找系统初始化相关参数
120
+ qs_sp = self.ParameterQSYNC.copy()
121
+ qs_sp.update(kwargs.get('qs_param', {}))
122
+ mc_sp = self.ParameterMC.copy()
123
+ mc_sp.update(kwargs.get('mc_param', {}))
124
+ z_sp = self.ParameterZ.copy()
125
+ z_sp.update(kwargs.get('z_param', {}))
126
+
127
+ self.qsync.open(system_parameter=qs_sp)
128
+ self.driver_mc.open(system_parameter=mc_sp)
129
+ self.driver_z.open(system_parameter=z_sp)
130
+ self.qsync.sync_system()
131
+
132
+ def _rline2chnl(self, rline):
133
+ return int(self.connectDict['QA'][f'{rline}QA'][0][-2:])
134
+
135
+ def _xy2chnl(self, _key):
136
+ return int(self.connectDict['XY'][_key][1][-2:])
137
+
138
+ def _z2chnl(self, _key):
139
+ return int(self.connectDict['Z'][_key][1][-2:])
140
+
141
+ def _qubit2rline(self, qubit):
142
+ return self.connectDict['RO_qubits'][f'{qubit}RO'][:2]
143
+
144
+ def disconnectDevices(self, *args, **kwargs):
145
+ """ Initialize devices """
146
+ ...
147
+
148
+ # def expendBatchChannels(self):
149
+
150
+ def stopOutput(self, *args, **kwargs):
151
+ """ Stop the output of waveforms """
152
+ self.qsync.set('ResetTrig')
153
+
154
+ def startOutput(self, *args, **kwargs):
155
+ """ Stop the output of waveforms """
156
+ self.qsync.set('GenerateTrig')
157
+
158
+ def uploadWaveforms(self, *args, **kwargs):
159
+ """ Upload waveforms """
160
+ if 'waves' not in kwargs.keys():
161
+ raise ValueError('Parameter `waves` does not exist in uploadWaveforms().')
162
+ if 'zpdc' not in kwargs.keys():
163
+ raise ValueError('Parameter `zpdc` does not exist in uploadWaveforms().')
164
+
165
+ self.setINDemod(**kwargs)
166
+ self.setRODADelay(**kwargs)
167
+ self.zpdc = kwargs['zpdc']
168
+
169
+ waves = kwargs['waves']
170
+ waves_map = {}
171
+ for _key, _wave in waves.items():
172
+ _devChannel = None
173
+ if _key in self.connectDict['XY'].keys():
174
+ _devChannel = self._xy2chnl(_key)
175
+ self.driver_mc.set('Waveform', _wave, _devChannel)
176
+ elif _key in self.connectDict['Z'].keys():
177
+ _devChannel = self._z2chnl(_key)
178
+ self.driver_mc.set('Waveform', _wave, _devChannel)
179
+ elif _key in self.qubitROChannels.keys():
180
+ _devChannel = self._qubit2rline(_key)
181
+ wave_list = waves_map.get(_devChannel, [])
182
+ wave_list.append(_wave)
183
+ if _devChannel is None:
184
+ raise RuntimeError(f'Channel {_key} does not found.')
185
+ print(_key, _devChannel, len(_wave))
186
+
187
+ # 合并下发probe da波形
188
+ for _line, wave_list in waves_map.items():
189
+ max_points = max(_w.size() for _w in wave_list)
190
+ wave_array = np.zeros((len(self.roLines[_line]), max_points))
191
+ for idx, _w in enumerate(wave_list):
192
+ wave_array[idx][:_w.size()] = _w
193
+ self.driver_mc.set('Waveform', wave_array.mean(axis=0), self._rline2chnl(_line))
194
+
195
+ # import matplotlib.pyplot as plt
196
+ # for _key, _seq in self.waves.items():
197
+ # plt.plot(_seq, label=_key)
198
+ # plt.legend()
199
+ # plt.show()
200
+
201
+ def downloadIQ(self, *args, **kwargs):
202
+ """ Download IQ data """
203
+ self.setIntegrationDelay(**kwargs)
204
+ self.startOutput()
205
+ st_time = time.time()
206
+ roChannels = {}
207
+ print('self.roQubits', self.roQubits)
208
+ for _r in self.roQubits.keys():
209
+ roChannels[_r] = [self.qubitROChannels[f'{_q}RO'] for _q in self.roQubits[_r]]
210
+ print('roChannels', roChannels)
211
+ full = {
212
+ _r: self.driver_mc.get('IQ', channel=self._rline2chnl(_r))
213
+ for _r in self.roQubits.keys()
214
+ }
215
+ print('get iq data timing:', time.time() - st_time)
216
+
217
+ iqDict = dict()
218
+ for qubit, iqData in zip(self.roQubits.values(), full.values()):
219
+ for _q in qubit:
220
+ iqDict[_q] = iqData[self.qubitROChannels[f'{_q}RO']]
221
+ return iqDict
222
+
223
+ def setINDemod(self, *args, **kwargs):
224
+ """!
225
+ 配置MC设备的解模系数
226
+ @param args:
227
+ @param kwargs:
228
+ @return:
229
+ """
230
+ if 'roQubits' not in kwargs.keys():
231
+ raise ValueError('Parameter `roQubits` does not exist in uploadWaveforms().')
232
+ if 'roLength' not in kwargs.keys():
233
+ raise ValueError('Parameter `roLength` does not exist in uploadWaveforms().')
234
+ if 'roFreq' not in kwargs.keys():
235
+ raise ValueError('Parameter `roFreq` does not exist in uploadWaveforms().')
236
+ self.roQubits = kwargs['roQubits']
237
+ self.roLength = {_line: [length / 1e9 for length in lengths] for _line, lengths in kwargs['roLength'].items()}
238
+ self.roFreq = {_line: [freq / 1e9 for freq in freqs] for _line, freqs in kwargs['roFreq'].items()}
239
+
240
+ for _line, qubits in self.roQubits.items():
241
+ freqs = {_q: 1e9 for _q in self.roLines[_line]}
242
+ lengths = {_q: 512e-9 for _q in self.roLines[_line]}
243
+ for _q, _freq, _len in zip(qubits, self.roFreq[_line], self.roLength[_line]):
244
+ freqs[_q] = _freq
245
+ lengths[_q] = _len
246
+ print(f'The configured demodulation frequency point is ({freqs})')
247
+ self.driver_mc.set('TimeWidth', list(lengths.values()), self._rline2chnl(_line))
248
+ self.driver_mc.set('FreqList', max(freqs.values()), self._rline2chnl(_line))
249
+
250
+ def setRODADelay(self, *args, **kwargs):
251
+ """!
252
+ 配置probe da相对触发的延迟
253
+ 配置粒度为16ns的整倍数
254
+ @param args:
255
+ @param kwargs:
256
+ @return:
257
+ """
258
+ if 'roDADelay' in kwargs.keys():
259
+ for _line, delay in kwargs['roDADelay'].items():
260
+ self.roDADelay[_line] = delay/1e9
261
+ self.driver_mc.set('OUTDelay', self.roDADelay[_line], self._rline2chnl(_line))
262
+ else:
263
+ raise ValueError('Parameter `roDADelay` does not exist in uploadWaveforms().')
264
+
265
+ def setShots(self, *args, **kwargs):
266
+ """ Set shots """
267
+ if 'shots' not in kwargs.keys():
268
+ raise ValueError('Parameter `shots` does not exist in setShots().')
269
+ shots = kwargs['shots']
270
+ self.shots = shots
271
+ self.qsync.set('Shot', shots)
272
+ self.driver_mc.set('Shot', shots)
273
+ print("set shots:", shots)
274
+
275
+ def setHoldoffTime(self, *args, **kwargs):
276
+ """ Set hold-off time """
277
+ if 'interval' not in kwargs.keys():
278
+ raise ValueError('Parameter `interval` does not exist in setHoldoffTime().')
279
+ interval = kwargs['interval']
280
+ self.qsync.set('TrigPeriod', interval / 1e9) # 单位:s
281
+
282
+ def setLO(self, *args, **kwargs):
283
+ """ Set LO """
284
+ ...
285
+
286
+ def setIntegrationDelay(self, *args, **kwargs):
287
+ """ Set readout integration delay. """
288
+ if 'integrationDelay' in kwargs.keys():
289
+ for _channel, delay in kwargs['integrationDelay'].items():
290
+ self.integrationDelay[_channel] = delay
291
+ self.driver_mc.set('INDelay', delay / 1e9, self._rline2chnl(_channel))
292
+ else:
293
+ raise ValueError('Parameter `integrationDelay` does not exist in setIntegrationDelay().')
294
+
295
+ def setInputRange(self, *args, **kwargs):
296
+ """ Set input range for output channels """
297
+ if 'inputRange' in kwargs.keys():
298
+ for _channel, _value in kwargs['inputRange'].items():
299
+ devChannel = self.connectDict['QA'][_channel][1]
300
+ self.inputRange[devChannel] = _value
301
+ else:
302
+ raise ValueError('Parameter `inputRange` does not exist in setInputRange().')
303
+
304
+ def setOutputRange(self, *args, **kwargs):
305
+ """ Set output range for output channels """
306
+ if 'outputRange' in kwargs.keys():
307
+ for _channel, delay in kwargs['outputRange'].items():
308
+ self.outputRange[_channel] = delay
309
+ else:
310
+ raise ValueError('Parameter `outputRange` does not exist in setOutputRange().')
@@ -0,0 +1,245 @@
1
+ import numpy as np
2
+ from nsqdriver import MCIDriver, QSYNCDriver
3
+
4
+
5
+ class _XYChannel:
6
+ def __init__(self, mci: "DeviceBase", ch=1):
7
+ self.mci = mci
8
+ self.ch = ch
9
+ self.to_zero = np.zeros((16,))
10
+ self.to_one = np.ones((16,))
11
+ self.en = True
12
+ self.mode = 0
13
+ self.off = 0
14
+
15
+ def wave(self, w):
16
+ self.wavex(w, self.ch)
17
+
18
+ def wavex(self, w, idx):
19
+ if np.max(np.abs(w)) < 1e-30:
20
+ wr = np.zeros(16)
21
+ else:
22
+ wr = w
23
+ self.mci.mci_driver.set("Waveform", wr, idx)
24
+
25
+ def arm(self, k=None):
26
+ self.mci.mci_driver.set('PushWaveCache')
27
+
28
+ def trig_del(self, delay):
29
+ ...
30
+
31
+ def output_del(self, delay):
32
+ ...
33
+
34
+ def __del__(self):
35
+ pass
36
+
37
+ def output(self, b):
38
+ self.en = bool(b)
39
+ if not self.en:
40
+ self.mci.mci_driver.set("Waveform", self.to_zero, self.ch)
41
+
42
+ def mode(self, m_):
43
+ ...
44
+
45
+ def offsetx(self, off, idx):
46
+ self.mci.mci_driver.set('Waveform', off*self.to_one, idx)
47
+ self.off = off
48
+
49
+ def offset(self, off):
50
+ self.offsetx(off, self.ch)
51
+
52
+ W = {
53
+ "wave": wave,
54
+ "output": output,
55
+ "trig_del": trig_del,
56
+ "output_del": output_del,
57
+ "mode": mode,
58
+ "offset": offset,
59
+ }
60
+
61
+ Q = {"arm": arm}
62
+
63
+
64
+ class _ZChannel(_XYChannel):
65
+ pass
66
+
67
+
68
+ class _Probe:
69
+ def __init__(self, mci: "DeviceBase", ch=1):
70
+ self.mci = mci
71
+ self.ch = ch
72
+ self.freqList = []
73
+ self.SGS = None # single shot temp cache
74
+ self.AVG = None # average temp cache
75
+ self.depth = 2000
76
+ self._width = 1000
77
+ self.start = 500
78
+ self.demod = 1
79
+ self.averaged_I = np.zeros((16384, )) # 直播直采,相当于只有I路数据
80
+
81
+ def depth(self, depth_):
82
+ self.depth = depth_
83
+ self.mci.mci_driver.set('PointNumber', depth_, self.ch)
84
+
85
+ def demodulation_on(self, demod_):
86
+ self.demod = int(demod_)
87
+
88
+ def start(self, start_):
89
+ self.start = start_
90
+ self.mci.mci_driver.set('TriggerDelay', start_, self.ch)
91
+
92
+ def width(self, width_):
93
+ self._width = width_/4e9
94
+ self.mci.mci_driver.set('PointNumber', width_, self.ch)
95
+
96
+ def freqs(self, *freqList_):
97
+ self.freqList = freqList_
98
+ self.mci.mci_driver.set('FreqList', freqList_, self.ch)
99
+
100
+ def shot(self, _shot):
101
+ self.mci.mci_driver.set('Shot', _shot)
102
+
103
+ def measure(self, k=None):
104
+ self.mci.mci_driver.set('StartCapture')
105
+ if self.demod:
106
+ self.SGS = self.mci.mci_driver.get('IQ', self.ch)
107
+ self.AVG = np.mean(self.SGS, axis=0)
108
+ else:
109
+ self.averaged_I = np.mean(self.mci.mci_driver.get('TraceIQ', self.ch), axis=0)
110
+
111
+ def single_shot(self, k=None):
112
+ return self.SGS
113
+
114
+ def average(self, k=None):
115
+ return self.AVG
116
+
117
+ def trace_I(self, k=None):
118
+ return self.averaged_I
119
+
120
+ def trace_Q(self, k=None):
121
+ return self.averaged_I
122
+
123
+ def __del__(self):
124
+ pass
125
+
126
+ W = {
127
+ "demod": demodulation_on,
128
+ "depth": depth,
129
+ "width": width,
130
+ "start": start,
131
+ "freqs": freqs,
132
+ "shot": shot,
133
+ }
134
+
135
+ Q = {
136
+ "measure": measure,
137
+ "A": average,
138
+ "S": single_shot,
139
+ "traceI": trace_I,
140
+ "traceQ": trace_Q
141
+ };
142
+
143
+
144
+ # one box need one class
145
+ class DeviceBase:
146
+ def __init__(self):
147
+ self.mci_driver = MCIDriver('127.0.0.1')
148
+ self.qsync_driver = QSYNCDriver('127.0.0.1')
149
+
150
+
151
+ class NS_MCI(DeviceBase):
152
+ def __init__(self, addr, srate=10e9, mixmode=2, ref_clk='in'):
153
+ """!
154
+ 此类涉及到系统同步,放到最后实例化
155
+ @param addr: 设备ip
156
+ @param srate: OUT通道采样率
157
+ @param mixmode: 为2时开启OUT通道混合模式,增强第二奈奎斯特区输出
158
+ @param ref_clk: 设备参考信号来源,不接外输出100M时都配置为'in'
159
+ """
160
+ super(NS_MCI, self).__init__()
161
+ self.mci_driver = MCIDriver(addr)
162
+ self.qsync = QSYNCDriver(addr)
163
+ self.srate = srate
164
+ self.mixmode = mixmode
165
+ self.ref_clk = ref_clk
166
+ self.connect()
167
+
168
+ def connect(self):
169
+ mci_params = {'DArate': self.srate, 'MixMode': self.mixmode}
170
+ qsync_params = {'RefClock': self.ref_clk}
171
+
172
+ self.qsync.open(system_parameter=qsync_params)
173
+ self.mci_driver.open(system_parameter=mci_params)
174
+ self.qsync.sync_system()
175
+
176
+ self.mci_driver.set('EnableWaveCache', True)
177
+
178
+ for _ch in range(22):
179
+ xy_ch = _ch+1
180
+ setattr(self, f'OUT{xy_ch}', _XYChannel(self, xy_ch))
181
+ for _ch in range(2):
182
+ probe_ch = _ch+1
183
+ setattr(self, f'IN{probe_ch}', _Probe(self, probe_ch))
184
+
185
+ def trig_interval(self, interval):
186
+ self.interval = interval
187
+ self.qsync.set('TrigPeriod', int(interval))
188
+
189
+ def trig_count(self, count_):
190
+ self.qsync.set('Shot', int(count_))
191
+
192
+ def trig(self):
193
+ self.qsync.set('GenerateTrig', self.interval)
194
+
195
+ def awg_arm(self):
196
+ self.mci_driver.set('PushWaveCache')
197
+
198
+ def __del__(self):
199
+ pass
200
+
201
+ W = {
202
+ "trig_interval": trig_interval,
203
+ "trig_count": trig_count,
204
+ "connect": connect,
205
+ "trig": trig,
206
+ "awg_arm": awg_arm,
207
+ }
208
+
209
+ Q = {
210
+ }
211
+
212
+
213
+ class NS_Z(DeviceBase):
214
+ def __init__(self, addr, mixmode=2):
215
+ """!
216
+ 此类负责控制24 Z OUT通道的设备,采样率固定为2Gsps,mixmode固定为1
217
+ @param addr: 设备ip
218
+ @param mixmode: 为1时关闭OUT通道混合模式
219
+ """
220
+ super(NS_Z, self).__init__()
221
+ self.mci_driver = MCIDriver(addr)
222
+ self.qsync = QSYNCDriver(addr)
223
+ self.srate = 2e9
224
+ self.mixmode = 1
225
+ self.connect()
226
+
227
+ def connect(self):
228
+ mci_params = {'DArate': self.srate, 'MixMode': self.mixmode}
229
+ self.mci_driver.open(system_parameter=mci_params)
230
+
231
+ self.mci_driver.set('EnableWaveCache', True)
232
+
233
+ for _ch in range(24):
234
+ xy_ch = _ch+1
235
+ setattr(self, f'OUT{xy_ch}', _ZChannel(self, xy_ch))
236
+
237
+ def awg_arm(self):
238
+ self.mci_driver.set('PushWaveCache')
239
+
240
+ W = {
241
+ "connect": connect,
242
+ }
243
+
244
+ Q = {
245
+ }
File without changes
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.1
2
+ Name: nsqdriver
3
+ Version: 0.3.1
4
+ Summary: Naishu Q series quantum measurement and control equipment driver interface
5
+ Home-page: https://g2hoyqcmh4.feishu.cn/wiki/wikcnzvyMd82DLZUe2NsI6HxsFc
6
+ Author: Naishu Technology
7
+ Author-email: jilianyi@naishu.tech
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator
10
+ Classifier: Operating System :: MacOS :: MacOS X
11
+ Classifier: Operating System :: Microsoft :: Windows
12
+ Classifier: Operating System :: POSIX
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Requires-Python: >=3.9
17
+ Description-Content-Type: text/markdown
18
+ Requires-Dist: numpy (>=1.18)
19
+ Requires-Dist: waveforms
20
+
21
+ ```
22
+ _ _ ____ ___ ____ _
23
+ | \ | | / ___| / _ \ | _ \ _ __ (_) __ __ ___ _ __
24
+ | \| | \___ \ | | | | | | | | | '__| | | \ \ / / / _ \ | '__|
25
+ | |\ | ___) | | |_| | | |_| | | | | | \ V / | __/ | |
26
+ |_| \_| |____/ \__\_\ |____/ |_| |_| \_/ \___| |_|
27
+ ```
28
+
29
+ [![Tests](https://github.com/mianyan-echo/UltraMCI/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/mianyan-echo/UltraMCI/)
30
+ ***
31
+
32
+ ### 简介
33
+ NSQDriver为一套耐数®量子测控系列设备的Python通用驱动接口。可使用Python作为编程语言,基于此驱动接口可以实现对本公司测控设备的控制,进而完成各种超导量子芯片的表征实验和高保真门操作。
34
+
35
+ ```
36
+ +------------------------+
37
+ | Python |
38
+ | +------------------+
39
+ | | NSQDriver |
40
+ +------------------------+
41
+ : : :
42
+ +---------- : -----+
43
+ : : :
44
+ V V V
45
+ +-----------+ +-----------+ +-----------+
46
+ | Device A | | Device B | | QSYNC |
47
+ +-----------+ +-----------+ +-----------+
48
+ ```
49
+
50
+ NSQDriver接口可用于统一控制耐数®生产的Q100、MC、QSYNC等一系列量子测控仪器,可详细控制每台仪器每个OUT、IN通道的播放与采集行为,以及查看设备的运行状态等。在一个多台测控设备组成的多量子比特测控系统中,可以有效的在软件层面实现对系统中每台设备的详细控制。
51
+
52
+ 耐数®量子测控系列设备详细信息参考: [耐数](http://naishu.tech)
53
+
54
+ ***
55
+ ### 快速开始
56
+ - 驱动接口的通用流程如下
57
+ ```python
58
+ from nsqdriver import MCIDriver, QSYNCDriver
59
+
60
+ # 实例化设备驱动接口
61
+ driver = MCIDriver('127.0.0.1')
62
+ qsync = QSYNCDriver('127.0.0.1')
63
+
64
+ # 连接设备
65
+ qsync.open()
66
+ driver.open()
67
+
68
+ # 初始化系统
69
+ qsync.sync_system()
70
+
71
+
72
+ # 相关参数,参数细节相关参考 8.可用参数列表
73
+ driver.set('Shot', 1024)
74
+ ```
75
+
76
+ - NSWave接口
77
+ - NSWave是一种对于耐数®参数化波形技术的控制接口,参数化波形将量子测控所需的各种门的编辑由主控计算机直接生成波形转化成了设备实时计算
78
+ - 提供了一套直观的时序编辑接口
79
+ ```python
80
+ from nsqdriver import InsChannel
81
+ import numpy as np
82
+
83
+ ch = InsChannel() # 生成参数化波形通道实例
84
+
85
+ frame_65e9 = ch.ins_frame(6.5e9) # 生成一个frame
86
+ frame_67e9 = ch.ins_frame(6.7e9) # 生成一个frame
87
+
88
+ gaussian = ch.evlp_gaussian(4500e-9) # 生成一个高斯包络
89
+ square = ch.evlp_square(2500e-9) # 生成一个方波包络
90
+
91
+ wave1 = gaussian * frame_67e9 # 生成一段高斯包络的波形
92
+ wave2 = square * frame_65e9 # 生成一段方波包络的波形
93
+
94
+ ch.ins_reset_frame('phase', frame_65e9)
95
+ ch.ins_reset_frame('phase', frame_67e9)
96
+ ch.wait_for_trigger() # 等待触发到来
97
+ # 循环播放200次 3μs延迟+ 7μs波形
98
+ with ch.ins_loop(times=200) as _loop:
99
+ _loop.play_zero(3000e-9)
100
+ _loop.inc_phase(frame_65e9, np.pi / 2)
101
+ _loop.play_wave(wave2)
102
+ _loop.play_wave(wave1)
103
+ ```
@@ -0,0 +1,18 @@
1
+ nsqdriver/NS_MCI.py,sha256=ZRf_waF7Q3VnClZnvjogfhVkqW7ltmwZaXXCRU8qA0o,19542
2
+ nsqdriver/common.py,sha256=IHfShqgNN3THbe7KD7ICdfFY7JKC_kQj0_KJk-449gQ,499
3
+ nsqdriver/__init__.py,sha256=2lrBt7MFoKL3MpN4Mc_8fS3vfUlUQZsV5p3gEVKz7d4,371
4
+ nsqdriver/NS_CST.py,sha256=_QYCjg1YglIJ4YVmxvISqvy5rExWGlMhyrK9zYIRbRY,7877
5
+ nsqdriver/NS_QSYNC.py,sha256=68qFZ04KVXb0MSaeKIZVZYqR0UV_tkJYWz7KSz4Dvg0,23281
6
+ nsqdriver/_hold.cpython-311-x86_64-linux-gnu.so,sha256=a6QGRv7ztsNirQesKXppOQ5WoDotWTHsL9njAvdBkMs,23888
7
+ nsqdriver/setup.py,sha256=NoLYEnI8fThgiiAb7tEQ0zEtoBKfuhhosTzKOGoPQTU,665
8
+ nsqdriver/compiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ nsqdriver/compiler/py_wave_asm.cpython-311-x86_64-linux-gnu.so,sha256=40TR1nwzvqfMzQt1Qa-Di5AaXmO-spq074eOkf7ciXg,1824232
10
+ nsqdriver/compiler/ns_wave.cpython-311-x86_64-linux-gnu.so,sha256=onrbHevSKrKumFwA68s8vI1yI9_69xXH3FvS1XABcPQ,1650288
11
+ nsqdriver/wrapper/ND_NSMCI.py,sha256=gTyrDObhbggl35V_q-kpDoPsfttIEnDFc6f0-pk_P0k,6288
12
+ nsqdriver/wrapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ nsqdriver/wrapper/AWG_ADC.py,sha256=8K5xLEa_3CKnStWcoJeTj8ufEQfrx6o4l4XGNuOP3Ug,19211
14
+ nsqdriver/wrapper/BD_NSMCI.py,sha256=SMnDbS6iXDiPBhoR9QVJB_lJXhIXRQIVLJRSBEihLzw,12245
15
+ nsqdriver-0.3.1.dist-info/METADATA,sha256=Rq6R2BmH7_nnDkV-CVCeXNOJvpQnPtPVmuBh4UmOWkk,4315
16
+ nsqdriver-0.3.1.dist-info/RECORD,,
17
+ nsqdriver-0.3.1.dist-info/top_level.txt,sha256=o7EbQoFO6BoaG3KGbS9Lg_aRheZSY5KYzoYuI9vx-AI,10
18
+ nsqdriver-0.3.1.dist-info/WHEEL,sha256=8KU227XctfdX2qUwyjQUO-ciQuZtmyPUCKmeGV6Byto,152
@@ -0,0 +1,6 @@
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.40.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp311-cp311-manylinux_2_17_x86_64
5
+ Tag: cp311-cp311-manylinux2014_x86_64
6
+
@@ -0,0 +1 @@
1
+ nsqdriver