@@ -335,17 +335,14 @@ def _qua_parmetrized_loop(self, next_action: callable) -> None:
335
335
param .qua_var , param .qua_sweep_arr [sweep_idx_var ])
336
336
if not self .snake_scan :
337
337
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 )
342
339
else :
343
340
with qua .if_ (self .get_snake_var ()):
344
341
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 )
346
343
with qua .else_ ():
347
344
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 )
349
346
350
347
qua .align ()
351
348
@@ -363,6 +360,50 @@ def step_variable():
363
360
else :
364
361
step_variable ()
365
362
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
+
366
407
def _qua_explicit_array_loop (self , next_action ):
367
408
"""Runs a qua for loop from explicitly defined qua arrays"""
368
409
for param in self .parameters :
0 commit comments