1use crate::graph::Graph;
7use crate::output::Output;
8use bb_ir::proto::onnx::NodeProto;
9
10pub mod ids {
16 pub use bb_ir::syscall_ids::{
17 OP_GATE_DISPATCH as GATE_DISPATCH_OP, OP_PASS_THROUGH as PASS_THROUGH_OP, SYSCALL_DOMAIN,
18 };
19}
20
21const ADDRESS_BOOK_DOMAIN: &str = "ai.bytesandbrains.address_book";
26const INSERT_MANY_OP: &str = "InsertMany";
27const LOOKUP_OP: &str = "Lookup";
28
29pub fn pass_through(g: &mut Graph, input: Output) -> Output {
38 let out_name = g.next_site_name();
39 g.push_node(NodeProto {
40 op_type: ids::PASS_THROUGH_OP.into(),
41 domain: ids::SYSCALL_DOMAIN.into(),
42 input: vec![input.name],
43 output: vec![out_name.clone()],
44 ..Default::default()
45 });
46 g.declare_value_info(&out_name, input.type_node);
47 Output::new(out_name, input.type_node)
48}
49
50pub fn address_book_insert_many(g: &mut Graph, peer: Output, addresses: Output) -> Output {
56 let out_name = g.next_site_name();
57 g.push_node(NodeProto {
58 op_type: INSERT_MANY_OP.into(),
59 domain: ADDRESS_BOOK_DOMAIN.into(),
60 input: vec![peer.name, addresses.name],
61 output: vec![out_name.clone()],
62 ..Default::default()
63 });
64 g.declare_value_info(&out_name, &bb_ir::types::TYPE_TRIGGER);
65 Output::new(out_name, &bb_ir::types::TYPE_TRIGGER)
66}
67
68pub fn address_book_lookup(g: &mut Graph, peer: Output) -> Output {
73 let out_name = g.next_site_name();
74 g.push_node(NodeProto {
75 op_type: LOOKUP_OP.into(),
76 domain: ADDRESS_BOOK_DOMAIN.into(),
77 input: vec![peer.name],
78 output: vec![out_name.clone()],
79 ..Default::default()
80 });
81 g.declare_value_info(&out_name, &bb_ir::types::TYPE_ADDRESS_VEC);
82 Output::new(out_name, &bb_ir::types::TYPE_ADDRESS_VEC)
83}
84
85pub fn gate_dispatch(g: &mut Graph, inputs: &[Output]) -> Output {
88 let out_name = g.next_site_name();
89 g.push_node(NodeProto {
90 op_type: ids::GATE_DISPATCH_OP.into(),
91 domain: ids::SYSCALL_DOMAIN.into(),
92 input: inputs.iter().map(|o| o.name.clone()).collect(),
93 output: vec![out_name.clone()],
94 ..Default::default()
95 });
96 g.declare_value_info(&out_name, &bb_ir::types::TYPE_BYTES);
97 Output::new(out_name, &bb_ir::types::TYPE_BYTES)
98}