Skip to content
Draft
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
41 changes: 41 additions & 0 deletions examples/lir/bqc/bqc_5_5_client.lhr
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
delta1_discrete = assign_cval() : 1
delta2_discrete = assign_cval() : 1

run_subroutine(vec<theta_discrete>) :
return M0 -> p1
NETQASM_START
set C0 0
set C1 1
set C2 2
set C10 10
set C11 20
array C10 @0
array C1 @1
store C0 @1[C0]
array C11 @2
store C0 @2[C0]
store C1 @2[C1]
set R5 0
set R6 0
set R7 1
set R8 0
create_epr C1 C0 C1 C2 C0
wait_all @0[C0:C11]
set Q0 0
rot_z Q0 {theta_discrete} 4
rot_y Q0 8 4
rot_x Q0 16 4
meas Q0 M0
qfree Q0
ret_reg M0
NETQASM_END

p1 = mult_const(p1, 16)
delta1 = add_cval_c(delta1_discrete, p1)
send_cmsg(delta1)
m1 = recv_cmsg()

delta2 = bcond_mult_const(delta2_discrete, -1, m1)
send_cmsg(delta2)

return_result(p1)
96 changes: 96 additions & 0 deletions examples/lir/bqc/bqc_5_5_nv_raw_lhr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
from __future__ import annotations

import math
import os
from typing import List

from netqasm.sdk.epr_socket import EPRSocket

from squidasm.qoala.lang import lhr as lp
from squidasm.qoala.runtime.config import (
LinkConfig,
NVQDeviceConfig,
StackConfig,
StackNetworkConfig,
)
from squidasm.qoala.runtime.program import ProgramContext, ProgramInstance, SdkProgram
from squidasm.qoala.runtime.run import run
from squidasm.qoala.sim.common import LogManager
from squidasm.qoala.sim.netstack import EprSocket

PI = math.pi
PI_OVER_2 = math.pi / 2


def computation_round(
cfg: StackNetworkConfig,
num_times: int = 1,
alpha: float = 0.0,
beta: float = 0.0,
theta1: float = 0.0,
) -> None:
# TODO: use alpha, beta to calculate delta1_discrete etc.

client_lhr_file = os.path.join(os.path.dirname(__file__), "bqc_5_5_client.lhr")
with open(client_lhr_file) as file:
client_lhr_text = file.read()
client_program = lp.LhrParser(client_lhr_text).parse()
client_program.meta = lp.ProgramMeta(
name="client_program",
parameters=["alpha", "beta", "theta1", "r1"],
csockets=["server"],
epr_sockets=["server"],
max_qubits=2,
)

server_lhr_file = os.path.join(os.path.dirname(__file__), "bqc_5_5_server.lhr")
with open(server_lhr_file) as file:
server_lhr_text = file.read()
server_program = lp.LhrParser(server_lhr_text).parse()
server_program.meta = lp.ProgramMeta(
name="server_program",
parameters={},
csockets=["client"],
epr_sockets=["client"],
max_qubits=2,
)

client_instance = ProgramInstance(client_program, {"theta_discrete": 0}, 1, 0)
server_instance = ProgramInstance(server_program, {}, 1, 0)

_, server_results = run(
cfg, {"client": client_instance, "server": server_instance}, num_times=num_times
)

m2s = [result["m2"] for result in server_results]
num_zeros = len([m for m in m2s if m == 0])
frac0 = round(num_zeros / num_times, 2)
frac1 = 1 - frac0
print(f"dist (0, 1) = ({frac0}, {frac1})")


if __name__ == "__main__":
num_times = 1

LogManager.set_log_level("DEBUG")
LogManager.log_to_file("dump.log")

sender_stack = StackConfig(
name="client",
qdevice_typ="nv",
qdevice_cfg=NVQDeviceConfig.perfect_config(),
)
receiver_stack = StackConfig(
name="server",
qdevice_typ="nv",
qdevice_cfg=NVQDeviceConfig.perfect_config(),
)
link = LinkConfig(
stack1="client",
stack2="server",
typ="perfect",
)

cfg = StackNetworkConfig(stacks=[sender_stack, receiver_stack], links=[link])

computation_round(cfg, num_times, alpha=PI_OVER_2, beta=PI_OVER_2)
99 changes: 99 additions & 0 deletions examples/lir/bqc/bqc_5_5_server.lhr
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
run_subroutine(vec<>) :
NETQASM_START
set C0 0
set C1 1
set C10 10
array C10 @0
array C1 @1
store C0 @1[C0]
set R5 0
set R6 0
set R7 1
set R8 0
recv_epr C0 C0 C1 C0
set R0 0
LABEL7:
set R5 1
beq R0 R5 LABEL1
set R1 0
set R2 0
set R3 0
set R4 0
LABEL6:
set R5 10
beq R4 R5 LABEL5
add R1 R1 R0
set R5 1
add R4 R4 R5
jmp LABEL6
LABEL5:
set R5 1
add R2 R0 R5
set R4 0
LABEL4:
set R5 10
beq R4 R5 LABEL3
add R3 R3 R2
set R5 1
add R4 R4 R5
jmp LABEL4
LABEL3:
wait_all @0[R1:R3]
set R5 0
beq R0 R5 LABEL2
set R5 0
sub R1 R5 R0
rot_y C0 8 4
crot_y C0 R1 24 4
rot_x C0 24 4
crot_x C0 R1 8 4
qfree C0
LABEL2:
set R5 1
add R0 R0 R5
jmp LABEL7
LABEL1:
qalloc C1
init C1
rot_y C1 8 4
rot_x C1 16 4
rot_y C1 8 4
crot_x C0 C1 8 4
rot_z C0 24 4
rot_x C1 24 4
rot_y C1 24 4
ret_arr @0
ret_arr @1
NETQASM_END

delta1 = recv_cmsg()

run_subroutine(vec<delta1>) :
return M0 -> m1
NETQASM_START
set Q0 0
rot_z Q0 {delta1} 4
rot_y Q0 8 4
rot_x Q0 16 4
meas Q0 M0
qfree Q0
ret_reg M0
NETQASM_END

send_cmsg(m1)
delta2 = recv_cmsg()

run_subroutine(vec<delta2>) :
return M0 -> m2
NETQASM_START
set Q1 1
rot_z Q1 {delta2} 4
rot_y Q1 8 4
rot_x Q1 16 4
meas Q1 M0
qfree Q1
ret_reg M0
NETQASM_END

return_result(m1)
return_result(m2)
Loading