Skip to content

Commit 1faae78

Browse files
authored
Merge pull request #96 from andncl/fix_param_type_cast_in_sweep
fixed param type casting in sweep
2 parents 7e9a615 + 7d2d865 commit 1faae78

File tree

1 file changed

+47
-6
lines changed

1 file changed

+47
-6
lines changed

arbok_driver/sweep.py

+47-6
Original file line numberDiff line numberDiff line change
@@ -335,17 +335,14 @@ def _qua_parmetrized_loop(self, next_action: callable) -> None:
335335
param.qua_var, param.qua_sweep_arr[sweep_idx_var])
336336
if not self.snake_scan:
337337
for param, sss in parameters_sss.items():
338-
if param.qua_type == int:
339-
qua.assign(param.qua_var, sss['start'] + sss['step']*sweep_idx_var)
340-
else:
341-
qua.assign(param.qua_var, sss['start'] + qua.lib.Cast.mul_fixed_by_int(sss['step'], sweep_idx_var))
338+
self._qua_calc_param_step(param, sss, sweep_idx_var, False)
342339
else:
343340
with qua.if_(self.get_snake_var()):
344341
for param, sss in parameters_sss.items():
345-
qua.assign(param.qua_var, sss['stop'] - qua.lib.Cast.mul_fixed_by_int(sss['step'], sweep_idx_var))
342+
self._qua_calc_param_step(param, sss, sweep_idx_var, True)
346343
with qua.else_():
347344
for param, sss in parameters_sss.items():
348-
qua.assign(param.qua_var, sss['start'] + qua.lib.Cast.mul_fixed_by_int(sss['step'], sweep_idx_var))
345+
self._qua_calc_param_step(param, sss, sweep_idx_var, False)
349346

350347
qua.align()
351348

@@ -363,6 +360,50 @@ def step_variable():
363360
else:
364361
step_variable()
365362

363+
def _qua_calc_param_step(self, param, sss, sweep_idx_var, reverse):
364+
"""
365+
Calculates the step within a parameter sweep.
366+
367+
Args:
368+
param (SequenceParameter): Parameter to be swept
369+
sss (dict): Dict with start, stop and step (parameterizing sweep)
370+
sweep_idx_var (qua variable): Index variable for sweep
371+
reverse (bool): Whether the sweep is reversed (from stop to start)
372+
373+
Raises:
374+
TypeError: If qua_type is not int or fixed
375+
376+
Returns:
377+
None
378+
"""
379+
### Note this implementation is written in a very explicit way avoiding
380+
### multiplications to save lines of code. This is done to avoid
381+
### multiplications in the FPGA code (e.g (-1)*x)
382+
if param.qua_type == int:
383+
if not reverse:
384+
qua.assign(
385+
param.qua_var, sss['start'] + sss['step']*sweep_idx_var)
386+
else:
387+
qua.assign(
388+
param.qua_var, sss['stop'] - sss['step']*sweep_idx_var)
389+
elif param.qua_type == qua.fixed:
390+
if not reverse:
391+
qua.assign(
392+
param.qua_var,
393+
sss['start'] + qua.lib.Cast.mul_fixed_by_int(
394+
sss['step'], sweep_idx_var)
395+
)
396+
else:
397+
qua.assign(
398+
param.qua_var,
399+
sss['stop'] - qua.lib.Cast.mul_fixed_by_int(
400+
sss['step'],sweep_idx_var)
401+
)
402+
else:
403+
raise TypeError(
404+
"Only int and fixed qua types are supported for param sweeps"
405+
)
406+
366407
def _qua_explicit_array_loop(self, next_action):
367408
"""Runs a qua for loop from explicitly defined qua arrays"""
368409
for param in self.parameters:

0 commit comments

Comments
 (0)