Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
39 changes: 38 additions & 1 deletion src/target.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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!
36 changes: 18 additions & 18 deletions test/test_transpiler.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
Loading