diff --git a/README.md b/README.md index e5e9d5e..76c4652 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ The following example generates a circuit that constructs a [Bell state](https:/ ```julia using Qiskit -using Qiskit.C # lower-level C API functions function build_bell() qc = QuantumCircuit(2, 2) # 2 qubits, 2 clbits @@ -32,36 +31,36 @@ function build_bell() end function build_chain_target(num_qubits) - target = Qiskit.Target(num_qubits) + target = Target(num_qubits) # Add 1q basis gates for gate in (QkGate_X, QkGate_SX, QkGate_RZ) - entry = Qiskit.target_entry_gate(gate) + entry = target_entry_gate(gate) for i in 1:num_qubits error = 0.8e-6 * i duration = 1.8e-9 * i - qk_target_entry_add_property(entry, [i], duration, error) + add_property!(entry, [i], duration, error) end - qk_target_add_instruction(target, entry) + add_instruction!(target, entry) end # Add 2q basis gate (ECR) - ecr_entry = Qiskit.target_entry_gate(QkGate_ECR) + ecr_entry = target_entry_gate(QkGate_ECR) for i in 1:num_qubits-1 inst_error = 0.0090393 * (num_qubits - i + 1) inst_duration = 0.020039 - qk_target_entry_add_property(ecr_entry, [i, i + 1], inst_duration, inst_error) + add_property!(ecr_entry, [i, i + 1], inst_duration, inst_error) end - qk_target_add_instruction(target, ecr_entry) + add_instruction!(target, ecr_entry) # Add measurement instruction - meas_entry = Qiskit.target_entry_measure() + meas_entry = target_entry_measure() for i in 1:num_qubits error = 0.0 duration = 0.0 - qk_target_entry_add_property(meas_entry, [i], duration, error) + add_property!(meas_entry, [i], duration, error) end - qk_target_add_instruction(target, meas_entry) + add_instruction!(target, meas_entry) return target end diff --git a/src/target.jl b/src/target.jl index 4efe40f..4dca12f 100644 --- a/src/target.jl +++ b/src/target.jl @@ -179,6 +179,42 @@ function Base.show(io::IO, ::MIME"text/plain", obj::Target) end end +""" + add_property!(entry::TargetEntry, qubits, duration, error) + +Add a property to a `TargetEntry` for the given `qubits` with specified +`duration` and `error`. Mutates and returns `entry`. + +# Examples +```julia +entry = target_entry_gate(QkGate_X) +add_property!(entry, [1], 1.8e-9, 0.8e-6) +``` +""" +function add_property!(entry::TargetEntry, qubits::AbstractVector{<:Integer}, duration::Real, error::Real)::TargetEntry + qk_target_entry_add_property(entry, qubits, duration, error) + return entry +end + +""" + add_instruction!(target::Target, entry::TargetEntry) + +Add a gate or instruction `entry` to a `Target`. This consumes `entry`; do not +use it afterward. Mutates and returns `target`. + +# Examples +```julia +target = Target(5) +entry = target_entry_gate(QkGate_X) +add_property!(entry, [1], 1.8e-9, 0.8e-6) +add_instruction!(target, entry) +``` +""" +function add_instruction!(target::Target, entry::TargetEntry)::Target + qk_target_add_instruction(target, entry) + return target +end + function qk_target_add_instruction(target::Target, entry::TargetEntry)::Nothing qk_target_add_instruction(target.ptr, entry.ptr) entry.ptr = C_NULL @@ -187,4 +223,5 @@ end #qk_target_update_property -@compat public Target, target_entry_gate, target_entry_fixed, target_entry_measure, target_entry_reset +export Target, TargetEntry, target_entry_gate, target_entry_fixed, target_entry_measure, target_entry_reset +export add_property!, add_instruction! diff --git a/test/test_transpiler.jl b/test/test_transpiler.jl index 92fb947..3142330 100644 --- a/test/test_transpiler.jl +++ b/test/test_transpiler.jl @@ -14,39 +14,39 @@ @testset "transpile_bv" begin # Julia translation of qiskit-sdk/test/c/test_transpiler.c num_qubits = 10 - target = Qiskit.Target(num_qubits) + target = Target(num_qubits) - x_entry = Qiskit.target_entry_gate(QkGate_X) + x_entry = target_entry_gate(QkGate_X) for i in 1:num_qubits error = 0.8e-6 * i duration = 1.8e-9 * i - qk_target_entry_add_property(x_entry, [i], duration, error) + add_property!(x_entry, [i], duration, error) end - qk_target_add_instruction(target, x_entry) + add_instruction!(target, x_entry) - sx_entry = Qiskit.target_entry_gate(QkGate_SX) + sx_entry = target_entry_gate(QkGate_SX) for i in 1:num_qubits error = 0.8e-6 * i duration = 1.8e-9 * i - qk_target_entry_add_property(sx_entry, [i], duration, error) + add_property!(sx_entry, [i], duration, error) end - qk_target_add_instruction(target, sx_entry) + add_instruction!(target, sx_entry) - rz_entry = Qiskit.target_entry_gate(QkGate_RZ) + rz_entry = target_entry_gate(QkGate_RZ) for i in 1:num_qubits error = 0.0 duration = 0.0 - qk_target_entry_add_property(rz_entry, [i], duration, error) + add_property!(rz_entry, [i], duration, error) end - qk_target_add_instruction(target, rz_entry) + add_instruction!(target, rz_entry) - ecr_entry = Qiskit.target_entry_gate(QkGate_ECR) + ecr_entry = target_entry_gate(QkGate_ECR) for i in 1:num_qubits-1 inst_error = 0.0090393 * (num_qubits - i + 1) inst_duration = 0.020039 - qk_target_entry_add_property(ecr_entry, [i, i + 1], inst_duration, inst_error) + add_property!(ecr_entry, [i, i + 1], inst_duration, inst_error) end - qk_target_add_instruction(target, ecr_entry) + add_instruction!(target, ecr_entry) qc = QuantumCircuit(num_qubits) qc.x(10) @@ -85,11 +85,11 @@ end @testset "Base.show for TranspileResult and TranspileLayout" begin - target = Qiskit.Target(2) - h_entry = Qiskit.target_entry_gate(QkGate_H) - qk_target_entry_add_property(h_entry, [1], 0.0, 0.0) - qk_target_entry_add_property(h_entry, [2], 0.0, 0.0) - qk_target_add_instruction(target, h_entry) + target = Target(2) + h_entry = target_entry_gate(QkGate_H) + add_property!(h_entry, [1], 0.0, 0.0) + add_property!(h_entry, [2], 0.0, 0.0) + add_instruction!(target, h_entry) qc = QuantumCircuit(2) qc.h(1)