litex/parse/
parse_param_def.rs1use crate::prelude::*;
2
3impl Runtime {
4 pub fn parse_param_def_with_param_type_and_skip_comma(
9 &mut self,
10 tb: &mut TokenBlock,
11 free_param_kind: ParamObjType,
12 ) -> Result<ParamGroupWithParamType, RuntimeError> {
13 let param = tb.advance()?;
14 let owned = param.clone();
15 self.parsing_free_param_collection.begin_scope(
16 free_param_kind,
17 std::slice::from_ref(&owned),
18 tb.line_file.clone(),
19 )?;
20 let param_def_with_param_type = if tb.current()? != COMMA {
21 ParamGroupWithParamType::new(vec![param], self.parse_param_type(tb)?)
22 } else {
23 let mut vec_of_params = vec![param];
24
25 while tb.current_token_is_equal_to(COMMA) {
26 tb.skip()?;
27 let p = tb.advance()?;
28 let owned = p.clone();
29 self.parsing_free_param_collection.begin_scope(
30 free_param_kind,
31 std::slice::from_ref(&owned),
32 tb.line_file.clone(),
33 )?;
34 vec_of_params.push(p);
35 }
36 let param_type = self.parse_param_type(tb)?;
37
38 ParamGroupWithParamType::new(vec_of_params, param_type)
39 };
40 if tb.current_token_is_equal_to(COMMA) {
41 tb.skip_token(COMMA)?;
42 }
43 Ok(param_def_with_param_type)
44 }
45
46 pub fn parse_param_type(&mut self, tb: &mut TokenBlock) -> Result<ParamType, RuntimeError> {
47 match tb.current()? {
48 NONEMPTY_SET => self.parse_param_type_nonempty_set(tb),
49 FINITE_SET => self.parse_param_type_finite_set(tb),
50 SET => self.parse_param_type_set(tb),
51 s if s == FAMILY_OBJ_PREFIX => self
52 .parse_family_obj(tb)
53 .map(|f| ParamType::Obj(Obj::FamilyObj(f))),
54 _ => self.parse_param_type_obj(tb),
55 }
56 }
57
58 pub fn parse_param_type_nonempty_set(
59 &self,
60 tb: &mut TokenBlock,
61 ) -> Result<ParamType, RuntimeError> {
62 tb.skip_token(NONEMPTY_SET)?;
63 Ok(ParamType::NonemptySet(NonemptySet::new()))
64 }
65
66 pub fn parse_param_type_finite_set(
67 &self,
68 tb: &mut TokenBlock,
69 ) -> Result<ParamType, RuntimeError> {
70 tb.skip_token(FINITE_SET)?;
71 Ok(ParamType::FiniteSet(FiniteSet::new()))
72 }
73
74 pub fn parse_param_type_set(&self, tb: &mut TokenBlock) -> Result<ParamType, RuntimeError> {
75 tb.skip_token(SET)?;
76 Ok(ParamType::Set(Set::new()))
77 }
78
79 pub fn parse_param_type_obj(&mut self, tb: &mut TokenBlock) -> Result<ParamType, RuntimeError> {
80 let obj = self.parse_obj(tb)?;
81 Ok(ParamType::Obj(obj))
82 }
83}