Skip to main content

litex/common/
mangled_fn_param.rs

1use crate::obj::{Identifier, Obj};
2use std::collections::HashMap;
3
4/// 将用户写的形参名转为带前缀的存储名(如 `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)`,供 `inst_obj` / `inst_*` 替换。
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(), Obj::Identifier(Identifier::new(m.clone())));
21    }
22    map
23}
24
25/// 生成存储名列表与替换表;`prefix` 通常取 `crate::common::defaults::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}