qat.experimental.conversion.pulse_to_q1.sequence_outlining module
Q1 sequence outlining: splits a Pulse entry block into per-frame sequence envelopes.
- class OutliningState
Bases:
objectState carried by Pulse-to-Q1 outlining.
This state records the sequence scaffolding introduced during the first stage of Pulse- to-Q1 conversion. Its organisation remains structurally parallel to the legacy QbloxProgram model, with one emitted sequence for each logical frame partition.
- Variables:
frame_to_port – Partition metadata keyed by frame id.
frame_to_sequence – Emitted sequence symbol keyed by frame id.
- class Q1OutliningPass(target_data=QbloxTargetDescription(q1asm=Q1AsmSpec(min_gain=-32768, max_gain=32767, min_offset=-32768, max_offset=32767, rt_duration_resolution_ns=1, min_rt_duration_ns=4, max_rt_duration_ns=65535, min_wait_immediate_ns=0, max_wait_immediate_ns=65535, register_size=4294967295), sequencer_specs=frozendict.frozendict({<Q1SequencerType.control: 'control'>: Q1SequencerSpec(type=<Q1SequencerType.control: 'control'>, instruction_capacity=16384, q1_core_clock_period_ns=4, sample_period_ns=1, min_waveform_sample=-1.0, max_waveform_sample=1.0, nco_min_frequency_hz=-500000000.0, nco_max_frequency_hz=500000000.0, nco_phase_steps=1000000000, nco_phase_steps_per_degree=2777777.777777778, nco_frequency_steps_per_hz=4, nco_frequency_limit_steps=2000000000, register_count=64, waveform_sample_capacity=16384, readout=None), <Q1SequencerType.readout: 'readout'>: Q1SequencerSpec(type=<Q1SequencerType.readout: 'readout'>, instruction_capacity=12288, q1_core_clock_period_ns=4, sample_period_ns=1, min_waveform_sample=-1.0, max_waveform_sample=1.0, nco_min_frequency_hz=-500000000.0, nco_max_frequency_hz=500000000.0, nco_phase_steps=1000000000, nco_phase_steps_per_degree=2777777.777777778, nco_frequency_steps_per_hz=4, nco_frequency_limit_steps=2000000000, register_count=64, waveform_sample_capacity=16384, readout=ReadoutSpec(min_integration_length_samples=4, max_integration_length_samples=16777212, integration_length_step_samples=4, integration_sample_period_ns=1, weight_sample_period_ns=1, min_acquisition_threshold=-16777212, max_acquisition_threshold=16777212, weight_sample_capacity=16384))}), module_specs=frozendict.frozendict({<QbloxModuleKind.qcm: 'qcm'>: ModuleSpec(kind=<QbloxModuleKind.qcm: 'qcm'>, sequencers=(<Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=4, input_count=0, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5), 2: (0, 1, 2, 3, 4, 5), 3: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=2), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=3), input_channel_map=frozendict.frozendict({}), acquisition_memory_bins=None, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.q: 'Q'>, <SignalPath.i: 'I'>}), acquisition_connection_mode=<AcquisitionConnectionMode.none: 'none'>, is_rf=False, local_oscillator=None), <QbloxModuleKind.qcm_rf: 'qcm_rf'>: ModuleSpec(kind=<QbloxModuleKind.qcm_rf: 'qcm_rf'>, sequencers=(<Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=2, input_count=0, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), input_channel_map=frozendict.frozendict({}), acquisition_memory_bins=None, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.none: 'none'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=2000000000, max_frequency_hz=18000000000, frequency_step_hz=1)), <QbloxModuleKind.qrm: 'qrm'>: ModuleSpec(kind=<QbloxModuleKind.qrm: 'qrm'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>), output_count=2, input_count=2, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=2), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=3), input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), acquisition_memory_bins=3000000, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.q: 'Q'>, <SignalPath.i: 'I'>}), acquisition_connection_mode=<AcquisitionConnectionMode.components: 'components'>, is_rf=False, local_oscillator=None), <QbloxModuleKind.qrm_rf: 'qrm_rf'>: ModuleSpec(kind=<QbloxModuleKind.qrm_rf: 'qrm_rf'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>), output_count=1, input_count=1, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5)}), marker_bit_0=None, marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=0), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5)}), acquisition_memory_bins=3000000, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.combined: 'combined'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=2000000000, max_frequency_hz=18000000000, frequency_step_hz=1)), <QbloxModuleKind.qrc: 'qrc'>: ModuleSpec(kind=<QbloxModuleKind.qrc: 'qrc'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=6, input_count=2, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5, 6, 7), 1: (0, 1, 2, 3, 4, 5, 6, 7), 2: (0, 4, 8, 9, 10, 11), 3: (1, 5, 8, 9, 10, 11), 4: (2, 6, 8, 9, 10, 11), 5: (3, 7, 8, 9, 10, 11)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=None, marker_bit_2=None, marker_bit_3=None, input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5, 6, 7), 1: (0, 1, 2, 3, 4, 5, 6, 7)}), acquisition_memory_bins=7000000, supports_mixer_correction=False, supports_local_oscillator_enable=False, supports_awg_modulation=False, supports_acquisition_demodulation=False, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.combined: 'combined'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=500000000, max_frequency_hz=10100000000, frequency_step_hz=100000000))}), min_module_slot=1, max_module_slot=20))
Bases:
OrderedPass,ModulePassOutline one q1_sequence per logical Pulse frame.
This pass partitions the Pulse instruction stream by logical frame lineage and emits one q1_sequence.sequence operation for each partition. The resulting structure mirrors the legacy QbloxProgram organisation at the scaffolding level and establishes the unit on which subsequent lowering rewrites operate. The emitted symbol acts as a stable handle in the xDSL symbol table, which keeps the outlined sequence observable and makes later references explicit.
Example:
pulse.create_frame %freq, "q0/drive" pulse.create_frame %freq, "q1/drive"
becomes two independent, structurally terminated sequence envelopes. Frame lineage determines each sequence’s non-terminator payload; outlining lowers the source region terminator to a fresh
q1.stopin every emitted body. Fissioned shot loops carry their per-shot synchronisation and phase-reset prologue inside the loop body.- apply(ctx, op)
Replace the Pulse entry stream with one outlined sequence per frame.
This stage detaches the entry block operations from the module and replaces them with
q1_sequence.sequenceenvelopes that carry the frame-local operations for each lineage. Each emitted sequence body is self-contained and ends withq1.stop. The per-operation rewrite patterns later in the configured Q1 pipeline lower the Pulse payload inside those envelopes.- Return type:
None
- name: ClassVar[str] = 'pulse-to-q1-outlining'
-
state:
OutliningState
-
target_data:
QbloxTargetDescription= QbloxTargetDescription(q1asm=Q1AsmSpec(min_gain=-32768, max_gain=32767, min_offset=-32768, max_offset=32767, rt_duration_resolution_ns=1, min_rt_duration_ns=4, max_rt_duration_ns=65535, min_wait_immediate_ns=0, max_wait_immediate_ns=65535, register_size=4294967295), sequencer_specs=frozendict.frozendict({<Q1SequencerType.control: 'control'>: Q1SequencerSpec(type=<Q1SequencerType.control: 'control'>, instruction_capacity=16384, q1_core_clock_period_ns=4, sample_period_ns=1, min_waveform_sample=-1.0, max_waveform_sample=1.0, nco_min_frequency_hz=-500000000.0, nco_max_frequency_hz=500000000.0, nco_phase_steps=1000000000, nco_phase_steps_per_degree=2777777.777777778, nco_frequency_steps_per_hz=4, nco_frequency_limit_steps=2000000000, register_count=64, waveform_sample_capacity=16384, readout=None), <Q1SequencerType.readout: 'readout'>: Q1SequencerSpec(type=<Q1SequencerType.readout: 'readout'>, instruction_capacity=12288, q1_core_clock_period_ns=4, sample_period_ns=1, min_waveform_sample=-1.0, max_waveform_sample=1.0, nco_min_frequency_hz=-500000000.0, nco_max_frequency_hz=500000000.0, nco_phase_steps=1000000000, nco_phase_steps_per_degree=2777777.777777778, nco_frequency_steps_per_hz=4, nco_frequency_limit_steps=2000000000, register_count=64, waveform_sample_capacity=16384, readout=ReadoutSpec(min_integration_length_samples=4, max_integration_length_samples=16777212, integration_length_step_samples=4, integration_sample_period_ns=1, weight_sample_period_ns=1, min_acquisition_threshold=-16777212, max_acquisition_threshold=16777212, weight_sample_capacity=16384))}), module_specs=frozendict.frozendict({<QbloxModuleKind.qcm: 'qcm'>: ModuleSpec(kind=<QbloxModuleKind.qcm: 'qcm'>, sequencers=(<Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=4, input_count=0, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5), 2: (0, 1, 2, 3, 4, 5), 3: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=2), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=3), input_channel_map=frozendict.frozendict({}), acquisition_memory_bins=None, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.q: 'Q'>, <SignalPath.i: 'I'>}), acquisition_connection_mode=<AcquisitionConnectionMode.none: 'none'>, is_rf=False, local_oscillator=None), <QbloxModuleKind.qcm_rf: 'qcm_rf'>: ModuleSpec(kind=<QbloxModuleKind.qcm_rf: 'qcm_rf'>, sequencers=(<Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=2, input_count=0, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), input_channel_map=frozendict.frozendict({}), acquisition_memory_bins=None, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.none: 'none'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=2000000000, max_frequency_hz=18000000000, frequency_step_hz=1)), <QbloxModuleKind.qrm: 'qrm'>: ModuleSpec(kind=<QbloxModuleKind.qrm: 'qrm'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>), output_count=2, input_count=2, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=2), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=3), input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5), 1: (0, 1, 2, 3, 4, 5)}), acquisition_memory_bins=3000000, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.q: 'Q'>, <SignalPath.i: 'I'>}), acquisition_connection_mode=<AcquisitionConnectionMode.components: 'components'>, is_rf=False, local_oscillator=None), <QbloxModuleKind.qrm_rf: 'qrm_rf'>: ModuleSpec(kind=<QbloxModuleKind.qrm_rf: 'qrm_rf'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>), output_count=1, input_count=1, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5)}), marker_bit_0=None, marker_bit_1=MarkerBitTarget(role=<MarkerBitRole.output_switch: 'output_switch'>, channel=0), marker_bit_2=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_3=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=1), input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5)}), acquisition_memory_bins=3000000, supports_mixer_correction=True, supports_local_oscillator_enable=True, supports_awg_modulation=True, supports_acquisition_demodulation=True, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.combined: 'combined'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=2000000000, max_frequency_hz=18000000000, frequency_step_hz=1)), <QbloxModuleKind.qrc: 'qrc'>: ModuleSpec(kind=<QbloxModuleKind.qrc: 'qrc'>, sequencers=(<Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.readout: 'readout'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>, <Q1SequencerType.control: 'control'>), output_count=6, input_count=2, output_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5, 6, 7), 1: (0, 1, 2, 3, 4, 5, 6, 7), 2: (0, 4, 8, 9, 10, 11), 3: (1, 5, 8, 9, 10, 11), 4: (2, 6, 8, 9, 10, 11), 5: (3, 7, 8, 9, 10, 11)}), marker_bit_0=MarkerBitTarget(role=<MarkerBitRole.marker_output: 'marker_output'>, channel=0), marker_bit_1=None, marker_bit_2=None, marker_bit_3=None, input_channel_map=frozendict.frozendict({0: (0, 1, 2, 3, 4, 5, 6, 7), 1: (0, 1, 2, 3, 4, 5, 6, 7)}), acquisition_memory_bins=7000000, supports_mixer_correction=False, supports_local_oscillator_enable=False, supports_awg_modulation=False, supports_acquisition_demodulation=False, output_path_components=frozenset({<SignalPath.iq: 'IQ'>}), acquisition_connection_mode=<AcquisitionConnectionMode.combined: 'combined'>, is_rf=True, local_oscillator=LocalOscillatorSpec(min_frequency_hz=500000000, max_frequency_hz=10100000000, frequency_step_hz=100000000))}), min_module_slot=1, max_module_slot=20)