Qililab

Latest version: v0.28.0

Safety actively analyzes 706267 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 3 of 10

0.22.2

New features since last release

- Added Yokogawa `GS200` instrument and associated istrument controller.
[619](https://github.com/qilimanjaro-tech/qililab/pull/619)

- Added QDevil `QDAC-II` instrument and associated istrument controller.
[634](https://github.com/qilimanjaro-tech/qililab/pull/634)

- `set_parameter()` can now be used without being connected to the instruments.
[647](https://github.com/qilimanjaro-tech/qililab/pull/647)

Improvements

- `QuantumMachinesCluster` can be created by translating the runcard into the equivelant QUA config dictionary. `initial_setup`, `turn_on` and `turn_off` methods have been edited to properly instatiate and calibrate the instrument.
[620](https://github.com/qilimanjaro-tech/qililab/pull/620)

Breaking changes

- `QuantumMachinesManager` has been renamed to `QuantumMachinesCluster` and `QMMController` to `QuantumMachinesClusterController`.
[620](https://github.com/qilimanjaro-tech/qililab/pull/620)

Bug fixes

- Fixed [bug 653](https://github.com/qilimanjaro-tech/qililab/issues/635), where saving the runcard would not include the reset parameter in the instrument controllers.
[653](https://github.com/qilimanjaro-tech/qililab/pull/653)

0.22.1

Bug fixes

- Fixed [bug 635](https://github.com/qilimanjaro-tech/qililab/issues/635), where trying to read/set the Intermediate
frequency parameter was failing for Qblox RF modules.
[635](https://github.com/qilimanjaro-tech/qililab/pull/635)

0.22.0

New features since last release

- Added real time results saving capability.
[598](https://github.com/qilimanjaro-tech/qililab/pull/598)

- Raise an error if a user requests to run a circuit that is longer than `repetition_duration`
[621](https://github.com/qilimanjaro-tech/qililab/pull/621)

- Add parameter to the SLURM magic method to configure the time limit of a job.
[608](https://github.com/qilimanjaro-tech/qililab/pull/608)

- Add magic method to run python code as slurm jobs from Jupyter Notebooks.
[600](https://github.com/qilimanjaro-tech/qililab/pull/600)

- Implemented `QuantumMachinesCompiler` class to compile QPrograms to QUA programs.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Implemented `platform.execute_qprogram()` method to execute a qprogram on Qblox hardware.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Added the two main classes need for automatic-calibration, `CalibrationController` and `CalibrationNode`
[554](https://github.com/qilimanjaro-tech/qililab/pull/554)

- Added the driver for Quantum Machines Manager and a new QuantumMachinesResult class to handle Quantum Machines instruments.
[568](https://github.com/qilimanjaro-tech/qililab/pull/568)

- Implemented the `QuantumMachinesMeasurementResult` class to store data acquired from a single instrument.
[596](https://github.com/qilimanjaro-tech/qililab/pull/596)

Improvements

- Improved the UX for circuit transpilation by unifying the native gate and pulse transpiler under one `CircuitTranspiler` class, which has 3 methods:

- `circuit_to_native`: transpiles a qibo circuit to native gates (Drag, CZ, Wait, M) and optionally RZ if optimize=False (optimize=True by default)
- `circuit_to_pulses`: transpiles a native gate circuit to a `PulseSchedule`
- `transpile_circuit`: runs both of the methods above sequentially
`Wait` gate moved from the `utils` module to `circuit_transpilation_native_gates`
[575](https://github.com/qilimanjaro-tech/qililab/pull/575)

- Added `infinite_loop()` method to QProgram.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Added `measure()` method to QProgram.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Various improvements in the compilation flow of `QbloxCompiler`.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Updated `qm-qua` library to latest `1.1.5.1`.
[596](https://github.com/qilimanjaro-tech/qililab/pull/596)

Breaking changes

- Changed `resolution` parameter of waveforms' `envelope()` method to integer.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

- Changed the way variables work within a QProgram. Variables are now instantiated based on the physical domain they affect.
[563](https://github.com/qilimanjaro-tech/qililab/pull/563)

Deprecations / Removals

- Removed the park gate since it is no longer needed
[575](https://github.com/qilimanjaro-tech/qililab/pull/575)

Bug fixes

- Fixed [bug 626](https://github.com/qilimanjaro-tech/qililab/issues/626), where a regression bug was introduced by adding empty schedules to all flux buses, not only the ones with an AWG registered instrument, as it was intended originally.
[628](https://github.com/qilimanjaro-tech/qililab/pull/628)

- Fixed [bug 579](https://github.com/qilimanjaro-tech/qililab/issues/579), were now all `yaml.dumps` are done with [ruamel](https://yaml.readthedocs.io/en/latest/#changelog), for not losing decimals precisons, and also following the previous bug due to the elimination of `ruamel.yaml.round_trip_dump`, the version of ruamel in qililab got fixed, and imports where rewritten for more clarity
[578](https://github.com/qilimanjaro-tech/qililab/pull/578)

0.21.1

New features since last release

- Enums for gate options
[589](https://github.com/qilimanjaro-tech/qililab/pull/589)

- Two new enums for SNZ gate
[587](https://github.com/qilimanjaro-tech/qililab/pull/587)

Bug fixes

- Fixed [bug](https://github.com/qilimanjaro-tech/qililab/issues/584) where executing multiple circuits with each measuring different qubits would launch measurements for previously measured
qubits even if those did not have measurements on the circuit currently being executed.
[576](https://github.com/qilimanjaro-tech/qililab/pull/576)

- [ruamel 0.18.0](https://yaml.readthedocs.io/en/latest/#changelog) eliminated `ruamel.yaml.round_trip_dump`, so we changed its usage to the recommended version: `ruamel.yaml.YAML().dump` [577](https://github.com/qilimanjaro-tech/qililab/pull/577)

0.21.0

New features since last release

- Changed gate settings serialization so that fields with None values are not in the resulting dictionary
[562](https://github.com/qilimanjaro-tech/qililab/pull/562)

- Update qiboconnection to 0.12.0
[559](https://github.com/qilimanjaro-tech/qililab/pull/559)

- Added phase correction for CZ gates to the optimize step of translate circuit in `qililab.transpiler.transpiler`. Gates now can accept an optional dicionary with additional settings.
As an example, the CZ phase correction can be added at options for each qubit:

yaml
CZ(0,2):
- bus: flux_line_q2_bus
pulse:
amplitude: 1.0
phase: 0
duration: 101
shape:
name: snz
t_phi: 1
b: 0.5
options:
q0_phase_correction: 0.1
q2_phase_correction: 0.2


The default value for the `optimize` flag in qililab.transpiler.transpiler.translate_circuit has been changed from `False` to `True`

[552](https://github.com/qilimanjaro-tech/qililab/pull/552)

- build_platform() has been extended: [533](https://github.com/qilimanjaro-tech/qililab/pull/533)

Now appart from passing the runcard YAML file path, you can directly pass an already build dictionary.

Also the argument has changed names from `path` to `runcard`.

- Buses serialization have been implemented: [515](https://github.com/qilimanjaro-tech/qililab/pull/515)

When printing the runcard, in the buses part we will now have the normal Buses serialization, plus the parameters of the instruments associated to that bus, with the `to_dict/from_dict` methods.\`

Also the serialization includes using the `set/get_params` for setting/getting the instruments params.

- Distorsions and PulseShapes have been improved: [512](https://github.com/qilimanjaro-tech/qililab/pull/512)

They now work for `amplitude=0`, and for negative and `snz` envelopes (both positive and negatives)

It now also adds the `norm_factor` parameter for manual normalization to all the distortions (previously only in the lfilter distortion)

And finally we also have added the option to skip the automatic normalization that we do, setting the parameter `auto_norm` to `False`, (defaults to `True`).

Plus, added a lots of tests and documentation to both classes.

- Fixed bug which did not allow gaussian waveforms to have amplitude 0
[471](https://github.com/qilimanjaro-tech/qililab/pull/471)

- Delete `Schema` class from `Platform` and `RuncardSchema` classes (and from the rest of qililab).

Also `RuncardSchema` is now called simply `Runcard` (since its the class that maps our runcard files).

This PR brings importants simplifications to the full qililab structure, now the runcard will have the following structure:

yaml
name: ...

device_id: ...

gates_settings: Old `settings` without name & device_id
...

chip:
...

buses:
...

instruments:
...

instrument_controllers:
...


instead than the previous:

yaml
settings:
name: ...
device_id: ...
...

schema: Schema disappears from the platform.
chip:
...

buses:
...

instruments:
...

instrument_controllers:
...


Notice also how `settings` (and his respective class `PlatformSettings`) has changed to `gates_settings` (and the class to `GatesSettings` having the runcard string and the class the same name now, before they didn't).

[475](https://github.com/qilimanjaro-tech/qililab/pull/475)
[505](https://github.com/qilimanjaro-tech/qililab/pull/505)

- Simplify circuit gate to pulse transpilation.
Previous hardware gates are removed. Now gates can be defined in the runcard as a list of
`GateEvent` items with bus, wait time (optional) and pulse information. This allows more
customization and freedom of what a certain gate does. The gate will be transpiled as long
as the circuit gate's name and qubits match those of the gate in the runcard.
An example of a custom gate for the circuit X gate at qubit 0 and a CZ gate at (0,1)

yaml
X(0):
- bus: drive_line_q0_bus alias of the bus
wait_time: 200
pulse:
amplitude: 0.5
phase: 0
duration: 200
frequency: 0
shape:
name: drag
drag_coefficient: 1
num_sigmas: 2
- bus: flux_line_q0_bus alias of the bus
pulse:
amplitude: 1.0
phase: 0
duration: 200
frequency: 0
shape:
name: rectangular

CZ(0,1):
- bus: flux_line_q0_bus park pulse
pulse:
amplitude: 0.5
phase: 0
duration: 241
frequency: 0
shape:
name: rectangular
- bus: flux_line_q1_bus snz
wait_time: 40 wait 40ns after start of the park pulse
pulse:
amplitude: 1
phase: 0
duration: 201
frequency: 0
shape:
name: snz
b: 0.5
t_phi: 1


Experiments can access `GateEvent` items by using the gate and qubit `alias` like previously
and adding `_item` to access a `GateEvent` that is not the first event of the gate.
For example, `set_parameter(parameter='amplitude', value=0.8, alias='X(0)')` will set the amplitude
in the gate setting above from 0.5 to 0.8. This is equivalent to `alias='X(0)_0'`. However
`alias='X(0)_1'` sets instead the amplitude of the second event (`bus=flux_line_q0_bus`) from
1.0 to 0.8
[472](https://github.com/qilimanjaro-tech/qililab/pull/472)

- Rename Experiment and CircuitExperiment classes and dependencies:
This branch renames the Experiment class to BaseExperiment and CircuitExperiment to Experiment.
[482](https://github.com/qilimanjaro-tech/qililab/pull/482)

- Add a new Factory for the Buses and registered the current ones
[487](https://github.com/qilimanjaro-tech/qililab/pull/487)

- Add the NEW_DRIVERS flag to choose between old and new instruments and bus drivers.
[486](https://github.com/qilimanjaro-tech/qililab/pull/486)

- Add a new Factory for the InstrumentDrivers and registered the current ones
[473](https://github.com/qilimanjaro-tech/qililab/pull/473)

- Add interfaces and drivers for Flux bus:
This PR brings the qililab implementation of the Flux bus driver and unittests.
[469](https://github.com/qilimanjaro-tech/qililab/pull/469)

- Add ReadoutBus class.
[465](https://github.com/qilimanjaro-tech/qililab/pull/465)

- Fix: check whether cluster has submodules not present at init time.
[477](https://github.com/qilimanjaro-tech/qililab/pull/477)

- Add interfaces and drivers for Voltage and Current sources:
This PR brings the qililab implementation of the Keithly2600 and Yokowaga QCodes drivers and unittests.
[438](https://github.com/qilimanjaro-tech/qililab/pull/438)

- Fix: add acquisitions and weights to Sequencer QRM
[461](https://github.com/qilimanjaro-tech/qililab/pull/461)

- Add DriveBus and its interface for the new bus structure.
[457](https://github.com/qilimanjaro-tech/qililab/pull/457)

- Add QProgram for developing quantum programs in the bus level, the operations `Play`, `Sync`, `Wait`, `Acquire`, `SetGain`, `SetOffset`, `SetFrequency`, `SetPhase`, `ResetPhase`, and the iteration blocks `AcquireLoop` and `Loop`.
[452](https://github.com/qilimanjaro-tech/qililab/pull/452)

- Add QBloxCompiler for compiling QProgram into QPySequence.
[481](https://github.com/qilimanjaro-tech/qililab/pull/481)

- Add waveforms for the new QProgram
[456](https://github.com/qilimanjaro-tech/qililab/pull/456)

- Add interface for Voltage and Current sources
[448](https://github.com/qilimanjaro-tech/qililab/pull/448)

- New AWG Interface + SequencerQCM, Pulsar, QCM-QRM drivers
[442](https://github.com/qilimanjaro-tech/qililab/pull/442)

- New Digitiser interface + SequencerQRM driver
[443](https://github.com/qilimanjaro-tech/qililab/pull/442)

- Add interface for the Attenuator.
This is part of the "Promoting Modular Autonomy" epic.
[432](https://github.com/qilimanjaro-tech/qililab/pull/432)

- Added new drivers for Local Oscillators inheriting from QCoDeS drivers and Local Oscillator interface.
This is part of the "Promoting Modular Autonomy" epic.
[437](https://github.com/qilimanjaro-tech/qililab/pull/437)

- Add qcodes_contrib_drivers (0.18.0) to requierements
[440](https://github.com/qilimanjaro-tech/qililab/pull/440)

- Update qcodes to latest current version (0.38.1)
[431](https://github.com/qilimanjaro-tech/qililab/pull/431)

- Added hotfix for bus delay issue from Hardware:
This fix adds a delay for each pulse on a bus
[439](https://github.com/qilimanjaro-tech/qililab/pull/439)

- Added `T1` portfolio experiment
[409](https://github.com/qilimanjaro-tech/qililab/pull/409)

- The `ExecutionManager` can now be built from the loops of the experiment.
This is done by `alias` matching, the loops will be executed on the bus with the same `alias`.
Note that aliases are not unique, therefore the execution builder will use the first bus alias that matches the loop alias. An exception is raised if a `loop.alias` does not match any `bus.alias` specified in the runcard
[320](https://github.com/qilimanjaro-tech/qililab/pull/320)

- Added `T2Echo` portfolio experiment
[415](https://github.com/qilimanjaro-tech/qililab/pull/415)

- The `ExecutionManager` can now be built from the loops of the experiment.
This is done by `alias` matching, the loops will be executed on the bus with the same `alias`.
Note that aliases are not unique, therefore the execution builder will use the first bus alias that matches the loop alias. An exception is raised if a `loop.alias` does not match any `bus.alias` specified in the runcard
[320](https://github.com/qilimanjaro-tech/qililab/pull/320)

- The `Experiment` class has been changed to support a more general definition of experiment by removing the
`circuits` and `pulse_schedules`. A new class `CircuitExperiment` inherits from the new `Experiment` class has the previous attributes and all the functionality the old `Experiment` had.

python
experiment = Experiment(platform=platform, options=options)
experiment_2 = CircuitExperiment(platform=platform, options=options, circuits=[circuit])


[334](https://github.com/qilimanjaro-tech/qililab/pull/334)

- Added `threshold_rotation` parameter to `AWGADCSequencer`. This adds a new parameter to the runcard of sequencers of that type, QRM sequencers in the case of Qblox. This value is an angle expressed in degrees from 0.0 to 360.0.

yaml
awg_sequencers:
- identifier: 0
chip_port_id: 1
intermediate_frequency: 1.e+08
weights_path0: [0.98, ...]
weights_path1: [0.72, ...]
weighed_acq_enabled: true
threshold: 0.5
threshold_rotation: 45.0 <-- new line


[417](https://github.com/qilimanjaro-tech/qililab/pull/417)

Improvements

- Add `ForLoop` iteration method to QProgram.
[481](https://github.com/qilimanjaro-tech/qililab/pull/481)

- Add `Parallel` block to QProgram to allow parallel loops, and compilation support to QBloxCompiler.
[496](https://github.com/qilimanjaro-tech/qililab/pull/496)

- Allow CZ gates to use different pulse shapes
[406](https://github.com/qilimanjaro-tech/qililab/pull/406)

- Add support for the `Wait` gate

- Addeds support for the `Wait` gate
[405](https://github.com/qilimanjaro-tech/qililab/pull/405)

- Added support for `Parameter.Gate_Parameter` in `experiment.set_parameter()` method. In this case, alias is a, convertable to integer, string that denotes the index of the parameter to change, as returned by `circuit.get_parameters()` method.
[404](https://github.com/qilimanjaro-tech/qililab/pull/404)

- The `Chip` class now uses the `alias` of each node to define node connections.
[494](https://github.com/qilimanjaro-tech/qililab/pull/494)

Before:

yaml
chip:
nodes:
- name: qubit
alias: qubit_0
id_: 0
qubit_index: 0
frequency: 4.92e+09
nodes: [2, 10, 20, 30]


Now:

yaml
chip:
nodes:
- name: qubit
alias: qubit_0
qubit_index: 0
frequency: 4.92e+09
nodes: [qubit_2, resonator_q0, drive_line_q0, flux_line_q0]


- `ql.execute` now accepts a list of circuits!
[549](https://github.com/qilimanjaro-tech/qililab/pull/549)

Breaking changes

- Old scripts using `Experiment` with circuits should be changed and use `CircuitExperiment` instead.
[334](https://github.com/qilimanjaro-tech/qililab/pull/334)

Deprecations / Removals

- `id` and `category` attributes have been removed from `qililab`.
[494](https://github.com/qilimanjaro-tech/qililab/pull/494)

Documentation

- Documentation for the Chip module: \[553\] (<https://github.com/qilimanjaro-tech/qililab/pull/553>)

Includes documentation for all public features of the Chip module

- Documentation for the Pulse module: [532](https://github.com/qilimanjaro-tech/qililab/pull/532)

Includes documentation for all public features of the Pulse module

- Added documentation for platform module and the tutorial sections of Platform and Runcards: [531](https://github.com/qilimanjaro-tech/qililab/pull/531/files)

Bug fixes

- Avoid creating empty sequences for buses that are no flux lines and do for flux ones that do not have any AWG instrument.
[556](https://github.com/qilimanjaro-tech/qililab/pull/bug-557)

- The `threshold` and `threshold_rotation` parameters of a `QbloxQRM` can now be set using `Platform.set_parameter`.
[534](https://github.com/qilimanjaro-tech/qililab/pull/534)

- The `QbloxQRMRF` and `QbloxQCMRF` do not save an empty list for the parameter `out_offsets` in the saved runcard.
[565](https://github.com/qilimanjaro-tech/qililab/pull/565)

- The `save_platform` now saves in the yaml file float values with the same precision as in the `Platform` object.
[565](https://github.com/qilimanjaro-tech/qililab/pull/565)

0.20.0

New features since last release

- Added hotfixes for several issues encountered during the hackathon:
[413](https://github.com/qilimanjaro-tech/qililab/pull/413)

- Save experiments flag for experiments execute method

python
Option 1 (Default, save_experiment=True)
experiment = Experiment(platform=platform, circuits=circuits, options=options)
experiment.execute()

Option 2 (Equivalent to option 1, save_experiment=False)
experiment = Experiment(platform=platform, circuits=circuits, options=options)
experiment.execute(save_experiment=False)


- Empty sequences to avoid creating repeated programs.
- Create empty programs for all qubit flux lines to activate calibrated offsets.
- Added method to get qubits from the chip

python
qubits = ql.Chip.qubits()


- Added to the `draw()` method the option of specifying if you want:

- modulation or not,
- plot the real, iamginary, absolute or any combination of these options
- specify the type of plotline to use, such as "-", ".", "--", ":"...
for the classes `Experimental` and `ExecutionManager`, like:

python
Option 1 (Default)
figure = sample_experiment.draw(
real=True, imag=True, abs=False, modulation=True, linestyle="-"
)

Option 2 (Equivalent to option 1)
figure = sample_experiment.draw()

Option 3 (something different, only plotting the envelopes without modulation)
figure = sample_experiment.draw(modulation=False, linestyle=".")

plt.show()


[383](https://github.com/qilimanjaro-tech/qililab/pull/383)

- Added `lambda_2` attribute to the `cosine.py` module containing the `Cosine` pulse_shape, modifying the previous A/2\*(1-cos(x)).
Into a more general A/2\*(1-lambda_1*cos(phi)-lambda_2*cos(2phi)), giving a modified sinusoidal-gaussian.

- lambda_1 cosine A/2\*(1-cos(x)): Starts at height 0 (phase=0), maximum height A (phase=pi)
and ends at height 0 (phase=2pi). Which is a sinusoidal like gaussian.

- lambda_2 cosine A/2\*(1-cos(2x)): Starts at height 0 (phase=0), maximum height A (phase=pi/2)
then another height 0 in the middle at phase=pi, then another maximum height A (phase=3/2pi)
and ends at height 0 (phase=2pi).

For more info check the docstring and the following references:

- Supplemental material B. "Flux pulse parametrization" at \[<https://arxiv.org/abs/1903.02492%5C%5D>\],
- OPTIMAL SOLUTION: SMALL CHANGE IN θ at \[<https://arxiv.org/abs/1402.5467%5C%5D>\]

[385](https://github.com/qilimanjaro-tech/qililab/pull/385)

- Added user integration for `pulse_distortions`. Now they can be used writing them in the Buses of the runcards:

python
buses:
- id_: 0
category: bus
alias: feedline_bus
system_control:
id_: 0
name: readout_system_control
category: system_control
instruments: [QRM1, rs_1]
port: 100
distortions: <-- new line
- name: bias_tee <-- new line
tau_bias_tee: 1.0 <-- new line
- name: lfilter <-- new line
a: [0.1, 1.1] <-- new line
b: [1.1, 1.3] <-- new line
- id_: 10
category: bus
alias: drive_line_q0_bus
system_control:
id_: 10
name: system_control
category: system_control
instruments: [QCM-RF1]
port: 10
distortions: [] <-- new line


[372](https://github.com/qilimanjaro-tech/qililab/pull/372)

- Added CZ gate support, 2 qubit gate support to `circuit_to_pulse` and corresponding definitions to the runcard.

CZ implements a Sudden Net Zero (SNZ) pulse through the flux line as well as a parking gate (if defined in the runcard)
to adjacent qubits with lower frequency than CZ's target qubit.
For the parking gate, if the time is greater than the CZ pulse, the extra time is added as padding at the beginning/end
of the pulse.
The parameters for the CZ in the runcard are amplitude, duration *of the halfpulse*; and for the CZ's snz pulse b
(impulse between halfpulses) and t_phi (time between halfpulses without accounting for b)

Example:

yaml
gates:
1:
- name: Park
amplitude: 1.0
phase: 0
duration: 103
shape:
name: rectangular

(0,2):
- name: CZ
amplitude: 1.0
phase:
duration: 40
shape:
name: snz
b: 0.5
t_phi: 1


In the example above, if qubit 1 is connected to 2 and has lower frequency, there will be an attempt to apply a parking
pulse. If a Park gate definition is found for qubit 1, then a parking pulse will be applied.
The total duration of the CZ gate above will be 2\*duration + t_phi + 2 = 83 (each b has 1ns duration and there are 2 bs).
Thus the parking gate lasts for some extra 20ns which will result in 10ns 'pad time' in the parking gate before and after
the SNZ pulse.
Note that the order of the qubits in the CZ is important even if the gate is symmetric, because the second qubit will be
the target for the SNZ pulse.
[369](https://github.com/qilimanjaro-tech/qililab/pull/369/)

- Added `cosine.py` module containing a `Cosine` child class of `pulse_shape`, which gives a sinusoidal like gaussian A/2\*(1-cos(x)).
The shape starts at height 0 (phase=0), maximum height A (phase=pi) and ends at height 0 (phase=2pi)

python
pulse = Pulse(
amplitude=...,
phase=...,
duration=...,
frequency=...,
pulse_shape=Cosine(),
)


[376](https://github.com/qilimanjaro-tech/qililab/pull/376)

- Added `pulse.pulse_distortion.lfilter_correction.py` module, which is another child class for the `pulse.pulse_distortion` package.

python
distorted_envelope = LFilter(norm_factor=1.2, a=[0.7, 1.3], b=[0.5, 0.6]).apply(
original_envelopes
)


Also adds a phase property to `PulseEvent` and implements `Factory.get` directly in the `from_dict()` method of the parent class `PulseDistortion`.

[354](https://github.com/qilimanjaro-tech/qililab/pull/354)

- Added `get_port_from_qubit_idx` method to `Chip` class. This method takes the qubit index and the line type as arguments and returns the associated port.
[362](https://github.com/qilimanjaro-tech/qililab/pull/362)

- Added `pulse.pulse_distortion` package, which contains a module `pulse_distortion.py` with the base class to distort envelopes in `PulseEvent`, and two modules `bias_tee_correction.py` and `exponential_decay_correction.py`, each containing examples of distortion child classes to apply. This new feature can be used in two ways, directly from the class itself:

python
distorted_envelope = BiasTeeCorrection(tau_bias_tee=1.0).apply(original_envelope)


or from the class PulseEvent (which ends up calling the previous one):

python
pulse_event = PulseEvent(
pulse="example_pulse",
start_time="example_start",
distortions=[
BiasTeeCorrection(tau_bias_tee=1.0),
BiasTeeCorrection(tau_bias_tee=0.8),
],
)
distorted_envelope = pulse_event.envelope()


This would apply them like: BiasTeeCorrection_0.8(BiasTeeCorrection_1.0(original_pulse)), so the first one gets applied first and so on...
(If you write their composition, it will be in reverse order respect the list)

Also along the way modified/refactored the to_dict() and from_dict() and envelope() methods of PulseEvent, Pulse, PulseShape... since they had some bugs, such as:

- the dict() methods edited the external dictionaries making them unusable two times.
- the maximum of the envelopes didn't correspond to the given amplitude.

[294](https://github.com/qilimanjaro-tech/qililab/pull/294)

- The `QbloxQCMRF` module has been added. To use it, please use the `QCM-RF` name inside the runcard:

yaml
- name: QCM-RF
alias: QCM-RF0
id_: 2
category: awg
firmware: 0.7.0
num_sequencers: 1
out0_lo_freq: 3700000000 <-- new line
out0_lo_en: true <-- new line
out0_att: 10 <-- new line
out0_offset_path0: 0.2 <-- new line
out0_offset_path1: 0.07 <-- new line
out1_lo_freq: 3900000000 <-- new line
out1_lo_en: true <-- new line
out1_att: 6 <-- new line
out1_offset_path0: 0.1 <-- new line
out1_offset_path1: 0.6 <-- new line
awg_sequencers:
...


[327](https://github.com/qilimanjaro-tech/qililab/pull/327)

- The `QbloxQRMRF` module has been added. To use it, please use the `QRM-RF` name inside the runcard:

yaml
- name: QRM-RF
alias: QRM-RF0
id_: 0
category: awg
firmware: 0.7.0
num_sequencers: 1
out0_in0_lo_freq: 3000000000 <-- new line
out0_in0_lo_en: true <-- new line
out0_att: 34 <-- new line
in0_att: 28 <-- new line
out0_offset_path0: 0.123 <-- new line
out0_offset_path1: 1.234 <-- new line
acquisition_delay_time: 100
awg_sequencers:
...


[330](https://github.com/qilimanjaro-tech/qililab/pull/330)

Improvements

- The `get_bus_by_qubit_index` method of `Platform` class now returns a tuple of three buses: `flux_bus, control_bux, readout_bus`.
[362](https://github.com/qilimanjaro-tech/qililab/pull/362)

- Arbitrary mapping of I/Q channels to outputs is now possible with the Qblox driver. When using a mapping that is not
possible in hardware, the waveforms of the corresponding paths are swapped (in software) to allow it. For example,
when loading a runcard with the following sequencer mapping a warning should be raised:

yaml
awg_sequencers:
- identifier: 0
output_i: 1
output_q: 0


pycon
>>> platform = build_platform(name=runcard_name)
[qililab] [0.16.1|WARNING|2023-05-09 17:18:51]: Cannot set `output_i=1` and `output_q=0` in hardware. The I/Q signals sent to sequencer 0 will be swapped to allow this setting.


Under the hood, the driver maps `path0 -> output0` and `path1 -> output1`.
When applying an I/Q pulse, it sends the I signal through `path1` and the Q signal through `path0`.
[324](https://github.com/qilimanjaro-tech/qililab/pull/324)

- The versions of the `qblox-instruments` and `qpysequence` requirements have been updated to `0.9.0`
[337](https://github.com/qilimanjaro-tech/qililab/pull/337)

- Allow uploading negative envelopes on the `QbloxModule` class.
[356](https://github.com/qilimanjaro-tech/qililab/pull/356)

- The parameter `sync_en` of the Qblox sequencers is now updated automatically when uploading a program to a sequencer.
This parameter can no longer be set using `set_parameter`.
[353](https://github.com/qilimanjaro-tech/qililab/pull/353)

- The Qblox RF modules now support setting their LO frequency using the generic `Parameter.LO_FREQUENCY` parameter.
[455](https://github.com/qilimanjaro-tech/qililab/pull/455)

Deprecations / Removals

- Remove the `awg_iq_channels` from the `AWG` class. This mapping was already done within each sequencer.
[323](https://github.com/qilimanjaro-tech/qililab/pull/323)

- Remove the `get_port` method from the `Chip` class.
[362](https://github.com/qilimanjaro-tech/qililab/pull/362)

Bug fixes

- Add `_set_markers` method to the `QbloxModule` class and enable all markers. For the RF modules, this command
enables the outputs/inputs of the instrument. We decided to enable all markers by default to be able to use them
later if needed.
[361](https://github.com/qilimanjaro-tech/qililab/pull/361)

Page 3 of 10

© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.