From fb0fcff3e5c9bbe813096bbb600a3c9a70b9cdd5 Mon Sep 17 00:00:00 2001 From: Arsh <184517@nith.ac.in> Date: Sat, 29 May 2021 17:25:46 +0530 Subject: [PATCH 1/2] qasm to blocks implementation --- src/blocks.jl | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/blocks.jl diff --git a/src/blocks.jl b/src/blocks.jl new file mode 100644 index 0000000..e4f9c8e --- /dev/null +++ b/src/blocks.jl @@ -0,0 +1,61 @@ +macro qasm_str(s::String) + s = Meta.parse("\"\"\"\n$s\"\"\"") + s isa String && return esc(qasm_str_m(__module__, __source__, s)) +end + +function qasm_str_m(m::Module, lino::LineNumberNode, src::String) + ast = OpenQASM.parse(src) + return toblocks(m, lino, ast) +end + +function toblocks(m::Module, lino::LineNumberNode, ast::MainProgram) + code = Expr(:block) + blocks = [] + for stmt in ast.prog + if stmt isa Types.Gate + push!(blocks, toblocks(stmt)) + end + end + return code +end + +function toblocks(gate::OpenQASM.Types.Gate) + name = stmt.decl.name.str + + if name == "u1" + U1(params...) + # elseif name == "u2" + # if isapprox(params, [0, π]) + # H + # else + # U2(params...) + # end + elseif name == "u3" + quote + function toblocks(stmt.decl::OpenQASM.Types.GateDecl) + # put(locs, Some block) + end + end + # if isapprox(params[2], -π / 2) && isapprox(params[3], π / 2) + # Rx(params[1]) + # elseif params[2] == 0 && params[3] == 0 + # Ry(params[1]) + # else + # U3(params...) + # end + # elseif name == "id" + # I2 + # elseif name == "x" + # X + # elseif name == "y" + # Y + # elseif name == "z" + # Z + # elseif name == "t" + # T + # elseif name == "swap" + # SWAP + # else + # error("gate type `$name` not defined!") + end +end From 155c258545bbf95e3afc1cf4a148af9c197b0979 Mon Sep 17 00:00:00 2001 From: Arsh <184517@nith.ac.in> Date: Sat, 29 May 2021 23:42:08 +0530 Subject: [PATCH 2/2] Inital macro impelmentation --- Project.toml | 1 + src/YaoBlocksQASM.jl | 1 + src/blocks.jl | 175 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 144 insertions(+), 33 deletions(-) diff --git a/Project.toml b/Project.toml index fea96b0..bd82009 100644 --- a/Project.toml +++ b/Project.toml @@ -6,6 +6,7 @@ version = "0.1.0" [deps] OpenQASM = "a8821629-a4c0-4df7-9e00-12969ff383a7" YaoBlocks = "418bc28f-b43b-5e0b-a6e7-61bbc1a2c1df" +YaoBlocksQobj = "8d6e117e-3ad9-4058-9567-0848b2080ffe" [compat] OpenQASM = "2.1" diff --git a/src/YaoBlocksQASM.jl b/src/YaoBlocksQASM.jl index dfbac70..f631a02 100644 --- a/src/YaoBlocksQASM.jl +++ b/src/YaoBlocksQASM.jl @@ -5,5 +5,6 @@ export convert_to_qasm using YaoBlocks include("qasm.jl") +include("blocks.jl") end diff --git a/src/blocks.jl b/src/blocks.jl index e4f9c8e..295df53 100644 --- a/src/blocks.jl +++ b/src/blocks.jl @@ -1,3 +1,5 @@ +using OpenQASM + macro qasm_str(s::String) s = Meta.parse("\"\"\"\n$s\"\"\"") s isa String && return esc(qasm_str_m(__module__, __source__, s)) @@ -16,46 +18,153 @@ function toblocks(m::Module, lino::LineNumberNode, ast::MainProgram) push!(blocks, toblocks(stmt)) end end + + for each in blocks + push!(code.args, each) + end return code end function toblocks(gate::OpenQASM.Types.Gate) - name = stmt.decl.name.str + name = gate.decl.name.str if name == "u1" - U1(params...) - # elseif name == "u2" - # if isapprox(params, [0, π]) - # H - # else - # U2(params...) - # end + quote + function ($(Symbol(name)))(lambda) + U1(lambda) + end + end + elseif name == "u2" + quote + function ($(Symbol(name)))(phi, lambda) + U2(phi, lambda) + end + end elseif name == "u3" quote - function toblocks(stmt.decl::OpenQASM.Types.GateDecl) - # put(locs, Some block) - end - end - # if isapprox(params[2], -π / 2) && isapprox(params[3], π / 2) - # Rx(params[1]) - # elseif params[2] == 0 && params[3] == 0 - # Ry(params[1]) - # else - # U3(params...) - # end - # elseif name == "id" - # I2 - # elseif name == "x" - # X - # elseif name == "y" - # Y - # elseif name == "z" - # Z - # elseif name == "t" - # T - # elseif name == "swap" - # SWAP - # else - # error("gate type `$name` not defined!") + function ($(Symbol(name)))(theta, phi, lambda) + U3(theta, phi, lambda) + end + end + elseif name == "cx" + quote + function ($(Symbol(name)))(ctrl, target) + control(ctrl, target=>X) + end + end + elseif name == "id" + quote + function ($(Symbol(name)))() + I2Gate() + end + end + elseif name == "x" + quote + function ($(Symbol(name)))() + XGate() + end + end + elseif name == "y" + quote + function ($(Symbol(name)))() + YGate() + end + end + elseif name == "z" + quote + function ($(Symbol(name)))() + ZGate() + end + end + elseif name == "s" + quote + function ($(Symbol(name)))(theta) + ShiftGate(theta) + end + end + elseif name == "sdg" + quote + function ($(Symbol(name)))(theta) + Daggered(ShiftGate(theta)) + end + end + elseif name == "h" + quote + function ($(Symbol(name)))() + HGate() + end + end + elseif name == "t" + quote + function ($(Symbol(name)))() + TGate() + end + end + elseif name == "tdg" + quote + function ($(Symbol(name)))() + Daggered(T) + end + end + elseif name == "rx" + quote + function ($(Symbol(name)))(theta) + Rx(theta) + end + end + elseif name == "ry" + quote + function ($(Symbol(name)))(theta) + Ry(theta) + end + end + elseif name == "rz" + quote + function ($(Symbol(name)))(theta) + Rz(theta) + end + end + elseif name == "cy" + quote + function ($(Symbol(name)))(ctrl, target::Pair) + control(ctrl, target=>Y) + end + end + elseif name == "cz" + quote + function ($(Symbol(name)))(ctrl, target::Pair) + control(ctrl, target=>Z) + end + end + elseif name == "ch" + quote + function ($(Symbol(name)))(ctrl, target::Pair) + control(ctrl, target=>H) + end + end + elseif name == "ccx" + quote + function ($(Symbol(name)))(ctrl::Tuple, target) + control(ctrl, target=>X) + end + end + elseif name == "crz" + quote + function ($(Symbol(name)))(ctrl, target, theta) + control(ctrl, target=>Rz(theta)) + end + end + elseif name == "cu1" + quote + function ($(Symbol(name)))(ctrl, target, theta) + control(ctrl, target=>PhaseGate(theta)) + end + end + elseif name == "cu3" + quote + function ($(Symbol(name)))(ctrl, target, theta, phi, lambda) + control(ctrl, target=>U3(theta, phi, lambda)) + end + end end end