Source code for zhinst.toolkit.driver.devices.hdawg

"""HDAWG Instrument Driver."""
import typing as t

from zhinst.toolkit.driver.devices.base import BaseInstrument
from zhinst.toolkit.driver.nodes.awg import AWG
from zhinst.toolkit.nodetree.helper import (
    create_or_append_set_transaction,
    lazy_property,
)
from zhinst.toolkit.nodetree.node import NodeList
from zhinst.toolkit.exceptions import ToolkitError


[docs]class HDAWG(BaseInstrument): """High-level driver for the Zurich Instruments HDAWG."""
[docs] def enable_qccs_mode(self, gen: int = 1) -> None: """Configure the instrument to work with PQSC. This method sets the reference clock source to connect the instrument to the PQSC. Args: gen: The QCCS generation that is being configured. Use 1 for a gen1 system, when only HDAWG and UHFQA are used. In this case, the sample rate is set to 2.4 GSa/s and the DIO interface is configured for connection with the UHFQA. Use 2 for a gen2 system, when only HDAWG and SHFs are used. In this case, the sample rate is set to 2.0 GSa/s. (default: 1) .. versionchanged:: 0.6.2: Added gen parameter. Raises: ToolkitError: If the gen argument is not correct. Info: Use ``factory_reset`` to reset the changes if necessary """ with create_or_append_set_transaction(self._root): # Enable QCCS mode, so the instrument is able # to operate with ZSync self.dios[0].mode("qccs") # Gen1 specific elements if gen == 1: # Set the sample clock to 2.4 GSa/s self.system.clocks.sampleclock.freq(2.4e9) # Configure DIO # Set interface standard to use on the 32-bit DIO to LVCMOS self.dios[0].interface(0) # Drive the two most significant bytes of the DIO port # so the UHFQA receives triggers from PQSC self.dios[0].drive(0b1100) # Gen2 specific elements elif gen == 2: # Set the sample clock to 2.0 GSa/s self.system.clocks.sampleclock.freq(2.0e9) # Turn off DIO self.dios[0].drive(0b0000) else: raise ToolkitError("Only gen1 or gen2 are supported!") # Set ZSync clock to be used as reference self.system.clocks.referenceclock.source("zsync") # Disable DIO triggering on the AWGs, # since it's not needed for ZSync messages self.awgs["*"].dio.strobe.slope("off") self.awgs["*"].dio.valid.polarity("none")
@lazy_property def awgs(self) -> t.Sequence[AWG]: """A Sequence of AWG Cores.""" return NodeList( [ AWG( self.root, self._tree + ("awgs", str(i)), self.serial, i, self.device_type, self.device_options, ) for i in range(len(self["awgs"])) ], self._root, self._tree + ("awgs",), )