topstitch/intf/
feedthrough.rs

1// SPDX-License-Identifier: Apache-2.0
2
3use 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}