nsqdriver 0.12.11__cp39-cp39-win_amd64.whl → 0.12.12__cp39-cp39-win_amd64.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.

nsqdriver/NS_DDS_v3.py CHANGED
@@ -1,8 +1,9 @@
1
1
  import copy
2
2
  from enum import Enum
3
+ from math import ceil
3
4
  from collections import namedtuple
4
- from waveforms import Waveform, wave_eval
5
- from waveforms.math.signal import getFTMatrix, shift
5
+ from waveforms import Waveform, wave_eval, WaveVStack
6
+ from waveforms.waveform import _zero
6
7
  import nsqdriver.nswave as nw
7
8
 
8
9
  import numpy as np
@@ -43,15 +44,30 @@ def program_cap(param: nw.Var):
43
44
  nw.wait_for_trigger()
44
45
  i: nw.Var
45
46
  # param: [[100e-9, 1e-6], [200e-9, 1e-6]]
47
+ # nw.wait(150e-9)
46
48
  for i in param:
47
49
  nw.wait(i[0])
48
- nw.capture(i[1], i[2], i[3])
50
+ nw.capture(i[1], 0, 0)
49
51
 
50
52
 
51
- ProbeSegment = namedtuple('ProbeSegment', ['start', 'stop', 'freq'])
53
+ @nw.kernel
54
+ def program_da(p: nw.Var):
55
+ i: nw.Var
56
+ e: nw.Var
57
+ nw.init_frame(0, 0)
58
+ nw.wait_for_trigger()
59
+ # nw.reset_frame()
60
+ for i in p:
61
+ nw.wait(i[0])
62
+ e = nw.ins_envelope(i[1])
63
+ nw.play_wave(e, 1, 0, 0)
52
64
 
53
65
 
54
- CaptureCmd = namedtuple('CaptureCmd', ['start', 'ad_duration', 'delay', 'da_duration', 'freqs'])
66
+ ProbeSegment = namedtuple('ProbeSegment', ['start', 'stop', 'freq', 'idx'])
67
+
68
+ CaptureCmd = namedtuple('CaptureCmd', [
69
+ 'start', 'ad_duration', 'delay', 'da_duration', 'freqs', 'delays', 'idx_list'
70
+ ])
55
71
 
56
72
 
57
73
  class DemodulateMode(str, Enum):
@@ -59,102 +75,6 @@ class DemodulateMode(str, Enum):
59
75
  COMPLEX_SEQ = 'complex_seq'
60
76
 
61
77
 
62
- def get_coef(coef_info, sampleRate):
63
- start, stop = coef_info['start'], coef_info['stop']
64
- numberOfPoints = int(
65
- (stop - start) * sampleRate)
66
- if numberOfPoints % 64 != 0:
67
- numberOfPoints = numberOfPoints + 64 - numberOfPoints % 64
68
- t = np.arange(numberOfPoints) / sampleRate + start
69
-
70
- fList = []
71
- wList = []
72
- phases = []
73
-
74
- for kw in coef_info['wList']:
75
- Delta, t0, weight, w, phase = kw['Delta'], kw['t0'], kw['weight'], kw['w'], kw['phase']
76
- fList.append(Delta)
77
-
78
- if w is not None:
79
- w = np.zeros(numberOfPoints, dtype=complex)
80
- w[:len(w)] = w
81
- w = shift(w, t0 - start)
82
- phases.append(np.mod(phase + 2 * np.pi * Delta * start, 2 * np.pi))
83
- else:
84
- weight = weight
85
- if isinstance(weight, np.ndarray):
86
- pass
87
- else:
88
- if isinstance(weight, str):
89
- fun = wave_eval(weight) >> t0
90
- elif isinstance(weight, Waveform):
91
- fun = weight >> t0
92
- else:
93
- raise TypeError(f'Unsupported type {weight}')
94
- weight = fun(t)
95
- phase += 2 * np.pi * Delta * start
96
- w = getFTMatrix([Delta],
97
- numberOfPoints,
98
- phaseList=[phase],
99
- weight=weight,
100
- sampleRate=sampleRate)[:, 0]
101
- phases.append(np.mod(phase, 2 * np.pi))
102
- wList.append(w)
103
- return np.asarray(wList), fList, numberOfPoints, phases, round((stop - t0) * sampleRate), t
104
-
105
-
106
- def granularity4ns(delay):
107
- # 4ns取整
108
- out_delay = round(
109
- delay // 4e-9 * 4e-9, 10
110
- )
111
- return out_delay
112
-
113
-
114
- def generate_para(device, ch, coef_info):
115
- global RES_MAP
116
- global PROGRAME_PARA
117
- RES_MAP = []
118
- PROGRAME_PARA = []
119
-
120
- res_coef = get_coef(coef_info, 4e9)
121
- da_ad_delay = 150e-9 # ad相对于da的延迟
122
- ad_start = []
123
- freq_map = []
124
-
125
- for num, (orig, i) in enumerate(zip(coef_info["wList"], res_coef[0])):
126
- RES_MAP.append([None, None]) # 第一个字段标记第几个频点,第二个字段标记第几次采集
127
- if orig['Delta'] not in freq_map:
128
- # Delta 字段是解模频点
129
- # 新增加了频点
130
- freq_map.append(orig['Delta'])
131
- RES_MAP[-1][0] = freq_map.index(orig['Delta'])
132
-
133
- # 5.43这个频率点包含了第
134
- ad_line = res_coef[-1][np.nonzero(i)]
135
- ad_width = granularity4ns(ad_line[-1] - ad_line[0] + 0.25e-9)
136
- da_width = ad_width # 设置播放时长=采样时长
137
- if orig["t0"] not in ad_start:
138
- # 这个采集的起始点以前没配置过
139
- PROGRAME_PARA.append([orig["t0"], ad_width, da_ad_delay, da_width])
140
- ad_start.append(orig["t0"])
141
- # else:
142
- # # 这个采集的起点以前配置过
143
- # cap_num += 1
144
- # cap_map[num] = [cap_num, ]
145
- RES_MAP[-1][1] = len(ad_start) - 1 # len(ad_start) - 1 表明了当前是第几次采集
146
- # print(programe_para, freq_map)
147
- device.set("Program", program_cap(PROGRAME_PARA), ch)
148
- device.set("FreqList", freq_map, ch)
149
-
150
-
151
- def get_coef_res(iq_res):
152
- res = []
153
- for (freq_num, cap_num) in RES_MAP:
154
- res.append(iq_res[freq_num][cap_num::len(PROGRAME_PARA)])
155
- return res
156
-
157
-
158
78
  class Driver(BaseDriver):
159
79
  CHs = list(range(1, 25))
160
80
  segment = ('ns', '111|112|113|114|115')
@@ -222,6 +142,7 @@ class Driver(BaseDriver):
222
142
  self.handle = None
223
143
  self.model = 'NS_MCI' # 默认为设备名字
224
144
  self.srate = 8e9
145
+ self.ad_srate = 4e9
225
146
  self.addr = addr
226
147
  self.timeout = timeout
227
148
  self.chs = set() # 记录配置过的ch通道
@@ -229,7 +150,11 @@ class Driver(BaseDriver):
229
150
  self.coef_cache = {}
230
151
  self.res_maps = {}
231
152
  self.probe_da_wave = {}
232
- self.capture_cmds: "dict[int, CaptureCmd]" = {}
153
+ # self.probe_delay = 32e-9
154
+ self.probe_delay = 0
155
+ self.capture_cmds: "dict[int, list[CaptureCmd]]" = {}
156
+ self.capture_cali_param: "dict[int, np.ndarray]" = {}
157
+ self.capture_points: "dict[int, np.ndarray]" = {}
233
158
  self.demodulate_mode = DemodulateMode.MORE_QUBIT
234
159
 
235
160
  def open(self, **kw):
@@ -242,40 +167,42 @@ class Driver(BaseDriver):
242
167
  DArate = 8e9
243
168
  ADrate = 4e9
244
169
  sysparam = {
245
- "MixMode": 1,
170
+ "MixMode": 2,
246
171
  "RefClock": "out",
247
172
  "DArate": DArate,
248
173
  "ADrate": ADrate,
249
174
  "CaptureMode": 0,
250
175
  "INMixMode": 2, # 4~6 GHz 取 1, 6 ~ 8 GHz 取 2
251
176
  }
177
+ sysparam.update(kw.get('system_parameter', {}))
252
178
 
253
179
  device = MCIDriver(self.addr, self.timeout)
254
180
  device.open(system_parameter=sysparam)
255
181
  self.handle = device
256
182
 
257
183
  def granularity4ns(self, delay):
258
- # 4ns取整
259
- out_delay = round(
260
- delay // 4e-9 * 4e-9, 10
261
- )
262
- return out_delay
184
+ # points_4ns = 16 # self.ad_srate*4e-6
185
+ return delay // 4 * 4
263
186
 
264
187
  @staticmethod
265
- def get_sequence_in_time(coef_info: dict) -> list[CaptureCmd]:
188
+ def _delay2_phase(delay, freq):
189
+ return 2 * np.pi * freq * (delay * 1e-9)
190
+
191
+ def in_sequence_in_time(self, coef_info: dict) -> list[CaptureCmd]:
266
192
  w_list = coef_info.get('wList', [])
267
193
  time_segments: "list[ProbeSegment]" = []
268
194
 
269
- for wave in w_list:
270
- t0 = wave['t0']
195
+ for idx, wave in enumerate(w_list):
196
+ t0 = int(round(wave['t0'] * 1e9))
271
197
  weight_expr = wave['weight']
272
198
 
273
199
  # 假设 weight 表达式格式为 "square(X) >> Y",我们提取实际时间宽度
274
200
  # duration = float(weight_expr.split('>>')[1].strip())
275
201
  _start, _stop, _ = wave_eval(weight_expr).bounds
202
+ _start, _stop = int(round(_start * 1e9)), int(round(_stop * 1e9))
276
203
 
277
204
  # 将区间加入列表
278
- seg = ProbeSegment(t0+_start, t0+_stop, wave['Delta'])
205
+ seg = ProbeSegment(t0 + _start, t0 + _stop, wave['Delta'], idx)
279
206
  time_segments.append(seg)
280
207
 
281
208
  # 按起始时间排序
@@ -284,61 +211,148 @@ class Driver(BaseDriver):
284
211
  # 结果存储
285
212
  non_overlapping_segments: list[CaptureCmd] = []
286
213
  current_start, current_end = time_segments[0].start, time_segments[0].stop
287
- current_cmd = CaptureCmd(0, 0, 0, 0, [time_segments[0].freq])
214
+ current_cmd = CaptureCmd(0, 0, 0, 0, [time_segments[0].freq], [0.], [time_segments[0].idx])
288
215
  pointer = 0
289
216
 
290
217
  for seg in time_segments[1:]:
291
218
  if seg.start > current_end:
292
219
  # 如果不重叠,保存当前段并移动到下一段
293
- current_cmd = current_cmd._replace(start=current_start-pointer)
220
+ if pointer == 0:
221
+ current_cmd = current_cmd._replace(start=current_start)
222
+ else:
223
+ current_cmd = current_cmd._replace(start=current_start - self.probe_delay)
294
224
  current_cmd = current_cmd._replace(ad_duration=current_end - current_start)
295
- current_cmd = current_cmd._replace(delay=230e-9)
225
+ current_cmd = current_cmd._replace(delay=self.probe_delay)
296
226
  current_cmd = current_cmd._replace(da_duration=current_end - current_start)
297
227
  non_overlapping_segments.append(current_cmd)
298
228
 
299
- current_cmd = CaptureCmd(0, 0, 0, 0, [seg.freq])
300
- pointer += current_end
229
+ current_cmd = CaptureCmd(0, 0, 0, 0, [seg.freq], [0.], [seg.idx])
230
+ pointer = current_end
301
231
  current_start, current_end = seg.start, seg.stop
302
232
  else:
303
233
  # 如果有重叠,扩展当前段
304
234
  current_end = max(current_end, seg.stop)
235
+ current_cmd.idx_list.append(seg.idx)
305
236
  current_cmd.freqs.append(seg.freq)
237
+ # 由delay换算解缠绕相位
238
+ current_cmd.delays.append(seg.start - current_start)
306
239
  else:
307
240
  # 添加最后一个段
308
- current_cmd = current_cmd._replace(start=current_start - pointer)
241
+ current_cmd = current_cmd._replace(start=current_start - self.probe_delay)
309
242
  current_cmd = current_cmd._replace(ad_duration=current_end - current_start)
310
- current_cmd = current_cmd._replace(delay=230e-9)
243
+ current_cmd = current_cmd._replace(delay=self.probe_delay)
311
244
  current_cmd = current_cmd._replace(da_duration=current_end - current_start)
312
245
  non_overlapping_segments.append(current_cmd)
313
246
  return non_overlapping_segments
314
247
 
315
- def generate_para(self, coef_info, ch):
316
- res_map = []
248
+ def generate_in_program(self, coef_info, ch):
317
249
  freq_map = []
318
250
  seq_param = []
319
251
 
320
- self.capture_cmds[ch] = seq = self.get_sequence_in_time(coef_info)
252
+ self.capture_cmds[ch] = seq = self.in_sequence_in_time(coef_info)
321
253
 
322
254
  for segment in seq:
323
255
  freq_map.extend(segment.freqs)
324
- freq_map = list(set(freq_map))
256
+ freq_map = list(set(freq_map))
325
257
 
258
+ _t_end = 0
259
+ res_map = [[]]*len(coef_info['wList'])
260
+ phase_map = [0]*len(coef_info['wList'])
261
+ points_map = [0]*len(coef_info['wList'])
326
262
  for cap_num, segment in enumerate(seq):
263
+ _align_start = self.granularity4ns(segment.start)
264
+ _start_diff = segment.start - _align_start
265
+ _align_end = ceil((segment.start+segment.ad_duration)/4)*4
327
266
  seq_param.append([
328
- segment.start, segment.ad_duration, segment.delay, segment.da_duration
267
+ (_align_start-_t_end)*1e-9,
268
+ (_align_end-_align_start)*1e-9,
269
+ segment.delay*1e-9,
270
+ (_align_end-_align_start)*1e-9,
329
271
  ])
330
- for freq in segment.freqs:
331
- res_map.append([freq_map.index(freq), cap_num])
272
+ _t_end = _align_end
273
+ for idx, delay, freq in zip(segment.idx_list, segment.delays, segment.freqs):
274
+ res_map[idx] = [freq_map.index(freq), cap_num]
275
+ phase_map[idx] = self._delay2_phase(delay + _start_diff, freq)
276
+ points_map[idx] = segment.ad_duration * 1e-9 * self.ad_srate
332
277
 
333
278
  self.res_maps[ch] = res_map
334
- self.handle.set("Program", program_cap(seq_param), ch)
335
- self.handle.set("FreqList", freq_map, ch)
336
- self.handle.set("TimeWidth", 2e-6, ch)
279
+ self.capture_cali_param[ch] = np.exp(-1j * np.array(phase_map)).reshape((-1, 1))
280
+ self.capture_points[ch] = np.array(points_map).reshape((-1, 1))
281
+ return program_cap(seq_param), freq_map
282
+
283
+ def out_sequence_in_time(self, wave_list: list):
284
+ last_start = wave_list[0][0]
285
+ last_stop = wave_list[0][1]
286
+ temp_w = [wave_list[0][2]]
287
+ _res = []
288
+
289
+ for idx, (start, stop, seg) in enumerate(wave_list[1:]):
290
+ if start > last_stop:
291
+ _res.append([last_start, last_stop, np.hstack(temp_w)])
292
+ last_start = start
293
+ last_stop = stop
294
+ temp_w.clear()
295
+ temp_w.append(seg)
296
+ else:
297
+ last_stop = max(last_stop, stop)
298
+ temp_w.append(seg)
299
+ else:
300
+ _res.append([last_start, last_stop, np.hstack(temp_w)])
301
+ return _res
302
+
303
+ def gen_wave_frag(self, x, wave: "Waveform"):
304
+ range_list = np.searchsorted(x, wave.bounds)
305
+ # ret = np.zeros_like(x)
306
+ ret = []
307
+ start, stop = 0, 0
308
+ for i, stop in enumerate(range_list):
309
+ if start < stop and wave.seq[i] != _zero:
310
+ _w = copy.deepcopy(wave)
311
+ _w.start = start / self.srate
312
+ _w.stop = stop / self.srate
313
+ part = _w.sample(self.srate)
314
+ part = part if part is None else part[:(stop-start)]
315
+ ret.append((start, stop, part))
316
+ start = stop
317
+ else:
318
+ if not ret:
319
+ ret.append((0, 128, np.zeros((128,))))
320
+ return ret
321
+
322
+ def generate_out_program(self, _wave, ch):
323
+ align_points = 32 # 4ns*8e9
324
+ if isinstance(_wave, WaveVStack):
325
+ _wave = _wave.simplify()
326
+ if len(_wave.seq) == 1 and _wave.seq[0] == _zero:
327
+ wave_list = [(0, 128, np.zeros((128,)))]
328
+ else:
329
+ _wave.stop = _wave.bounds[-2]
330
+ wave_list = self.gen_wave_frag(
331
+ np.linspace(_wave.start, _wave.stop, int((_wave.stop - _wave.start) * self.srate)), _wave)
332
+ # print(f'generate_out_program: {_wave.start=}, {_wave.stop=}, {wave_list=}, {ch=}')
333
+ _t_end = 0
334
+ para = []
335
+ wave = self.out_sequence_in_time(wave_list)
336
+
337
+ for i in wave:
338
+ wait = (i[0] - _t_end)
339
+ align_wait = wait // align_points * align_points
340
+ zero_num = wait - align_wait
341
+ align_end = ceil(i[1] / align_points) * align_points
342
+ align_wave = [np.zeros(zero_num), i[2], np.zeros([align_end - i[1]])]
343
+ para.append([align_wait / self.srate, np.hstack(align_wave)])
344
+ _t_end = align_end
345
+ return program_da(para)
337
346
 
338
347
  def get_coef_res(self, iq_res, ch):
339
348
  res = []
340
349
  for (freq_num, cap_num) in self.res_maps[ch]:
341
350
  res.append(iq_res[freq_num][cap_num::len(self.capture_cmds[ch])])
351
+ # 采样点归一化
352
+ res = np.array(res) / self.capture_points[ch]
353
+ # 校准相位
354
+ res *= self.capture_cali_param[ch]
355
+
342
356
  return res
343
357
 
344
358
  def close(self, **kw):
@@ -358,24 +372,25 @@ class Driver(BaseDriver):
358
372
 
359
373
  def write(self, name: str, value, **kw):
360
374
  channel = kw.get('ch', 1)
361
- print(name, value, "write" * 4)
375
+ # print(f'NS_DDS_v3 write: {name=}, {channel=}')
362
376
  if name in {'Coefficient'}:
363
- # data, f_list, numberOfPoints, phases, points, _ = get_coef(value, 4e9)
364
-
365
- # print('DemoPoints'*10, points, channel)
366
- # self.handle.set('DemoPoints', points, channel) ############### 16ns-oscillation problem
367
- # self.handle.set('DemodulationParam', data, channel)
368
377
  coef_info = value
369
378
  self.chs.add(channel)
370
- self.generate_para(coef_info, channel)
379
+ kernel, freq_map = self.generate_in_program(coef_info, channel)
380
+ self.handle.set("ProgramIN", kernel, channel)
381
+ self.handle.set('TimeWidth', 2e-6, channel)
382
+ self.handle.set("FreqList", freq_map, channel)
371
383
  self.coef_cache.update({channel: coef_info})
372
- # elif name in {'Waveform'} and isinstance(value, waveforms.Waveform):
373
- # self.probe_da_wave[channel] = value
374
384
  elif name in {
375
385
  'CaptureMode', 'SystemSync', 'ResetTrig', 'TrigPeriod',
376
386
  'TrigFrom'
377
387
  }:
378
388
  pass
389
+ elif name in {
390
+ 'GenWave', 'Waveform'
391
+ } and isinstance(value, Waveform):
392
+ kernel_da = self.generate_out_program(value, channel)
393
+ self.handle.set("ProgramOUT", kernel_da, channel)
379
394
  else:
380
395
  if name in {"Shot"}:
381
396
  self.shots = value
@@ -383,18 +398,13 @@ class Driver(BaseDriver):
383
398
 
384
399
  def read(self, name: str, **kw):
385
400
  channel = kw.get('ch', 1)
386
- print(name, kw, "READ " * 6)
387
401
  if name in {"IQ"}:
388
- # if channel not in self.chs:
389
- # result = self.IQ_cache[channel]
390
- # print("result.shape, cache", result)
391
- # else:
392
- iq_res = self.handle.get("IQ", channel, round(self.shots * len(self.capture_cmds[channel]))) # / self.points
393
-
394
- # print(np.array(iq_res).shape, "iq shape")
395
- result = np.array(self.get_coef_res(iq_res, channel)).T
396
- # print(result.shape, "result.shape," * 3)
397
- if len(self.chs) != 0:
402
+ iq_res = self.handle.get(
403
+ "IQ", channel, round(self.shots * len(self.capture_cmds[channel]))
404
+ )
405
+
406
+ result = self.get_coef_res(iq_res, channel).T
407
+ if len(self.chs) != 0 and channel in self.chs:
398
408
  self.chs.remove(channel)
399
409
  # self.IQ_cache.update({channel: result})
400
410
  if len(self.chs) == 0:
@@ -402,3 +412,95 @@ class Driver(BaseDriver):
402
412
  else:
403
413
  result = self.handle.get(name, channel)
404
414
  return result
415
+
416
+
417
+ if __name__ == '__main__':
418
+ co = {'start': 0.0, 'stop': 10e-06, 'wList': [
419
+ {'Delta': 6796613333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
420
+ 't0': 1.5e-08, 'phi': 2.4311851282940524, 'threshold': 9.645718574523926},
421
+ {'Delta': 6965129999.666667, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
422
+ 't0': 2.345e-06, 'phi': 2.1739656328752264, 'threshold': 20.36802101135254},
423
+ {'Delta': 6866353333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
424
+ 't0': 2.345e-06, 'phi': 1.851749364542847, 'threshold': 21.65827751159668},
425
+ {'Delta': 6796613333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
426
+ 't0': 5.175e-06, 'phi': 2.4311851282940524, 'threshold': 9.645718574523926},
427
+ {'Delta': 6965129999.666667, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
428
+ 't0': 5.175e-06, 'phi': 2.1739656328752264, 'threshold': 20.36802101135254},
429
+ {'Delta': 6866353333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
430
+ 't0': 5.175e-06, 'phi': 1.851749364542847, 'threshold': 21.65827751159668},
431
+ {'Delta': 6796613333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
432
+ 't0': 7.805e-06, 'phi': 2.4311851282940524, 'threshold': 9.645718574523926},
433
+ {'Delta': 6796613333.333333, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
434
+ 't0': 8.805e-06, 'phi': 2.4311851282940524, 'threshold': 9.645718574523926},
435
+ {'Delta': 6965129999.666667, 'phase': -0.0, 'weight': 'square(8e-07) >> 4e-07', 'window': (0, 1024), 'w': None,
436
+ 't0': 9.005e-06, 'phi': 2.4311851282940524, 'threshold': 9.645718574523926}
437
+ ]}
438
+ import matplotlib.pyplot as plt
439
+ from nsqdriver import QSYNCDriver
440
+ import time
441
+ import waveforms as wf
442
+ from nsqdriver.NS_MCI import SHARED_DEVICE_MEM
443
+
444
+ SHARED_DEVICE_MEM.clear_ip()
445
+ _d = Driver('192.168.0.43', 300)
446
+ qsync = QSYNCDriver("192.168.0.43")
447
+ _d = Driver('192.168.0.228', 30)
448
+ _q = QSYNCDriver('192.168.0.228')
449
+ time.sleep(5)
450
+ _wave = wf.zero()
451
+ for _w in co['wList']:
452
+ t0 = _w['t0']
453
+ _wave += (wf.wave_eval(_w['weight']) * wf.cos(2 * np.pi * _w['Delta'])) >> t0
454
+ # _wave = _wave << 50e-9
455
+ _wave.start = 0
456
+ _wave.stop = 60e-6
457
+
458
+ _wave(np.linspace(0, 20e-6, int(20e-6 * 8e9)), frag=True)
459
+
460
+ wave = _wave.sample(8e9) / 3
461
+ _wave
462
+
463
+ for ch in range(3, 4):
464
+ _d.write('GenWave', _wave, ch=ch)
465
+ _d.write('Coefficient', co, ch=ch)
466
+ # res = _d.generate_para(co, 1)
467
+ _d.write("Coefficient", co, ch=2)
468
+ ch = 2
469
+ # wave = wf.cos(2*wf.pi*0.15e9)
470
+ # wave.start = 0
471
+ # wave.stop = 1e-6
472
+
473
+ _wave = waveforms.zero()
474
+ for _w in co['wList']:
475
+ t0 = _w['t0']
476
+ _wave += (waveforms.wave_eval(_w['weight']) * waveforms.cos(2 * np.pi * _w['Delta'])) >> t0
477
+ # _wave = _wave << 50e-9
478
+ _wave.start = 0
479
+ _wave.stop = co["stop"]
480
+ plt.plot(_wave.sample(8e9))
481
+ plt.show()
482
+ _d.write("GenWave", _wave, ch=2)
483
+ _d.set('CaptureMode', 1)
484
+ shots = 1024
485
+ qsync.set('Shot', shots)
486
+ _d.write('Shot', shots)
487
+ _d.set('StartCapture')
488
+ qsync.set('GenerateTrig', 400e-6)
489
+ time.sleep(400e-6 * shots + 0.5)
490
+ data = _d.get('TraceIQ', ch)
491
+ data = np.array(data)
492
+ print(data.shape)
493
+ data = data.reshape((shots, -1))
494
+ # qsync.set("Shot", 0xFFFFFFFF)
495
+ # qsync.set("GenerateTrig", 500e-6)
496
+ plt.figure()
497
+ plt.plot(data.mean(axis=0)[:])
498
+ plt.show()
499
+ _d.set('CaptureMode', 0)
500
+ _d.write("Coefficient", co, ch=2)
501
+ _d.write("GenWave", _wave, ch=2)
502
+ _d.set('StartCapture')
503
+ qsync.set('GenerateTrig', 40e-6)
504
+ data = _d.read("IQ", ch=2)
505
+ print(20 * np.log10(np.abs(data.mean(axis=0))))
506
+ pass
nsqdriver/NS_MCI.py CHANGED
@@ -9,8 +9,10 @@ import xmlrpc.client
9
9
  from xmlrpc.client import Transport
10
10
  from multiprocessing import shared_memory
11
11
  from functools import wraps
12
+ from enum import Enum
12
13
 
13
14
  import numpy as np
15
+
14
16
  try:
15
17
  import waveforms
16
18
  HAS_WAVEFORMS = True
@@ -78,6 +80,12 @@ def solve_rpc_exception(func):
78
80
  return wrapper
79
81
 
80
82
 
83
+ class DataMode(str, Enum):
84
+ DIRECT = 'direct'
85
+ NORMAL = 'normal'
86
+ RDMA = 'rdma'
87
+
88
+
81
89
  class Driver(BaseDriver):
82
90
  CHs = list(range(1, 25))
83
91
  segment = ('ns', '111|112|113|114|115')
@@ -153,6 +161,7 @@ class Driver(BaseDriver):
153
161
  self.handle = None
154
162
  self.model = 'NS_MCI' # 默认为设备名字
155
163
  self.srate = 6e9
164
+ self.data_mode = DataMode.NORMAL
156
165
  self.device_online = True
157
166
  self.has_start_capture = False
158
167
  self.backend_version = (0, 0, 0)
@@ -285,20 +294,25 @@ class Driver(BaseDriver):
285
294
  return
286
295
  print_debug(f'Driver: get操作被调用{name}')
287
296
  self.has_start_capture = False
297
+ if name in {'Trace', 'TraceIQ'} and self.backend_version >= (2, 8, 0):
298
+ data_mode = self.get('DataMode', channel)
299
+ data_mode = DataMode(data_mode) if data_mode else DataMode.NORMAL
300
+ if data_mode == DataMode.DIRECT:
301
+ return self._get_trace_data(channel)
288
302
 
289
303
  func = self.fast_rpc.rpc_get
290
304
  tmp = func(name, channel, value)
291
305
  tmp = RPCValueParser.load(tmp)
292
306
  return tmp
293
307
 
294
- def update_firmware(self, file_path, target='all'):
308
+ def update_firmware(self, file_path, target='all', _id=0):
295
309
  if not self.device_online:
296
310
  return
297
311
  import os
298
312
  if not os.path.exists(file_path):
299
313
  raise ValueError(f'文件路径: {file_path} 不存在')
300
314
  with open(file_path, 'rb') as fp:
301
- result = self.handle.update_rfs_firmware(fp.read(), target)
315
+ result = self.handle.update_rfs_firmware(fp.read(), target, _id)
302
316
  if result:
303
317
  print(f'设备{self.addr} 固件更新成功,3s后设备自动重启')
304
318
  else:
@@ -331,6 +345,15 @@ class Driver(BaseDriver):
331
345
  print(f'设备{self.addr}-指令{button_name}执行失败')
332
346
  return flag
333
347
 
348
+ def _get_trace_data(self, channel):
349
+ res = self.get('ShmPath', channel)
350
+ if not res:
351
+ return
352
+ _path, chnl, chnl_num, shots, points = res
353
+ shm = shared_memory.SharedMemory(name=_path, create=False)
354
+ data = np.frombuffer(shm.buf, dtype=np.int16).reshape((chnl_num, shots, points))
355
+ return data[chnl], data
356
+
334
357
  def _connect(self, addr=None, port=5001, timeout=None):
335
358
  """
336
359
  获取到指定ip的tcp连接
nsqdriver/__init__.py CHANGED
@@ -4,7 +4,7 @@ from .NS_CST import Driver as CSTDriver
4
4
  from .compiler.ns_wave import InsChannel
5
5
  from .compiler.py_wave_asm import nsw_config, AssemblyError
6
6
 
7
- version_pack = (0, 12, 11)
7
+ version_pack = (0, 12, 12)
8
8
 
9
9
  __version__ = '.'.join(str(_) for _ in version_pack)
10
10
  __all__ = ['MCIDriver', 'QSYNCDriver', 'CSTDriver', 'InsChannel']
Binary file
Binary file
Binary file
Binary file
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: nsqdriver
3
- Version: 0.12.11
3
+ Version: 0.12.12
4
4
  Summary: Q series measurement and control equipment driver interface
5
5
  Home-page: https://g2hoyqcmh4.feishu.cn/wiki/Jgt1wxlKniveYQkqCgbcJHsMnoe
6
6
  Classifier: Intended Audience :: Developers
@@ -19,6 +19,14 @@ Requires-Dist: numpy>=1.18
19
19
  Requires-Dist: astor>=0.8.1
20
20
  Provides-Extra: waveforms
21
21
  Requires-Dist: waveforms; extra == "waveforms"
22
+ Dynamic: classifier
23
+ Dynamic: description
24
+ Dynamic: description-content-type
25
+ Dynamic: home-page
26
+ Dynamic: provides-extra
27
+ Dynamic: requires-dist
28
+ Dynamic: requires-python
29
+ Dynamic: summary
22
30
 
23
31
  ```
24
32
  _ _ ____ ___ ____ _
@@ -0,0 +1,40 @@
1
+ nsqdriver/NS_CST.py,sha256=zA5YcM65v66EqwBnplDvA6HM0I-y8damDOerE2CKyZE,8137
2
+ nsqdriver/NS_DDS_v3.py,sha256=sawKNLeSEmLKkKfPe-O9-LZCAY1lyTPEN3YJiAYU2Lc,20784
3
+ nsqdriver/NS_MCI.py,sha256=PO5VMtxQXNCOfLYuHsIZ6MNhZCkJhyNTgx0E6lPcMYE,22520
4
+ nsqdriver/NS_QSYNC.py,sha256=bPD0cAUehRXpTDwMNZutB5AWhZM7iwKBD5t5jmJiBF4,27900
5
+ nsqdriver/__init__.py,sha256=pL9i93d2rNy7GuHRrA4nVAfVsBFyrK4dsrJXAl4fwm0,383
6
+ nsqdriver/common.py,sha256=5BRActb9TgNdVwWtfuZ_gki47H1WbABzYr5XbxLKlh4,519
7
+ nsqdriver/compiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ nsqdriver/compiler/assembler.cp39-win_amd64.pyd,sha256=Kli63Ukhi_kHB6mw4bRobXlwCAZwKYuMca9-8mQGA00,403968
9
+ nsqdriver/compiler/ns_wave.cp39-win_amd64.pyd,sha256=tVxk8eQ4fHCLTrDCqtBx_kIH90X7Tr9WYFX28yn5078,237568
10
+ nsqdriver/compiler/ns_wave.pyi,sha256=axQaxrMaKRPx8k9sDVlRj3SjR03AmXUDzkVW4D_2RJw,3975
11
+ nsqdriver/compiler/py_wave_asm.cp39-win_amd64.pyd,sha256=iji57WFwqL7NBi337ZZxqNnDPlX8yR08Kn9-i2n_OUk,331264
12
+ nsqdriver/compiler/py_wave_asm.pyi,sha256=PqEZuNt83CCu_FJUczUjStowOz2TBgvfIytGanFPHuQ,685
13
+ nsqdriver/nswave/__init__.py,sha256=rAU1XD58JBF7iAYB5LVD-ZlEmQq9wyJrsRVHF-OOrzI,302
14
+ nsqdriver/nswave/_asm.pyi,sha256=f8IjCLPIocBZXTC8F5GFTlI6ZDa5-hhShJPjL166K4o,2846
15
+ nsqdriver/nswave/_checkers.cp39-win_amd64.pyd,sha256=SHCgItmfdD5N_jvztZtOIVTqQ5d0o6XTJC0RzcPFDao,221696
16
+ nsqdriver/nswave/_checkers.pyi,sha256=931KCK3B87dE0qjtWcEt6C-_KSIdH0RRiIYer8p6Tgg,1459
17
+ nsqdriver/nswave/_errors.cp39-win_amd64.pyd,sha256=LraQBY6Et0c9KZtFEZSmHI8KLQ_3nXGoGTiC-Sv4OYQ,79360
18
+ nsqdriver/nswave/_errors.pyi,sha256=A4LLc1zu6blJgmaAW_Wdx19jvFe1fkIggkTgYaQ8BIM,664
19
+ nsqdriver/nswave/_functions.cp39-win_amd64.pyd,sha256=UyYKtZ74e8iVjlY5dBdat5CrAGqeDzTeqX0gCulcCCE,214528
20
+ nsqdriver/nswave/_functions.pyi,sha256=wOzfZITAzupxAONxGELNF_U-XMy1CTdr8iU8UeszTQk,1992
21
+ nsqdriver/nswave/_ir.cp39-win_amd64.pyd,sha256=ouzcjKvIA2Wsxdh7TO4UAU8v8YPKD8Tjxfy816Yg5hk,456192
22
+ nsqdriver/nswave/_ir.pyi,sha256=nPh7se2s1D80zMLF_bSrA4WpKI7uk-hrLRPs5JHadxc,7413
23
+ nsqdriver/nswave/_ir_pass.cp39-win_amd64.pyd,sha256=ed99Q-woyXuWkB2QuvyQVhWn8UvOZ_s_mAZgkmJ5Rzo,57856
24
+ nsqdriver/nswave/_ir_pass.pyi,sha256=UmQVLgcfX1rw9HuMorRCensJtxB4b7zh7uyIIlTF_A0,289
25
+ nsqdriver/nswave/_optimizations.cp39-win_amd64.pyd,sha256=6dBx4hVKmvfH7633DmeipF0sgYsYP7BNWqyG3r1_y2A,68096
26
+ nsqdriver/nswave/_optimizations.pyi,sha256=6WxLlO1aJEMMGB4qL3iSr0l43b6pSH-7qRSHXzCQQa8,508
27
+ nsqdriver/nswave/_rules.cp39-win_amd64.pyd,sha256=HznhPJdZCfCiC0AUVcf_RvV63I9IktoyseQddruLh6s,202240
28
+ nsqdriver/nswave/_rules.pyi,sha256=bMynUPRkrIfTNXPt0K7Rqy5cp4B-4EIdolznVBJaaAM,1926
29
+ nsqdriver/nswave/_simulator.cp39-win_amd64.pyd,sha256=u7hlNIpViZrHUpbTxl__1eR_QaH8GgxEP4wRiT67qe8,146432
30
+ nsqdriver/nswave/_translate.cp39-win_amd64.pyd,sha256=7eR_flWv6RR70Pz14BuETvJ0dT7Mza8uBQCw2S25cRs,126464
31
+ nsqdriver/nswave/_translate.pyi,sha256=f0N24eSL7hKj2R04W-EFeEo9A8UYfzHOta7LQrDn-UA,387
32
+ nsqdriver/nswave/kernel.cp39-win_amd64.pyd,sha256=W9nVgTpRwCFYwuok7zp5KAsLnrm7CsmVsRN3i5Azx1Q,324096
33
+ nsqdriver/nswave/kernel.pyi,sha256=GBjjcfGBFiZ7_PCSgOWJcfVqckYg_r3j7PsMpUeaozE,2009
34
+ nsqdriver/wrapper/AWG_ADC.py,sha256=wLtkbJe39hDcnbWZ-8jyGZ78RQtn7iAZ7P7H0n-2IWU,19733
35
+ nsqdriver/wrapper/ND_NSMCI.py,sha256=e0j7BUdfrhfYb1GqBPlO4vSoZPXTKyictXy1nPvoMFE,6533
36
+ nsqdriver/wrapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ nsqdriver-0.12.12.dist-info/METADATA,sha256=X2thtNNUeTSZIaEPZkSBkk9pjpNTYMHYRZz_qO_Gxhw,4576
38
+ nsqdriver-0.12.12.dist-info/WHEEL,sha256=agy-BJge3afXwWznUXANATmKFW4eqelqRR0uf608A_0,99
39
+ nsqdriver-0.12.12.dist-info/top_level.txt,sha256=o7EbQoFO6BoaG3KGbS9Lg_aRheZSY5KYzoYuI9vx-AI,10
40
+ nsqdriver-0.12.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.4.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp39-cp39-win_amd64
5
5
 
@@ -1,39 +0,0 @@
1
- nsqdriver/NS_CST.py,sha256=zA5YcM65v66EqwBnplDvA6HM0I-y8damDOerE2CKyZE,8137
2
- nsqdriver/NS_DDS_v3.py,sha256=rX7EPJzoSuRObi0WyP9etgCBMEL1PCgOxcLy0AcK3Yg,15841
3
- nsqdriver/NS_MCI.py,sha256=1zCpqkHr4tQdgb5iaMTKcjrhPKuWNSFUKR7V_8patG8,21659
4
- nsqdriver/NS_QSYNC.py,sha256=bPD0cAUehRXpTDwMNZutB5AWhZM7iwKBD5t5jmJiBF4,27900
5
- nsqdriver/__init__.py,sha256=1S2HPHybJwuTB8hcvKQl66muGN1jI3FX0UC1x0mJPLY,383
6
- nsqdriver/common.py,sha256=5BRActb9TgNdVwWtfuZ_gki47H1WbABzYr5XbxLKlh4,519
7
- nsqdriver/compiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- nsqdriver/compiler/assembler.cp39-win_amd64.pyd,sha256=dCLN4jdED9Bt8j6I7cAghqXEq0C9IPHUZxJ2h-Rf0rY,378368
9
- nsqdriver/compiler/ns_wave.cp39-win_amd64.pyd,sha256=Vtvaxty_J6CCG0OwvK9R2iD4Het1UwTVvRulmPinzQA,238080
10
- nsqdriver/compiler/ns_wave.pyi,sha256=axQaxrMaKRPx8k9sDVlRj3SjR03AmXUDzkVW4D_2RJw,3975
11
- nsqdriver/compiler/py_wave_asm.cp39-win_amd64.pyd,sha256=LQPap-mSK4dHjnFEZY74PIp9199TpY65ZvnmdimZWAs,331776
12
- nsqdriver/compiler/py_wave_asm.pyi,sha256=PqEZuNt83CCu_FJUczUjStowOz2TBgvfIytGanFPHuQ,685
13
- nsqdriver/nswave/__init__.py,sha256=rAU1XD58JBF7iAYB5LVD-ZlEmQq9wyJrsRVHF-OOrzI,302
14
- nsqdriver/nswave/_asm.pyi,sha256=f8IjCLPIocBZXTC8F5GFTlI6ZDa5-hhShJPjL166K4o,2846
15
- nsqdriver/nswave/_checkers.cp39-win_amd64.pyd,sha256=A_TMWfto-EPZFSP6EaQ_3OUmLQiBtzYI3W1csdsXZWo,176640
16
- nsqdriver/nswave/_checkers.pyi,sha256=931KCK3B87dE0qjtWcEt6C-_KSIdH0RRiIYer8p6Tgg,1459
17
- nsqdriver/nswave/_errors.cp39-win_amd64.pyd,sha256=uW1JSgZJHfW-oFlEjkUxhf2A5sw6Y_EygrdJRdtgGcc,79360
18
- nsqdriver/nswave/_errors.pyi,sha256=A4LLc1zu6blJgmaAW_Wdx19jvFe1fkIggkTgYaQ8BIM,664
19
- nsqdriver/nswave/_functions.cp39-win_amd64.pyd,sha256=bGQfzoh1WW0KUrywRK3R7EK5i0cgFzcY_fJfYn9_fOg,103936
20
- nsqdriver/nswave/_functions.pyi,sha256=wOzfZITAzupxAONxGELNF_U-XMy1CTdr8iU8UeszTQk,1992
21
- nsqdriver/nswave/_ir.cp39-win_amd64.pyd,sha256=tO3jRzb89_FeZhXoxq4RIoy04p56qqY4s1VWTayBvtE,315904
22
- nsqdriver/nswave/_ir.pyi,sha256=nPh7se2s1D80zMLF_bSrA4WpKI7uk-hrLRPs5JHadxc,7413
23
- nsqdriver/nswave/_ir_pass.cp39-win_amd64.pyd,sha256=ejX8iZB_wFg_mg8fUciBj6ShsSZ0aIlTD8kXF-VyHsY,47616
24
- nsqdriver/nswave/_ir_pass.pyi,sha256=UmQVLgcfX1rw9HuMorRCensJtxB4b7zh7uyIIlTF_A0,289
25
- nsqdriver/nswave/_optimizations.cp39-win_amd64.pyd,sha256=BuAmXTq9dCNL7_yzQdbn_firEn0pBn1ZzhUxuYrdHBw,56832
26
- nsqdriver/nswave/_optimizations.pyi,sha256=6WxLlO1aJEMMGB4qL3iSr0l43b6pSH-7qRSHXzCQQa8,508
27
- nsqdriver/nswave/_rules.cp39-win_amd64.pyd,sha256=b4IAVPsrHqMyuxpwsMElnYVeH8idgYH8YznUZLD3diU,187904
28
- nsqdriver/nswave/_rules.pyi,sha256=bMynUPRkrIfTNXPt0K7Rqy5cp4B-4EIdolznVBJaaAM,1926
29
- nsqdriver/nswave/_translate.cp39-win_amd64.pyd,sha256=-oHg_bUPs8p_PmTBPq3RZ565keJ1YP2Kb8VenCCICVg,110080
30
- nsqdriver/nswave/_translate.pyi,sha256=f0N24eSL7hKj2R04W-EFeEo9A8UYfzHOta7LQrDn-UA,387
31
- nsqdriver/nswave/kernel.cp39-win_amd64.pyd,sha256=iFMOkvp7cHfjn5eL_kneVfvCA9UTrZRvKqZd6_CBgCg,265216
32
- nsqdriver/nswave/kernel.pyi,sha256=GBjjcfGBFiZ7_PCSgOWJcfVqckYg_r3j7PsMpUeaozE,2009
33
- nsqdriver/wrapper/AWG_ADC.py,sha256=wLtkbJe39hDcnbWZ-8jyGZ78RQtn7iAZ7P7H0n-2IWU,19733
34
- nsqdriver/wrapper/ND_NSMCI.py,sha256=e0j7BUdfrhfYb1GqBPlO4vSoZPXTKyictXy1nPvoMFE,6533
35
- nsqdriver/wrapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- nsqdriver-0.12.11.dist-info/METADATA,sha256=w9fXif6nPaP8IcAol-hJ6pE1Gew7t8tHoIC520tmrWs,4385
37
- nsqdriver-0.12.11.dist-info/WHEEL,sha256=HjiSNRq6YfPLBecdDLVrhuUICytPxgnGSNE9mCulox0,99
38
- nsqdriver-0.12.11.dist-info/top_level.txt,sha256=o7EbQoFO6BoaG3KGbS9Lg_aRheZSY5KYzoYuI9vx-AI,10
39
- nsqdriver-0.12.11.dist-info/RECORD,,