source_generator/vhdl/
generic_list.rs1use crate::element::Element;
2use crate::element::to_source_code_list;
3use crate::vhdl::generic::Generic;
4use crate::vhdl::keywords::GENERIC;
5
6pub struct GenericList {
7 generics : Vec< Box< dyn Element > >
8}
9
10impl GenericList {
11 pub fn new() -> GenericList {
12 GenericList { generics : Vec::new() }
13 }
14
15 pub fn add_generic( & mut self, generic : Generic ) {
16 self.generics.push( Box::new( generic ) );
17 }
18}
19
20impl Element for GenericList {
21 fn to_source_code( & self, indent : usize ) -> String {
22 let mut source = String::new();
23 if self.generics.is_empty() {
24 return source;
25 }
26
27 let indent_str = crate::util::indent( indent + 1 );
28 let list_indent_str = crate::util::indent( indent + 2 );
29 let list = to_source_code_list( & self.generics, & format!( ";\n{}", list_indent_str ) );
30 source.push_str( & format!( "{}{} (\n{}{}\n{});\n", indent_str, GENERIC, list_indent_str,
31 list, indent_str ) );
32 return source;
33 }
34}
35
36#[cfg(test)]
38mod tests {
39 use super::*;
40
41 const GENERICS : &'static str = concat!( " generic (\n", " a : integer := 0;\n",
42 " b : std_logic := '0';\n", " c : boolean\n", " );\n" );
43
44 #[test]
48 fn generic_list() {
49 let mut generic_list = GenericList::new();
50 generic_list.add_generic( Generic::new_with_default( "a", "integer", "0" ) );
51 generic_list.add_generic( Generic::new_with_default( "b", "std_logic", "'0'" ) );
52 generic_list.add_generic( Generic::new( "c", "boolean" ) );
53
54 assert_eq!(
55 generic_list.to_source_code( 0 ),
56 format!( "{}", GENERICS )
57 );
58 }
59}
60