use super::{
CircuitLayoutAnalysis, LayoutDiagnostics, LayoutObjective, LayoutResult, PhysicalLayoutGraph,
analyze_circuit_for_layout, is_perfect_layout,
};
use crate::circuit::Circuit;
use crate::compile::CompilerError;
use crate::device::{Device, Layout};
pub fn trivial_layout(
circuit: &Circuit,
device: &Device,
objective: &LayoutObjective,
) -> Result<LayoutResult, CompilerError> {
let analysis = analyze_circuit_for_layout(circuit)?;
let physical = PhysicalLayoutGraph::from_device(device)?;
trivial_layout_prepared(&analysis, &physical, objective)
}
pub fn trivial_layout_prepared(
analysis: &CircuitLayoutAnalysis,
physical: &PhysicalLayoutGraph,
objective: &LayoutObjective,
) -> Result<LayoutResult, CompilerError> {
if analysis.logical_qubits.len() > physical.physical_qubits().len() {
return Err(CompilerError::InvalidInput(format!(
"trivial layout requires at least as many usable physical qubits as logical qubits; got {} logical qubits and {} usable physical qubits",
analysis.logical_qubits.len(),
physical.physical_qubits().len()
)));
}
let layout = Layout::new(
analysis.logical_qubits.clone(),
physical.physical_qubits().to_vec(),
None,
)
.map_err(|error| {
CompilerError::InvariantViolation(format!(
"trivial layout failed to construct a valid layout: {error}"
))
})?;
let score = objective.score_layout(analysis, physical, &layout)?;
let diagnostics = LayoutDiagnostics {
is_perfect: is_perfect_layout(analysis, physical, &layout),
candidates_evaluated: 1,
used_fidelity: score.used_fidelity,
notes: Vec::new(),
};
Ok(LayoutResult {
layout,
score: Some(score),
diagnostics,
})
}