use hdr::*;
use {ReqCmd, Request, XtraHdr, RspInfo, Response, EprInfo};
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct RemoteId {
pub remote_app_id: u16,
pub remote_node: u32,
pub remote_port: u16,
}
pub struct Client {
app_id: u16,
}
impl Client {
#[inline]
pub fn new(app_id: u16) -> Self {
Client { app_id }
}
fn build(&self, msg_type: MsgType, req_cmd: Option<ReqCmd>) -> Request {
let cqc_hdr = CqcHdr {
version: Version::V2,
msg_type: msg_type,
app_id: self.app_id,
length: match req_cmd {
Some(ref req) => req.len(),
None => 0,
},
};
Request { cqc_hdr, req_cmd }
}
#[inline]
pub fn hello(&self) -> Request {
self.build(MsgType::Tp(Tp::Hello), None)
}
#[inline]
pub fn get_time(&self, qubit_id: u16) -> Request {
let req_cmd = self.build_req_cmd(qubit_id, Cmd::I, CmdOpt::empty(), XtraHdr::None);
self.build(MsgType::Tp(Tp::GetTime), Some(req_cmd))
}
fn command(&self, req_cmd: ReqCmd) -> Request {
self.build(MsgType::Tp(Tp::Command), Some(req_cmd))
}
#[inline]
pub fn cmd_i(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::I, options, XtraHdr::None))
}
#[inline]
pub fn cmd_new(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::New, options, XtraHdr::None))
}
#[inline]
pub fn cmd_measure(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Measure, options, XtraHdr::None))
}
#[inline]
pub fn cmd_measure_inplace(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::MeasureInplace, options, XtraHdr::None))
}
#[inline]
pub fn cmd_reset(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Reset, options, XtraHdr::None))
}
#[inline]
pub fn cmd_send(&self, qubit_id: u16, options: CmdOpt, remote_id: RemoteId) -> Request {
let xtra_hdr = self.xtra_remote_node(remote_id);
self.command(self.build_req_cmd(qubit_id, Cmd::Send, options, xtra_hdr))
}
#[inline]
pub fn cmd_recv(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Recv, options, XtraHdr::None))
}
#[inline]
pub fn cmd_epr(&self, qubit_id: u16, options: CmdOpt, remote_id: RemoteId) -> Request {
let xtra_hdr = self.xtra_remote_node(remote_id);
self.command(self.build_req_cmd(qubit_id, Cmd::Epr, options, xtra_hdr))
}
#[inline]
pub fn cmd_epr_recv(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::EprRecv, options, XtraHdr::None))
}
#[inline]
pub fn cmd_x(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::X, options, XtraHdr::None))
}
#[inline]
pub fn cmd_z(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Z, options, XtraHdr::None))
}
#[inline]
pub fn cmd_y(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Y, options, XtraHdr::None))
}
#[inline]
pub fn cmd_t(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::T, options, XtraHdr::None))
}
#[inline]
pub fn cmd_rot_x(&self, qubit_id: u16, options: CmdOpt, steps: u8) -> Request {
let xtra_hdr = self.xtra_rotation_angle(steps);
self.command(self.build_req_cmd(qubit_id, Cmd::RotX, options, xtra_hdr))
}
#[inline]
pub fn cmd_rot_y(&self, qubit_id: u16, options: CmdOpt, steps: u8) -> Request {
let xtra_hdr = self.xtra_rotation_angle(steps);
self.command(self.build_req_cmd(qubit_id, Cmd::RotY, options, xtra_hdr))
}
#[inline]
pub fn cmd_rot_z(&self, qubit_id: u16, options: CmdOpt, steps: u8) -> Request {
let xtra_hdr = self.xtra_rotation_angle(steps);
self.command(self.build_req_cmd(qubit_id, Cmd::RotZ, options, xtra_hdr))
}
#[inline]
pub fn cmd_h(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::H, options, XtraHdr::None))
}
#[inline]
pub fn cmd_k(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::K, options, XtraHdr::None))
}
#[inline]
pub fn cmd_cnot(&self, qubit_id: u16, options: CmdOpt, target_qubit_id: u16) -> Request {
let xtra_hdr = self.xtra_target_qubit(target_qubit_id);
self.command(self.build_req_cmd(qubit_id, Cmd::Cnot, options, xtra_hdr))
}
#[inline]
pub fn cmd_cphase(&self, qubit_id: u16, options: CmdOpt, target_qubit_id: u16) -> Request {
let xtra_hdr = self.xtra_target_qubit(target_qubit_id);
self.command(self.build_req_cmd(qubit_id, Cmd::Cphase, options, xtra_hdr))
}
fn build_req_cmd(
&self,
qubit_id: u16,
instr: Cmd,
options: CmdOpt,
xtra_hdr: XtraHdr,
) -> ReqCmd {
let cmd_hdr = CmdHdr {
qubit_id,
instr,
options,
};
ReqCmd { cmd_hdr, xtra_hdr }
}
fn xtra_remote_node(&self, remote_id: RemoteId) -> XtraHdr {
XtraHdr::Comm(CommHdr {
remote_app_id: remote_id.remote_app_id,
remote_node: remote_id.remote_node,
remote_port: remote_id.remote_port,
})
}
fn xtra_rotation_angle(&self, step: u8) -> XtraHdr {
XtraHdr::Rot(RotHdr { step })
}
fn xtra_target_qubit(&self, qubit_id: u16) -> XtraHdr {
XtraHdr::Qubit(QubitHdr { qubit_id })
}
}
pub struct Server {
app_id: u16,
}
impl Server {
#[inline]
pub fn new(app_id: u16) -> Self {
Server { app_id }
}
fn build(&self, msg_type: MsgType, notify: RspInfo) -> Response {
let cqc_hdr = CqcHdr {
version: Version::V2,
msg_type: msg_type,
app_id: self.app_id,
length: notify.len(),
};
Response { cqc_hdr, notify }
}
#[inline]
pub fn expire(&self, qubit_id: u16) -> Response {
let notify = self.rsp_info_qubit(qubit_id);
self.build(MsgType::Tp(Tp::Expire), notify)
}
#[inline]
pub fn done(&self) -> Response {
self.build(MsgType::Tp(Tp::Done), RspInfo::None)
}
#[inline]
pub fn recv(&self, qubit_id: u16) -> Response {
let notify = self.rsp_info_qubit(qubit_id);
self.build(MsgType::Tp(Tp::Recv), notify)
}
#[inline]
pub fn epr_ok(&self, qubit_id: u16, ent_info: EntInfoHdr) -> Response {
let notify = self.rsp_info_epr(qubit_id, ent_info);
self.build(MsgType::Tp(Tp::EprOk), notify)
}
#[inline]
pub fn meas_out(&self, meas_out: MeasOut) -> Response {
let notify = self.rsp_info_meas_out(meas_out);
self.build(MsgType::Tp(Tp::MeasOut), notify)
}
#[inline]
pub fn inf_time(&self, datetime: u64) -> Response {
let notify = self.rsp_info_time_info(datetime);
self.build(MsgType::Tp(Tp::InfTime), notify)
}
#[inline]
pub fn new_ok(&self, qubit_id: u16) -> Response {
let notify = self.rsp_info_qubit(qubit_id);
self.build(MsgType::Tp(Tp::NewOk), notify)
}
fn rsp_info_qubit(&self, qubit_id: u16) -> RspInfo {
RspInfo::Qubit(QubitHdr { qubit_id })
}
fn rsp_info_meas_out(&self, meas_out: MeasOut) -> RspInfo {
RspInfo::MeasOut(MeasOutHdr { meas_out })
}
fn rsp_info_epr(&self, qubit_id: u16, ent_info: EntInfoHdr) -> RspInfo {
RspInfo::Epr(
EprInfo {
qubit_hdr: QubitHdr { qubit_id },
ent_info_hdr: ent_info,
}
)
}
fn rsp_info_time_info(&self, datetime: u64) -> RspInfo {
RspInfo::Time(TimeInfoHdr { datetime })
}
}