topstitch/intf/
feedthrough.rs1use indexmap::IndexMap;
4
5use crate::{ConvertibleToModDef, Intf, PipelineConfig};
6
7impl Intf {
8 pub fn feedthrough(
9 &self,
10 mod_def_or_mod_inst: &impl ConvertibleToModDef,
11 flipped: impl AsRef<str>,
12 original: impl AsRef<str>,
13 ) -> (Intf, Intf) {
14 self.feedthrough_generic(mod_def_or_mod_inst, flipped, original, None)
15 }
16
17 pub fn feedthrough_pipeline(
18 &self,
19 mod_def_or_mod_inst: &impl ConvertibleToModDef,
20 flipped: impl AsRef<str>,
21 original: impl AsRef<str>,
22 pipeline: PipelineConfig,
23 ) -> (Intf, Intf) {
24 self.feedthrough_generic(mod_def_or_mod_inst, flipped, original, Some(pipeline))
25 }
26
27 pub(crate) fn feedthrough_generic(
28 &self,
29 mod_def_or_mod_inst: &impl ConvertibleToModDef,
30 flipped: impl AsRef<str>,
31 original: impl AsRef<str>,
32 pipeline: Option<PipelineConfig>,
33 ) -> (Intf, Intf) {
34 let mut flipped_mapping = IndexMap::new();
35 let mut original_mapping = IndexMap::new();
36
37 for (func_name, port_slice) in self.get_port_slices() {
38 let flipped_func = format!("{}_{}", flipped.as_ref(), func_name);
39 let original_func = format!("{}_{}", original.as_ref(), func_name);
40
41 let (flipped_port, original_port) = port_slice.feedthrough_generic(
42 mod_def_or_mod_inst,
43 flipped_func,
44 original_func,
45 pipeline.clone(),
46 );
47
48 flipped_mapping.insert(
49 func_name.clone(),
50 (flipped_port.get_port_name(), port_slice.width() - 1, 0),
51 );
52 original_mapping.insert(
53 func_name.clone(),
54 (original_port.get_port_name(), port_slice.width() - 1, 0),
55 );
56 }
57
58 mod_def_or_mod_inst
59 .to_mod_def()
60 .def_intf(&flipped, flipped_mapping);
61 mod_def_or_mod_inst
62 .to_mod_def()
63 .def_intf(&original, original_mapping);
64
65 (
66 mod_def_or_mod_inst.get_intf(&flipped),
67 mod_def_or_mod_inst.get_intf(&original),
68 )
69 }
70}