use hdr::*;
use {ReqCmd, Request, XtraHdr};
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct RemoteId {
pub remote_app_id: u16,
pub remote_node: u32,
pub remote_port: u16,
}
pub struct Builder {
app_id: u16,
}
impl Builder {
pub fn new(app_id: u16) -> Builder {
Builder { 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 }
}
pub fn hello(&self) -> Request {
self.build(MsgType::Tp(Tp::Hello), None)
}
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))
}
pub fn cmd_i(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::I, options, XtraHdr::None))
}
pub fn cmd_new(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(
qubit_id,
Cmd::New,
options,
XtraHdr::None,
))
}
pub fn cmd_measure(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(
qubit_id,
Cmd::Measure,
options,
XtraHdr::None,
))
}
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,
))
}
pub fn cmd_reset(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(
qubit_id,
Cmd::Reset,
options,
XtraHdr::None,
))
}
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))
}
pub fn cmd_recv(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(
qubit_id,
Cmd::Recv,
options,
XtraHdr::None,
))
}
pub fn cmd_epr(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(
qubit_id,
Cmd::Epr,
options,
XtraHdr::None,
))
}
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,
))
}
pub fn cmd_x(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::X, options, XtraHdr::None))
}
pub fn cmd_z(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Z, options, XtraHdr::None))
}
pub fn cmd_y(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::Y, options, XtraHdr::None))
}
pub fn cmd_t(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::T, options, XtraHdr::None))
}
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))
}
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))
}
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))
}
pub fn cmd_h(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::H, options, XtraHdr::None))
}
pub fn cmd_k(&self, qubit_id: u16, options: CmdOpt) -> Request {
self.command(self.build_req_cmd(qubit_id, Cmd::K, options, XtraHdr::None))
}
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))
}
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 })
}
}