Skip to main content

litex/common/
mangled_fn_param.rs

1use crate::obj::Obj;
2use std::collections::HashMap;
3
4/// Turn user-written parameter names into prefixed storage names (e.g. `x` -> `__x`).
5pub fn mangled_fn_param_names(user_written_names: &[String], prefix: &str) -> Vec<String> {
6    user_written_names
7        .iter()
8        .map(|u| format!("{}{}", prefix, u))
9        .collect()
10}
11
12/// `user_name -> Identifier(mangled)` for `inst_obj` / `inst_*` substitution.
13pub fn fn_param_substitution_map(
14    user_written_names: &[String],
15    mangled_names: &[String],
16) -> HashMap<String, Obj> {
17    debug_assert_eq!(user_written_names.len(), mangled_names.len());
18    let mut map = HashMap::with_capacity(user_written_names.len());
19    for (u, m) in user_written_names.iter().zip(mangled_names.iter()) {
20        map.insert(u.clone(), m.clone().into());
21    }
22    map
23}
24
25/// Build mangled names and substitution map; `prefix` is usually `DEFAULT_MANGLED_FN_PARAM_PREFIX`.
26pub fn mangled_fn_param_binding(
27    user_written_names: &[String],
28    prefix: &str,
29) -> (Vec<String>, HashMap<String, Obj>) {
30    let mangled = mangled_fn_param_names(user_written_names, prefix);
31    let map = fn_param_substitution_map(user_written_names, &mangled);
32    (mangled, map)
33}