quil_rs::program

Struct Program

Source
pub struct Program {
    pub calibrations: Calibrations,
    pub frames: FrameSet,
    pub memory_regions: IndexMap<String, MemoryRegion>,
    pub waveforms: IndexMap<String, Waveform>,
    pub gate_definitions: IndexMap<String, GateDefinition>,
    /* private fields */
}
Expand description

A Quil Program instance describes a quantum program with metadata used in execution.

This contains not only instructions which are executed in turn on the quantum processor, but also the “headers” used to describe and manipulate those instructions, such as calibrations and frame definitions.

Fields§

§calibrations: Calibrations§frames: FrameSet§memory_regions: IndexMap<String, MemoryRegion>§waveforms: IndexMap<String, Waveform>§gate_definitions: IndexMap<String, GateDefinition>

Implementations§

Source§

impl Program

Source

pub fn new() -> Self

Source

pub fn body_instructions(&self) -> impl Iterator<Item = &Instruction>

Returns an iterator over immutable references to the instructions that make up the body of the program.

Source

pub fn into_body_instructions(self) -> impl Iterator<Item = Instruction>

Source

pub fn clone_without_body_instructions(&self) -> Self

Like Clone, but does not clone the body instructions.

Source

pub fn add_instruction(&mut self, instruction: Instruction)

Add an instruction to the end of the program.

Note, parsing extern signatures is deferred here to maintain infallibility of Program::add_instruction. This means that invalid PRAGMA EXTERN instructions are still added to the Program::extern_pragma_map; duplicate PRAGMA EXTERN names are overwritten.

Source

pub fn add_instructions<I>(&mut self, instructions: I)
where I: IntoIterator<Item = Instruction>,

Source

pub fn filter_instructions( &self, predicate: impl FnMut(&Instruction) -> bool, ) -> Program

Return a new Program containing only the instructions for which predicate returns true.

Source

pub fn dagger(&self) -> Result<Self, ProgramError>

Creates a new conjugate transpose of the Program by reversing the order of gate instructions and applying the DAGGER modifier to each.

§Errors

Errors if any of the instructions in the program are not Instruction::Gate

Source

pub fn expand_calibrations(&self) -> Result<Self, ProgramError>

Expand any instructions in the program which have a matching calibration, leaving the others unchanged. Return the expanded copy of the program.

Return an error if any instruction expands into itself.

See Program::expand_calibrations_with_source_map for a version that returns a source mapping.

Source

pub fn expand_calibrations_with_source_map( &self, ) -> Result<ProgramCalibrationExpansion, ProgramError>

Expand any instructions in the program which have a matching calibration, leaving the others unchanged. Return the expanded copy of the program and a source mapping of the expansions made.

Source

pub fn from_instructions(instructions: Vec<Instruction>) -> Self

Build a program from a list of instructions

Source

pub fn get_frames_for_instruction<'a>( &'a self, instruction: &'a Instruction, ) -> Option<MatchedFrames<'a>>

Return the frames which are either “used” or “blocked” by the given instruction.

An instruction “uses” a frame if it plays on that frame; it “blocks” a frame if the instruction prevents other instructions from playing on that frame until complete.

Return None if the instruction does not execute in the context of a frame - such as classical instructions.

See the Quil-T spec for more information.

Source

pub fn get_used_qubits(&self) -> &HashSet<Qubit>

Returns a HashSet consisting of every Qubit that is used in the program.

Source

pub fn into_instructions(self) -> Vec<Instruction>

Consume the Program to return all of the instructions which constitute it.

Source

pub fn into_simplified(&self) -> Result<Self, ProgramError>

Simplify this program into a new Program which contains only instructions and definitions which are executed; effectively, perform dead code removal.

Removes:

  • All calibrations, following calibration expansion
  • Frame definitions which are not used by any instruction such as PULSE or CAPTURE
  • Waveform definitions which are not used by any instruction
  • PRAGMA EXTERN instructions which are not used by any CALL instruction (see Program::extern_pragma_map).

When a valid program is simplified, it remains valid.

§Note

If you need custom instruction handling during simplification, using InstructionHandler::simplify_program instead.

Source

pub fn wrap_in_loop( &self, loop_count_reference: MemoryReference, start_target: Target, end_target: Target, iterations: u32, ) -> Self

Return a copy of the Program wrapped in a loop that repeats iterations times.

The loop is constructed by wrapping the body of the program in classical Quil instructions. The given loop_count_reference must refer to an INTEGER memory region. The value at the reference given will be set to iterations and decremented in the loop. The loop will terminate when the reference reaches 0. For this reason your program should not itself modify the value at the reference unless you intend to modify the remaining number of iterations (i.e. to break the loop).

The given start_target and end_target will be used as the entry and exit points for the loop, respectively. You should provide unique Targets that won’t be used elsewhere in the program.

If iterations is 0, then a copy of the program is returned without any changes.

Source

pub fn resolve_placeholders(&mut self)

Resolve [LabelPlaceholder]s and QubitPlaceholders within the program using default resolvers.

See resolve_placeholders_with_custom_resolvers, default_target_resolver, and default_qubit_resolver for more information.

Source

pub fn resolve_placeholders_with_custom_resolvers( &mut self, target_resolver: Box<dyn Fn(&TargetPlaceholder) -> Option<String>>, qubit_resolver: Box<dyn Fn(&QubitPlaceholder) -> Option<u64>>, )

Resolve TargetPlaceholders and QubitPlaceholders within the program such that the resolved values will remain unique to that placeholder within the scope of the program.

The provided target_resolver and qubit_resolver, will be used to resolve those values respectively. If your placeholder returns None for a particular placeholder, it will not be replaced but will be left as a placeholder.

If you wish to provide a resolver for either labels or qubits, but want to rely on the default behavior for the other, considering using either default_qubit_resolver or default_target_resolver.

Source

pub fn default_target_resolver( &self, ) -> Box<dyn Fn(&TargetPlaceholder) -> Option<String>>

The default target resolver will resolve each TargetPlaceholder in the program to a unique target by applying an auto-incrementing suffix to the base target.

Source

pub fn default_qubit_resolver( &self, ) -> Box<dyn Fn(&QubitPlaceholder) -> Option<u64>>

The default qubit resolver will resolve each QubitPlaceholder in the program to a unique fixed qubit index by incrementing to the next available index.

Source

pub fn is_empty(&self) -> bool

Source

pub fn len(&self) -> usize

Source

pub fn to_instructions(&self) -> Vec<Instruction>

Return a copy of all of the instructions which constitute this Program.

Source

pub fn to_unitary(&self, n_qubits: u64) -> Result<Matrix, ProgramError>

Return the unitary of a program.

§Errors

Returns an error if the program contains instructions other than Gates.

Source

pub fn get_instruction(&self, index: usize) -> Option<&Instruction>

Get a reference to the Instruction at the given index, if present.

Source

pub fn try_extern_signature_map_from_pragma_map( &self, ) -> Result<ExternSignatureMap, (Pragma, ExternError)>

Convert the Program::extern_pragma_map into an ExternSignatureMap.

This will parse all PRAGMA EXTERN instructions in the program. If the conversion of any Pragma fails, the ExternError is returned along with the offending Pragma.

Trait Implementations§

Source§

impl Add for Program

Source§

type Output = Program

The resulting type after applying the + operator.
Source§

fn add(self, rhs: Program) -> Program

Performs the + operation. Read more
Source§

impl AddAssign for Program

Source§

fn add_assign(&mut self, rhs: Program)

Performs the += operation. Read more
Source§

impl Clone for Program

Source§

fn clone(&self) -> Program

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Program

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Program

Source§

fn default() -> Program

Returns the “default value” for a type. Read more
Source§

impl<'p> From<&'p Program> for ControlFlowGraph<'p>

Source§

fn from(value: &'p Program) -> Self

Converts to this type from the input type.
Source§

impl From<Vec<Instruction>> for Program

Source§

fn from(instructions: Vec<Instruction>) -> Self

Converts to this type from the input type.
Source§

impl FromStr for Program

Source§

type Err = ProgramError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, ProgramError>

Parses a string s to return a value of this type. Read more
Source§

impl PartialEq for Program

Source§

fn eq(&self, other: &Program) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Quil for Program

Source§

fn write( &self, writer: &mut impl Write, fall_back_to_debug: bool, ) -> Result<(), ToQuilError>

Write the Quil representation of the item to the given writer. If fall_back_to_debug is true, then it must not return an error.
Source§

fn to_quil(&self) -> Result<String, ToQuilError>

Return a string in valid Quil syntax or an error if the item cannot be represented with valid Quil.
Source§

fn to_quil_or_debug(&self) -> String

Return a string in valid Quil syntax if possible. Any individual component of this object which cannot be represented in Quil will be replaced with a Debug representation of that component.
Source§

impl<'a> TryFrom<&'a Program> for BasicBlock<'a>

Source§

type Error = ProgramEmptyOrContainsMultipleBasicBlocks

The type returned in the event of a conversion error.
Source§

fn try_from(value: &'a Program) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl StructuralPartialEq for Program

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T, Right> ClosedAdd<Right> for T
where T: Add<Right, Output = T> + AddAssign<Right>,

Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,