1 |
16 |
alirezamon |
use Glib qw/TRUE FALSE/;
|
2 |
|
|
#use Gtk2 '-init';
|
3 |
|
|
|
4 |
|
|
use lib 'lib/perl';
|
5 |
|
|
|
6 |
|
|
use strict;
|
7 |
|
|
use warnings;
|
8 |
|
|
use soc;
|
9 |
|
|
use ip;
|
10 |
|
|
use ip_gen;
|
11 |
|
|
use Cwd;
|
12 |
|
|
|
13 |
|
|
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
|
17 |
|
|
######################
|
18 |
|
|
# soc_generate_verilog
|
19 |
|
|
#####################
|
20 |
|
|
|
21 |
|
|
sub soc_generate_verilog{
|
22 |
|
|
my ($soc)= @_;
|
23 |
|
|
my $soc_name=$soc->soc_get_soc_name();
|
24 |
|
|
#my $top_ip=ip_gen->ip_gen_new();
|
25 |
|
|
my $top_ip=ip_gen->top_gen_new();
|
26 |
|
|
if(!defined $soc_name){$soc_name='soc'};
|
27 |
|
|
|
28 |
|
|
my @instances=$soc->soc_get_all_instances();
|
29 |
|
|
my $io_sim_v;
|
30 |
|
|
my $param_as_in_v="\tparameter\tCORE_ID=0";
|
31 |
|
|
my $body_v;
|
32 |
|
|
|
33 |
|
|
my ($param_v_all, $local_param_v_all, $wire_def_v_all, $inst_v_all, $plugs_assign_v_all, $sockets_assign_v_all,$io_full_v_all);
|
34 |
|
|
|
35 |
|
|
foreach my $id (@instances){
|
36 |
|
|
my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v)=gen_module_inst($id,$soc,\$io_sim_v,\$param_as_in_v,$top_ip);
|
37 |
|
|
my $inst = $soc->soc_get_instance_name($id);
|
38 |
|
|
add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
|
39 |
|
|
|
40 |
|
|
add_text_to_string(\$local_param_v_all,"$local_param_v\n") if(defined($local_param_v));
|
41 |
|
|
add_text_to_string(\$wire_def_v_all,"$wire_def_v\n") if(defined($wire_def_v));
|
42 |
|
|
add_text_to_string(\$inst_v_all,$inst_v) if(defined($inst_v));
|
43 |
|
|
add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n") if(defined($plugs_assign_v));
|
44 |
|
|
add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
|
45 |
|
|
add_text_to_string(\$io_full_v_all,"$io_full_v\n") if(defined($io_full_v));
|
46 |
|
|
|
47 |
|
|
#print "$param_v $local_param_v $wire_def_v $inst_v $plugs_assign_v $sockets_assign_v $io_full_v";
|
48 |
|
|
|
49 |
|
|
}
|
50 |
|
|
my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc);
|
51 |
|
|
|
52 |
|
|
#add functions
|
53 |
|
|
my $dir = Cwd::getcwd();
|
54 |
|
|
open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
|
55 |
|
|
my $functions_all='';
|
56 |
|
|
while (my $f1 = readline ($file1)) {
|
57 |
|
|
$functions_all="$functions_all $f1 ";
|
58 |
|
|
}
|
59 |
|
|
close($file1);
|
60 |
|
|
|
61 |
|
|
my $soc_v = (defined $param_as_in_v )? "module $soc_name #(\n $param_as_in_v\n)(\n$io_sim_v\n);\n": "module $soc_name (\n$io_sim_v\n);\n";
|
62 |
|
|
add_text_to_string(\$soc_v,$functions_all);
|
63 |
|
|
add_text_to_string(\$soc_v,$local_param_v_all);
|
64 |
|
|
add_text_to_string(\$soc_v,$addr_localparam);
|
65 |
|
|
add_text_to_string(\$soc_v,$module_addr_localparam);
|
66 |
|
|
add_text_to_string(\$soc_v,$io_full_v_all);
|
67 |
|
|
add_text_to_string(\$soc_v,$wire_def_v_all);
|
68 |
|
|
add_text_to_string(\$soc_v,$inst_v_all);
|
69 |
|
|
add_text_to_string(\$soc_v,$plugs_assign_v_all);
|
70 |
|
|
add_text_to_string(\$soc_v,$sockets_assign_v_all);
|
71 |
|
|
add_text_to_string(\$soc_v,$addr_map);
|
72 |
|
|
add_text_to_string(\$soc_v,"endmodule\n\n");
|
73 |
|
|
|
74 |
|
|
|
75 |
|
|
$soc->soc_add_top($top_ip);
|
76 |
|
|
|
77 |
|
|
return "$soc_v";
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
}
|
81 |
|
|
|
82 |
|
|
#################
|
83 |
|
|
# gen_module_inst
|
84 |
|
|
###############
|
85 |
|
|
|
86 |
|
|
sub gen_module_inst {
|
87 |
|
|
my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip)=@_;
|
88 |
|
|
my $module =$soc->soc_get_module($id);
|
89 |
|
|
my $module_name =$soc->soc_get_module_name($id);
|
90 |
|
|
my $category =$soc->soc_get_category($id);
|
91 |
|
|
|
92 |
|
|
my $inst = $soc->soc_get_instance_name($id);
|
93 |
|
|
my %params = $soc->soc_get_module_param($id);
|
94 |
|
|
my $intfc=interface->interface_new();
|
95 |
|
|
my $ip = ip->lib_new ();
|
96 |
|
|
|
97 |
|
|
my @ports=$ip->ip_list_ports($category,$module);
|
98 |
|
|
my ($inst_v,$intfc_v,$wire_def_v,$plugs_assign_v,$sockets_assign_v,$io_full_v);
|
99 |
|
|
$plugs_assign_v="\n";
|
100 |
|
|
|
101 |
|
|
my $counter=0;
|
102 |
|
|
my @param_order=$soc->soc_get_instance_param_order($id);
|
103 |
|
|
|
104 |
|
|
my ($param_v,$local_param_v,$instance_param_v)= gen_parameter_v(\%params,$id,$inst,$category,$module,$ip,$param_as_in_v,\@param_order,$top_ip);
|
105 |
|
|
my $param_size = keys %params;
|
106 |
|
|
|
107 |
|
|
|
108 |
|
|
$top_ip->top_add_def_to_instance($id,'module',$module);
|
109 |
|
|
$top_ip->top_add_def_to_instance($id,'module_name',$module_name);
|
110 |
|
|
$top_ip->top_add_def_to_instance($id,'category',$category);
|
111 |
|
|
$top_ip->top_add_def_to_instance($id,'instance',$inst);
|
112 |
|
|
|
113 |
|
|
|
114 |
|
|
|
115 |
|
|
|
116 |
|
|
|
117 |
|
|
|
118 |
|
|
#module name
|
119 |
|
|
$inst_v=($param_size>0)? "$module_name #(\n": $module_name ;
|
120 |
|
|
|
121 |
|
|
|
122 |
|
|
|
123 |
|
|
#module parameters
|
124 |
|
|
$inst_v=($param_size>0)? "$inst_v $instance_param_v\n\t)": $inst_v;
|
125 |
|
|
#module instance name
|
126 |
|
|
$inst_v="$inst_v $inst \t(\n";
|
127 |
|
|
|
128 |
|
|
#module ports
|
129 |
|
|
$counter=0;
|
130 |
|
|
foreach my $port (@ports){
|
131 |
|
|
my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
|
132 |
|
|
my $assigned_port;
|
133 |
|
|
my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
|
134 |
|
|
my $IO='no';
|
135 |
|
|
my $NC='no';
|
136 |
|
|
if($i_type eq 'plug'){
|
137 |
|
|
my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
|
138 |
|
|
if($connect_id eq 'IO'){ $IO='yes';}
|
139 |
|
|
if($connect_id eq 'NC'){ $NC='yes';}
|
140 |
|
|
}
|
141 |
|
|
if($i_type eq 'socket' && $i_name ne'wb_addr_map'){
|
142 |
|
|
|
143 |
|
|
my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
|
144 |
|
|
my %connected_plugs=%$ref1;
|
145 |
|
|
my %connected_plug_nums=%$ref2;
|
146 |
|
|
if(!%connected_plugs ){
|
147 |
|
|
my ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
|
148 |
|
|
my $v=$soc->soc_get_module_param_value($id,$s_value);
|
149 |
|
|
if ( length( $v || '' )){ $IO='no';} else {$IO='yes';}
|
150 |
|
|
}
|
151 |
|
|
}
|
152 |
|
|
if($NC eq 'yes'){
|
153 |
|
|
|
154 |
|
|
|
155 |
|
|
}
|
156 |
|
|
elsif($IO eq 'yes' || !defined $i_type || !defined $i_name || !defined $i_num){ #its an IO port
|
157 |
|
|
$assigned_port="$inst\_$port";
|
158 |
|
|
$$io_sim_v= (!defined $$io_sim_v)? "\t$assigned_port" : "$$io_sim_v, \n\t$assigned_port";
|
159 |
|
|
my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
|
160 |
|
|
my $port_def=(length ($range)>1 )? "\t$type\t [ $new_range ] $assigned_port;\n": "\t$type\t\t\t$assigned_port;\n";
|
161 |
|
|
add_text_to_string(\$io_full_v,$port_def);
|
162 |
|
|
# $top_ip->ipgen_add_port($assigned_port, $new_range, $type ,$intfc_name,$i_port);
|
163 |
|
|
$top_ip->top_add_port($id,$assigned_port, $new_range, $type ,$intfc_name,$i_port);
|
164 |
|
|
|
165 |
|
|
|
166 |
|
|
}
|
167 |
|
|
else{ # port connected internally using interface
|
168 |
|
|
$assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
|
169 |
|
|
|
170 |
|
|
#create plug wires
|
171 |
|
|
my $wire_string=generate_wire ($range,$assigned_port,$inst,\%params);
|
172 |
|
|
add_text_to_string(\$wire_def_v,$wire_string);
|
173 |
|
|
|
174 |
|
|
|
175 |
|
|
|
176 |
|
|
if($i_type eq 'plug'){
|
177 |
|
|
#read socket port name
|
178 |
|
|
my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
|
179 |
|
|
my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_plug($i_name,$i_port);
|
180 |
|
|
#my $connect_port= "socket_$i_name\_$i_num\_$i_connect";
|
181 |
|
|
if(defined $connect_socket_num){
|
182 |
|
|
my $connect_n=$soc->soc_get_instance_name($connect_id);
|
183 |
|
|
my $connect_port= "$connect_n\_socket_$i_name\_$connect_socket_num\_$i_connect";
|
184 |
|
|
#connect plug port to socket port
|
185 |
|
|
my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
|
186 |
|
|
my $connect_port_range=(length($new_range)>1)?"$connect_port\[$new_range\]":$connect_port;
|
187 |
|
|
$plugs_assign_v= ($type eq 'input' )? "$plugs_assign_v \tassign $assigned_port = $connect_port_range;\n":
|
188 |
|
|
"$plugs_assign_v \tassign $connect_port = $assigned_port;\n";
|
189 |
|
|
}
|
190 |
|
|
}#plug
|
191 |
|
|
else{ #socket
|
192 |
|
|
my ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
|
193 |
|
|
my $v=$soc->soc_get_module_param_value($id,$s_value);
|
194 |
|
|
my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_socket($i_name,$i_port);
|
195 |
|
|
if ( length( $v || '' )) {
|
196 |
|
|
$v--;
|
197 |
|
|
my $name= $soc->soc_get_instance_name($id);
|
198 |
|
|
my $joint= "$name\_$i_type\_$i_name\_$v\_$i_port";
|
199 |
|
|
|
200 |
|
|
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$v\_$i_port",$inst,\%params);
|
201 |
|
|
add_text_to_string(\$wire_def_v,$wire_string);
|
202 |
|
|
|
203 |
|
|
for(my $i=$v-1; $i>=0; $i--) {
|
204 |
|
|
$joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
|
205 |
|
|
#create socket wires
|
206 |
|
|
#create plug wires
|
207 |
|
|
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$i\_$i_port",$inst,\%params);
|
208 |
|
|
add_text_to_string(\$wire_def_v,$wire_string);
|
209 |
|
|
|
210 |
|
|
|
211 |
|
|
|
212 |
|
|
|
213 |
|
|
|
214 |
|
|
|
215 |
|
|
}
|
216 |
|
|
$joint=($v>0)? "\{$joint\}" : "$joint";
|
217 |
|
|
my $text=($type eq 'input' )? "\tassign $assigned_port =$joint;\n": "\tassign $joint =$assigned_port;\n";
|
218 |
|
|
add_text_to_string(\$sockets_assign_v,$text);
|
219 |
|
|
}
|
220 |
|
|
|
221 |
|
|
|
222 |
|
|
|
223 |
|
|
}#socket
|
224 |
|
|
|
225 |
|
|
|
226 |
|
|
}
|
227 |
|
|
|
228 |
|
|
|
229 |
|
|
|
230 |
|
|
if (++$counter == scalar(@ports)){
|
231 |
|
|
|
232 |
|
|
$inst_v=($NC eq 'yes')? "$inst_v\t\t.$port()\n": "$inst_v\t\t.$port($assigned_port)\n";
|
233 |
|
|
|
234 |
|
|
}
|
235 |
|
|
else {
|
236 |
|
|
$inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
|
237 |
|
|
}
|
238 |
|
|
|
239 |
|
|
|
240 |
|
|
|
241 |
|
|
|
242 |
|
|
|
243 |
|
|
}
|
244 |
|
|
$inst_v="$inst_v\t);\n";
|
245 |
|
|
|
246 |
|
|
return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v);
|
247 |
|
|
|
248 |
|
|
|
249 |
|
|
}
|
250 |
|
|
|
251 |
|
|
|
252 |
|
|
sub add_instantc_name_to_parameters{
|
253 |
|
|
my ($params_ref,$inst,$range)=@_;
|
254 |
|
|
my $new_range=$range;
|
255 |
|
|
#print "$new_range\n";
|
256 |
|
|
|
257 |
|
|
my @list=sort keys%{$params_ref};
|
258 |
|
|
foreach my $param (@list){
|
259 |
|
|
my $new_param= "$inst\_$param";
|
260 |
|
|
($new_range=$new_range)=~ s/\b$param\b/$new_param/g;
|
261 |
|
|
#print "$new_range= s/\b$param\b/$new_param/g\n";
|
262 |
|
|
}
|
263 |
|
|
return $new_range;
|
264 |
|
|
}
|
265 |
|
|
|
266 |
|
|
|
267 |
|
|
sub gen_parameter_v{
|
268 |
|
|
my ($param_ref,$id,$inst,$category,$module,$ip,$param_as_in_v,$ref_ordered,$top_ip)=@_;
|
269 |
|
|
my %params=%$param_ref;
|
270 |
|
|
my @param_order;
|
271 |
|
|
@param_order=@{$ref_ordered} if(defined $ref_ordered);
|
272 |
|
|
|
273 |
|
|
my ($param_v,$local_param_v,$instance_param_v);
|
274 |
|
|
my @list;
|
275 |
|
|
@list= (@param_order)? @param_order :
|
276 |
|
|
sort keys%params;
|
277 |
|
|
my $first_param=1;
|
278 |
|
|
$instance_param_v="";
|
279 |
|
|
$local_param_v="";
|
280 |
|
|
$param_v="";
|
281 |
|
|
#add instance name to parameter value
|
282 |
|
|
foreach my $param (@list){
|
283 |
|
|
$params{$param}=add_instantc_name_to_parameters(\%params,$inst,$params{$param});
|
284 |
|
|
|
285 |
|
|
}
|
286 |
|
|
|
287 |
|
|
|
288 |
|
|
#print parameters
|
289 |
|
|
foreach my $param (@list){
|
290 |
|
|
my $inst_param= "$inst\_$param";
|
291 |
|
|
my ($deafult,$type,$content,$info,$glob_param,$redefine_param)= $ip->ip_get_parameter($category,$module,$param);
|
292 |
|
|
if (! defined $redefine_param){$redefine_param=1;}
|
293 |
|
|
if($redefine_param eq 1){
|
294 |
|
|
|
295 |
|
|
$instance_param_v=($first_param eq 1)? "$instance_param_v\t\t.$param($inst_param)" : "$instance_param_v,\n\t\t.$param($inst_param)";
|
296 |
|
|
$first_param=0;
|
297 |
|
|
|
298 |
|
|
|
299 |
|
|
}
|
300 |
|
|
|
301 |
|
|
|
302 |
|
|
if (! defined $glob_param){$glob_param=0;}
|
303 |
|
|
if($glob_param eq 0){
|
304 |
|
|
$local_param_v="$local_param_v\tlocalparam\t$inst_param=$params{$param};\n";
|
305 |
|
|
}else{
|
306 |
|
|
$param_v="$param_v\tparameter\t$inst_param=$params{$param};\n";
|
307 |
|
|
$$param_as_in_v=(defined ($$param_as_in_v))? "$$param_as_in_v ,\n\tparameter\t$inst_param=$params{$param}":
|
308 |
|
|
" \tparameter\t$inst_param=$params{$param}";
|
309 |
|
|
#add parameter to top
|
310 |
|
|
#$top_ip $inst_param
|
311 |
|
|
$top_ip->top_add_parameter($id,$inst_param,$params{$param},$type,$content,$info,$glob_param,$redefine_param);
|
312 |
|
|
|
313 |
|
|
}
|
314 |
|
|
|
315 |
|
|
|
316 |
|
|
|
317 |
|
|
}
|
318 |
|
|
|
319 |
|
|
return ($param_v,$local_param_v,$instance_param_v);
|
320 |
|
|
|
321 |
|
|
|
322 |
|
|
}
|
323 |
|
|
|
324 |
|
|
###############
|
325 |
|
|
# generate_address_cmp
|
326 |
|
|
##############
|
327 |
|
|
|
328 |
|
|
sub generate_address_cmp{
|
329 |
|
|
my $soc=shift;
|
330 |
|
|
my $number=0;
|
331 |
|
|
my $addr_mp_v="\n//Wishbone slave address match\n";
|
332 |
|
|
my $instance_addr_localparam="\n//Wishbone slave base address based on instance name\n";
|
333 |
|
|
my $module_addr_localparam="\n//Wishbone slave base address based on module name. \n";
|
334 |
|
|
|
335 |
|
|
my @all_instances=$soc->soc_get_all_instances();
|
336 |
|
|
foreach my $instance_id (@all_instances){
|
337 |
|
|
my $instance_name=$soc->soc_get_instance_name($instance_id);
|
338 |
|
|
my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
|
339 |
|
|
foreach my $plug (@plugs){
|
340 |
|
|
my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
|
341 |
|
|
|
342 |
|
|
foreach my $num (@nums){
|
343 |
|
|
my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
|
344 |
|
|
if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
|
345 |
|
|
add_text_to_string(\$addr_mp_v,"/* $instance_name wb_slave $num */\n");
|
346 |
|
|
my $base_hex=sprintf("32'h%08x", ($base>>2));
|
347 |
|
|
my $end_hex=sprintf("32'h%08x", ($end>>2));
|
348 |
|
|
add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_BASE_ADDR\t=\t$base_hex;\n");
|
349 |
|
|
add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_END_ADDR\t=\t$end_hex;\n");
|
350 |
|
|
if($instance_name ne $instance_id){
|
351 |
|
|
add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_BASE_ADDR\t=\t$base_hex;\n");
|
352 |
|
|
add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_END_ADDR\t=\t$end_hex;\n");
|
353 |
|
|
}
|
354 |
|
|
|
355 |
|
|
my $connect_name=$soc->soc_get_instance_name($connect_id);
|
356 |
|
|
$addr_mp_v="$addr_mp_v \tassign $connect_name\_socket_wb_addr_map_0_sel_one_hot[$connect_socket_num\]= (($connect_name\_socket_wb_addr_map_0_grant_addr >= $instance_name\_BASE_ADDR) & ($connect_name\_socket_wb_addr_map_0_grant_addr< $instance_name\_END_ADDR));\n";
|
357 |
|
|
|
358 |
|
|
$number++;
|
359 |
|
|
}#if
|
360 |
|
|
}#foreach my $num
|
361 |
|
|
}#foreach my $plug
|
362 |
|
|
}#foreach my $instance_id
|
363 |
|
|
|
364 |
|
|
add_text_to_string(\$instance_addr_localparam,"\n");
|
365 |
|
|
add_text_to_string(\$module_addr_localparam,"\n");
|
366 |
|
|
return ($addr_mp_v,$instance_addr_localparam,$module_addr_localparam);
|
367 |
|
|
}
|
368 |
|
|
|
369 |
|
|
|
370 |
|
|
|
371 |
|
|
|
372 |
|
|
|
373 |
|
|
|
374 |
|
|
|
375 |
|
|
|
376 |
|
|
|
377 |
|
|
sub add_text_to_string{
|
378 |
|
|
my ($string,$text)=@_;
|
379 |
|
|
if(defined $text){
|
380 |
|
|
$$string=(defined ($$string))? "$$string $text" : $text;
|
381 |
|
|
}
|
382 |
|
|
}
|
383 |
|
|
|
384 |
|
|
|
385 |
|
|
|
386 |
|
|
sub generate_wire {
|
387 |
|
|
my($range,$port_name,$inst_name,$params_ref)=@_;
|
388 |
|
|
my $wire_string;
|
389 |
|
|
if(length ($range)>1 ){
|
390 |
|
|
#replace parameter in range
|
391 |
|
|
my $new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
|
392 |
|
|
$wire_string= "\twire\t[ $new_range ] $port_name;\n";
|
393 |
|
|
}
|
394 |
|
|
else{
|
395 |
|
|
$wire_string="\twire\t\t\t $port_name;\n";
|
396 |
|
|
}
|
397 |
|
|
return $wire_string;
|
398 |
|
|
}
|
399 |
|
|
|
400 |
|
|
|
401 |
|
|
|
402 |
|
|
|
403 |
|
|
|
404 |
|
|
|
405 |
|
|
|
406 |
|
|
|
407 |
|
|
|
408 |
|
|
|
409 |
|
|
|
410 |
|
|
|
411 |
|
|
1;
|
412 |
|
|
|
413 |
|
|
|