]> AND Private Git Repository - blast.git/blob - lib/implementations/read_csv_impl.xml
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
80106000da4418e15ff5867329f9dc37e58ebdb1
[blast.git] / lib / implementations / read_csv_impl.xml
1 <!DOCTYPE read_csv>
2 <block_impl ref_name="read_csv.xml" ref_md5="">
3   <comments>
4     <author lastname="Domas" mail="sdomas@univ-fcomte.fr" firstname="stephane"/>
5     <date creation="2018-04-12"/>
6     <related_files list="" />
7     <description>read a csv file</description>
8     <notes>read a csv file</notes>
9   </comments>
10   <libraries>
11     <library name="ieee">
12       <package name="std_logic_1164" use="all"/>
13       <package name="numeric_std" use="all"/>
14     </library>
15     <library name="std">
16       <package name="textio" use="all"/>
17     </library>
18   </libraries>
19   <architecture>
20
21 file in_data : text open read_mode is in_file; -- the file to read
22 signal out_s : unsigned(item_width-1 downto 0); -- signed output
23
24 signal new_line : std_logic := '1'; -- '1' when a new line is read just after
25 -- another one (used in read_lines)
26
27 signal do_read : std_logic;
28 signal line_delay_s : unsigned(15 downto 0);
29 signal group_delay_s : unsigned(15 downto 0);
30
31
32 begin
33
34 line_delay_s &lt;= to_unsigned(line_delay-1, 16);
35 group_delay_s &lt;= to_unsigned(group_delay-1, 16);
36
37 @{out_val} &lt;= std_logic_vector(out_s);
38
39 read_data : process(@{reset}, @{clk})
40
41 variable l : line;
42 variable in_val : integer;
43 variable comma : character;
44 variable item_count : integer;
45 variable line_count : integer; -- to count lines until the last is reached
46 variable last_line : std_logic;
47 variable dly_item_count : integer;
48 variable dly_line_count : integer;
49 variable item_count_enb : std_logic := '0'; -- '1' when a delay between two
50 -- items is on going
51 variable line_count_enb : std_logic := '0'; -- '1' when a delay between two
52 -- lines is on going
53
54 begin
55
56 if (@{reset} = '1') then
57
58 do_read &lt;= '0';
59 out_s &lt;= to_unsigned(0, item_width);
60 @{eog} &lt;= '0';
61 new_line &lt;= '0';
62 item_count := 0;
63 line_count := 0;
64 last_line := '0';
65 out_enb &lt;= '0';
66 dly_item_count := 0;
67 dly_line_count := 0;
68 item_count_enb := '0';
69 line_count_enb := '0';
70
71 elsif rising_edge(@{clk}) then
72
73 out_enb &lt;= '0';
74
75 if do_read = '1' then
76
77 if new_line = '1' then
78 readline(in_data, l);
79 new_line &lt;= '0';
80 line_count := line_count + 1;
81 if (endfile(in_data)) or (line_count = nb_lines) then
82 last_line := '1';
83 end if;
84 if line_delay_s > 0 then
85 line_count_enb := '1';
86 end if;
87 end if;
88
89 if line_count_enb = '1' then
90 dly_line_count := dly_line_count + 1;
91 if dly_line_count = line_delay_s then
92 line_count_enb := '0';
93 dly_line_count := 0;
94 end if;
95 elsif item_count_enb = '1' then
96 dly_item_count := dly_item_count + 1;
97 if dly_item_count = group_delay_s then
98 item_count_enb := '0';
99 dly_item_count := 0;
100 end if;
101 else
102 read(l, in_val);
103 out_s &lt;= to_unsigned(in_val, item_width);
104 out_enb &lt;= '1';
105 item_count := item_count + 1;
106 if (item_count &lt; item_per_line) then
107 read(l, comma);
108 if (group_delay_s > 0) and (item_count mod group_size = 0) then
109 item_count_enb := '1';
110 end if;
111 else
112 if (last_line = '1') then
113 @{eog} &lt;= '1';
114 do_read &lt;= '0';
115 else
116 new_line &lt;= '1';
117 item_count := 0;
118 end if;
119 end if;
120
121 end if;
122 end if;
123
124 elsif start_read = '1' then
125 -- reading the first line
126 readline(in_data, l);
127 line_count := line_count + 1;
128 if (endfile(in_data)) or (line_count = nb_lines) then
129 last_line := '1';
130 end if;
131 do_read &lt;= '1';
132 end if;
133
134 end process read_data;
135
136 end architecture read_csv_a;
137 </architecture>
138   <patterns>
139     <delta value="$nb_lines*$item_per_line"/>
140     <consumption/>
141     <production counter="1">
142       <output name="out_val_enb" pattern="((1{$group_size}0{$group_delay-1}){($item_per_line-1)|$group_size}1{1+(($item_per_line-1)%$group_size)}0{$line_delay-1}){$nb_lines}"/>
143     </production>
144   </patterns>
145 </block_impl>