@@ -16,6 +16,7 @@ export MultiControl, CNOT, CPHASE, SWAP, H, P, Id, U,
1616 ClassicalDecision,
1717 Measurement, ParityMeasurement,
1818 Noise, NoiseAll,
19+ Initialize,
1920 circuit2table, table2string,
2021 circuit2string,
2122 string2image,
@@ -151,19 +152,24 @@ function update_table!(qtable,step,g::MultiControlU)
151152 qtable
152153end
153154
154- function draw_rectangle! (table,step,targets,str)
155+ function draw_rectangle! (table,step,targets,str;checkdelete_evenfortarget = false )
155156 deleted = Int[]
156- m, M = explicit_extrema (table, targets) # TODO m M can be deduced from targets. They are not necessary here as arguments
157+ m, M = explicit_extrema (table, targets)
157158 targets = explicit_targets (table, targets)
158- for i in m+ 1 : M
159+ for i in m: M
159160 if i ∉ targets
160161 if strip (table[i,step- 1 ])== " "
161162 push! (deleted, i)
162163 else
163164 table[i,step] = " \\ linethrough"
164165 end
165166 else
166- table[i,step] = " \\ qw"
167+ if checkdelete_evenfortarget && strip (table[i,step- 1 ])== " "
168+ push! (deleted, i)
169+ i!= m && (table[i,step] = " " )
170+ else
171+ i!= m && (table[i,step] = " \\ qw" )
172+ end
167173 end
168174 end
169175 offset = iseven (M- m) && ((m+ M)/ 2 ∉ vcat (targets,deleted)) && ! occursin (" \\\\ " ,str) ? " ,label style={yshift=0.2cm}" : " "
@@ -243,6 +249,36 @@ nsteps(m::Measurement) = length(m.targets) > 1 ? 3 : 1
243249affectedbits (m:: Measurement ) = isnothing (m. bit) ? [] : [m. bit]
244250deleteoutputs (m:: Measurement ) = length (m. targets) == 1 ? m. targets : []
245251
252+ struct Initialize <: QuantikzOp
253+ str:: AbstractString
254+ targets:: AbstractVector
255+ end
256+
257+ affectedqubits (r:: Initialize ) = r. targets
258+ function update_table! (qtable,step,r:: Initialize )
259+ qvtable = qubitsview (qtable)
260+ m, M = extrema (r. targets)
261+ targets = r. targets
262+ if collect (targets) == collect (m: M)
263+ qvtable[m,step] = " \\ midstick[wires=$(M- m+ 1 ) ,brackets=right]{$(r. str) }"
264+ for i in targets[2 : end ]
265+ qvtable[i,step] = " "
266+ end
267+ else
268+ for i in targets
269+ qvtable[i,step] = " "
270+ end
271+ draw_rectangle! (qvtable, step+ 1 , r. targets, r. str, checkdelete_evenfortarget= true )
272+ end
273+ qtable
274+ end
275+ function nsteps (r:: Initialize )
276+ m, M = extrema (r. targets)
277+ targets = r. targets
278+ collect (targets) == collect (m: M) ? 1 : 2
279+ end
280+
281+
246282struct ClassicalDecision <: QuantikzOp
247283 str:: AbstractString
248284 targets:: ArrayOrRange
@@ -260,11 +296,9 @@ ClassicalDecision(t::ArrayOrRange, c::ArrayOrRange) = ClassicalDecision("\\;\\;"
260296affectedqubits (g:: ClassicalDecision ) = g. targets
261297affectedbits (g:: ClassicalDecision ) = g. bits
262298function update_table! (qtable,step,g:: ClassicalDecision )
263- table = qtable. table
264299 qvtable = qubitsview (qtable)
265300 bvtable = bitsview (qtable)
266301 m, M = explicit_extrema (qvtable, g. targets)
267- targets = explicit_targets (qvtable, g. targets)
268302 draw_rectangle! (qvtable,step,g. targets,g. str)
269303 bits = explicit_targets (bvtable, g. bits)
270304 startpoint = minimum (bits)
0 commit comments