OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [perl_gui/] [lib/] [perl/] [diagram.pl] - Blame information for rev 54

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 34 alirezamon
#!/usr/bin/perl -w
2 48 alirezamon
use constant::boolean;
3 34 alirezamon
use strict;
4
use warnings;
5 43 alirezamon
 
6
use FindBin;
7
use lib $FindBin::Bin;
8
 
9 34 alirezamon
use soc;
10
require "widget.pl";
11
require "emulator.pl";
12
use File::Copy;
13
 
14 54 alirezamon
use Chart::Gnuplot;
15 34 alirezamon
 
16
 
17
sub get_dot_file{
18 38 alirezamon
        my $self= shift;
19
        my $self_name=$self->object_get_attribute('soc_name');
20
        my $remove_clk = $self->object_get_attribute("tile_diagram","show_clk");
21
        my $remove_reset = $self->object_get_attribute("tile_diagram","show_reset");
22
        my $remove_unused = $self->object_get_attribute("tile_diagram","show_unused");
23 34 alirezamon
 
24
        my $dotfile=
25
"digraph G {
26
        graph [rankdir = LR , splines=polyline, overlap = false];
27
        node[shape=record];
28
";
29
 
30 38 alirezamon
        my @all_instances=$self->soc_get_all_instances();
31 34 alirezamon
        #print "@all_instances\n";
32
        my $graph_connect= '';
33
        my $n=0;
34
        #my %socket_color;
35
        foreach my $instance_id (@all_instances){
36
                my $first=1;
37 38 alirezamon
                my $instance_name=$self->soc_get_instance_name($instance_id);
38 34 alirezamon
                $dotfile="$dotfile \n\t$instance_id \[label=\"{  ";
39
 
40 38 alirezamon
                my @sockets= $self->soc_get_all_sockets_of_an_instance($instance_id);
41 34 alirezamon
                @sockets = remove_scolar_from_array(\@sockets,'clk') if ($remove_clk);
42
                @sockets = remove_scolar_from_array(\@sockets,'reset') if ($remove_reset);
43
 
44
 
45
                foreach my $socket (@sockets){
46
 
47 38 alirezamon
                        my @nums=$self->soc_list_socket_nums($instance_id,$socket);
48 34 alirezamon
                        foreach my $num (@nums){
49 38 alirezamon
                                my $name= $self->soc_get_socket_name ($instance_id,$socket,$num);
50
                                my  ($s_type,$s_value,$s_connection_num)=$self->soc_get_socket_of_instance($instance_id,$socket);
51 48 alirezamon
                                my $v=(defined $s_value) ? $self->soc_get_module_param_value($instance_id,$s_value) : 1;
52 34 alirezamon
                                $v=1 if ( length( $v || '' ) ==0);
53
                                #for(my $i=$v-1; $i>=0; $i--) {
54
                                for(my $i=0; $i<$v; $i++) {
55
                                        #$socket_color{socket_${socket}\_$i}=$n;
56
                                        #$n = ($n<30)? $n+1 : 0;
57 38 alirezamon
                                        my ($ref1,$ref2)= $self->soc_get_modules_plug_connected_to_socket($instance_id,$socket,$i);
58 34 alirezamon
                                        my %connected_plugs=%$ref1;
59
                                        my %connected_plug_nums=%$ref2;
60
                                        if(%connected_plugs || $remove_unused==0){
61
                                                $dotfile= ($first)? "$dotfile\{<socket_${socket}\_$i>$name\_$i" : "$dotfile |<socket_${socket}_${i}>$name\_${i}";
62
                                                $first=0;
63
                                        }
64
                                }
65
 
66
                        }
67 43 alirezamon
                }
68 34 alirezamon
 
69
 
70
                $dotfile=($first)? "$dotfile $instance_name"  : "$dotfile}|$instance_name";
71
                $first=1;
72 38 alirezamon
                my @plugs= $self->soc_get_all_plugs_of_an_instance($instance_id);
73 34 alirezamon
                @plugs = remove_scolar_from_array(\@plugs,'clk') if ($remove_clk);
74
                @plugs = remove_scolar_from_array(\@plugs,'reset') if ($remove_reset);
75
 
76
                my %plug_order;
77
                my @noconnect;
78
                foreach my $plug (@plugs){
79
 
80 38 alirezamon
                        my @nums=$self->soc_list_plug_nums($instance_id,$plug);
81 34 alirezamon
                        foreach my $num (@nums){
82 38 alirezamon
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$self->soc_get_plug($instance_id,$plug,$num);
83 34 alirezamon
 
84
                                if(defined $connect_socket || $remove_unused==0){
85
                                        #$dotfile= ($first)?  "$dotfile |{<plug_${plug}_${num}>$name" :  "$dotfile|<plug_${plug}_${num}>$name";
86
                                        if(defined $connect_id && defined $connect_socket){
87 38 alirezamon
                                                my @sockets= $self->soc_get_all_sockets_of_an_instance($connect_id);
88 34 alirezamon
                                                my $order_val=0;
89
                                                my $s1=get_pos($connect_id, @all_instances);
90
                                                my $s2=get_pos($connect_socket,  @sockets);
91
                                                $order_val=$s1*1000000+$s2*10000+$connect_socket_num;
92
                                                $plug_order{$order_val}=  "<plug_${plug}_${num}>$name";
93
                                        }else {push (@noconnect,"<plug_${plug}_${num}>$name");}
94
                                }
95
 
96
 
97 38 alirezamon
                                #my $connect_name=$self->soc_get_instance_name($connect_id);
98 34 alirezamon
                                #my $color = get_color_hex_string($n);
99
                                #$n = ($n<30)? $n+1 : 0;
100
 
101
                                $graph_connect="$graph_connect $instance_id:plug_${plug}_${num} ->  $connect_id:socket_${connect_socket}_${connect_socket_num} [  dir=none]\n" if(defined $connect_socket);
102
 
103
                        }
104
                }
105
                foreach my $p (sort {$a<=>$b} keys %plug_order){
106
                                        my $k=$plug_order{$p};
107
                                        #print "$instance_name   : $k=\$plug_order{$p}\n";
108
                                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
109
                                        $first=0;
110
 
111
                                }
112
 
113
                foreach my $k (@noconnect){
114
                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
115
                        $first=0;
116
                }
117
 
118
                $dotfile=  "$dotfile} }\"];";
119
 
120
 
121
 
122
        }
123
        $dotfile="$dotfile\n\n$graph_connect";
124
        $dotfile="$dotfile\n\n}\n";
125
 
126
 
127
        return $dotfile;
128
 
129
 
130
}
131
 
132
 
133
 
134
 
135
 
136
sub show_tile_diagram {
137 38 alirezamon
        my $self= shift;
138 34 alirezamon
 
139
        my $table=def_table(20,20,FALSE);
140
 
141
        my $window=def_popwin_size(80,80,"Processing Tile functional block diagram",'percent');
142 48 alirezamon
        my $scrolled_win = add_widget_to_scrolled_win();
143 34 alirezamon
 
144
        $window->add ($table);
145
 
146
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
147
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
148 38 alirezamon
        my $unused = gen_check_box_object ($self,"tile_diagram","show_unused",0,undef,undef);
149 34 alirezamon
        my $save = def_image_button('icons/save.png',undef,TRUE);
150 38 alirezamon
        my $clk = gen_check_box_object ($self,"tile_diagram","show_clk",0,undef,undef);
151
        my $reset = gen_check_box_object ($self,"tile_diagram","show_reset",0,undef,undef);
152 48 alirezamon
        my $dot_file = def_image_button('icons/add-notes.png',undef,TRUE);
153
        set_tip($dot_file, "Show dot file.");
154 34 alirezamon
        #my $save = def_image_button('icons/save.png',undef,TRUE);
155
 
156 38 alirezamon
        my $scale=$self->object_get_attribute("tile_diagram","scale");
157 34 alirezamon
        $scale= 1 if (!defined $scale);
158
 
159
 
160
 
161
 
162
        my $col=0;
163
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
164
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
165
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
166
        $table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
167
        $table->attach ($unused,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
168
        $table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
169
        $table->attach ($clk,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
170
        $table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
171
        $table->attach ($reset,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
172 48 alirezamon
        $table->attach ($dot_file,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
173
 
174 34 alirezamon
        while ($col<20){
175
 
176
                my $tmp=gen_label_in_left('');
177
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
178
        }
179
 
180 48 alirezamon
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);   
181
 
182 34 alirezamon
        $plus  -> signal_connect("clicked" => sub{
183
                $scale*=1.1 if ($scale <10);
184 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
185 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
186 34 alirezamon
        });
187
        $minues  -> signal_connect("clicked" => sub{
188
                $scale*=.9  if ($scale >0.1); ;
189 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
190 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
191 34 alirezamon
        });
192
        $save-> signal_connect("clicked" => sub{
193 48 alirezamon
                        save_inline_diagram_as ($self);
194
                        show_tile_diagram($self);
195
                        $window->destroy;
196 34 alirezamon
                });
197
        $unused-> signal_connect("toggled" => sub{
198 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
199 34 alirezamon
 
200
        });
201
        $clk-> signal_connect("toggled" => sub{
202 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
203 34 alirezamon
 
204
        });
205
        $reset-> signal_connect("toggled" => sub{
206 48 alirezamon
 
207
                gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
208 34 alirezamon
 
209
        });
210
 
211 48 alirezamon
        $dot_file-> signal_connect("clicked" => sub{
212
                        my $dotfile = get_dot_file_text($self,'tile');
213
                        show_text_in_scrolled_win($self,$scrolled_win, $dotfile);
214
        });
215
 
216
 
217
        gen_show_diagram($self,$scrolled_win,'tile',"tile_diagram");
218 34 alirezamon
        $window->show_all();
219
}
220
 
221
 
222 48 alirezamon
sub gen_show_diagram{
223
        my ($self,$scrolled_win,$type,$name)=@_;
224
 
225
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
226
        if ($type eq 'topology' && $topology eq '"CUSTOM"'){
227
 
228
                 my $name=$self->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
229
                 $name=~s/["]//gs;
230
                 my $image=  get_project_dir()."/mpsoc/rtl/src_topolgy/$name/$name.png";
231
                 my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
232
 
233
                 unlink $tmp;
234
                 return 0 unless (-f "$image");
235
                 copy ($image,$tmp);
236
                 return 0 unless (-f "$tmp");
237
                 show_diagram ($self,$scrolled_win,$name);
238
                 return 1;
239
        }
240
 
241
 
242
 
243
        my $dotfile = get_dot_file_text($self,$type);
244
 
245
        generate_and_show_graph_using_graphviz ($self,$scrolled_win,$dotfile, $name);
246
 
247
}
248
 
249
 
250 43 alirezamon
sub show_topology_diagram {
251 54 alirezamon
        my ($self)= @_;
252
 
253 43 alirezamon
        my $table=def_table(20,20,FALSE);
254
 
255 48 alirezamon
        my $window=def_popwin_size(80,80,"NoC-based MPSoC topology block diagram",'percent');
256
        my $scrolled_win = add_widget_to_scrolled_win();
257 43 alirezamon
 
258 54 alirezamon
 
259
        my $notebook = gen_notebook();
260
        $notebook->set_tab_pos ('top');
261
        $notebook->set_scrollable(TRUE);
262
        $window->add($notebook);
263
 
264
 
265
 
266
 
267
        my @data;
268
        my $ref =$self->object_get_attribute('noc_param');
269
        if(defined $ref){
270
                my %param=%{$ref};
271
                foreach my $p (sort keys %param){
272
                        push (@data, {0 => "$p", 1 =>"$param{$p}"});
273
                }
274
        }
275
 
276
        # create list store
277
        my @clmn_type =  ('Glib::String',  'Glib::String');
278
        my @clmns = (" Parameter Name   ", " Value ");
279
        my $page2=add_widget_to_scrolled_win(gen_list_store (\@data,\@clmn_type,\@clmns));
280
 
281
 
282
 
283
        $notebook->append_page ($table,gen_label_with_mnemonic ("Topology diagram")) ;
284
        $notebook->append_page ($page2,gen_label_with_mnemonic ("NoC parameters")) ;
285
 
286
 
287
 
288
 
289
 
290
 
291
 
292 48 alirezamon
 
293 54 alirezamon
 
294 43 alirezamon
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
295
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
296
        my $save = def_image_button('icons/save.png',undef,TRUE);
297 48 alirezamon
        my $dot_file = def_image_button('icons/add-notes.png',undef,TRUE);
298
        set_tip($dot_file, "Show dot file.");
299 43 alirezamon
 
300 48 alirezamon
        my $gtype=$self->object_get_attribute("tile_diagram","gtype");
301
        if (!defined $gtype){
302
                $gtype='comp' ;
303
                $self->object_add_attribute("tile_diagram","gtype",$gtype);
304
        }
305
        my $graph_type= ($gtype eq 'comp')? def_colored_button('comp',17): def_colored_button('simple',4);
306
        my $box=def_hbox(FALSE,0);
307
        $box->pack_start( $graph_type, FALSE, FALSE, 0);
308
 
309
 
310
 
311
 
312 43 alirezamon
        my $scale=$self->object_get_attribute("tile_diagram","scale");
313
        $scale= 1 if (!defined $scale);
314
 
315
 
316
 
317
 
318
        my $col=0;
319
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
320
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
321
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
322 48 alirezamon
        $table->attach ($dot_file,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
323
        $table->attach ($box,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
324 43 alirezamon
        #$table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
325
        #$table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
326
        #$table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
327
        while ($col<20){
328
                my $tmp=gen_label_in_left('');
329
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
330
        }
331
 
332 48 alirezamon
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);
333
 
334 43 alirezamon
        $plus  -> signal_connect("clicked" => sub{
335
                $scale*=1.1 if ($scale <10);
336
                $self->object_add_attribute("topology_diagram","scale", $scale );
337 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'topology',"topology_diagram");
338
 
339 43 alirezamon
        });
340
        $minues  -> signal_connect("clicked" => sub{
341 54 alirezamon
                $scale*=.9  if ($scale >0.1);
342 43 alirezamon
                $self->object_add_attribute("topology_diagram","scale", $scale );
343 48 alirezamon
                gen_show_diagram($self,$scrolled_win,'topology',"topology_diagram");
344 43 alirezamon
        });
345
        $save-> signal_connect("clicked" => sub{
346 48 alirezamon
                        save_inline_diagram_as ($self);
347
                        show_topology_diagram($self);
348
                        $window->destroy;
349
        });
350 43 alirezamon
 
351 48 alirezamon
        $dot_file-> signal_connect("clicked" => sub{
352
                        my $dot_file=get_dot_file_text($self,'topology');
353
                        show_text_in_scrolled_win($self,$scrolled_win, $dot_file);
354
        });
355 43 alirezamon
 
356 48 alirezamon
        $graph_type-> signal_connect("clicked" => sub{
357
                        my $gtype=$self->object_get_attribute("tile_diagram","gtype");
358
                        my $new = ($gtype eq "simple")? "comp" : "simple";
359
                        $self->object_add_attribute("tile_diagram","gtype",$new);
360
                        $graph_type= ($new eq 'comp')? def_colored_button('comp',17): def_colored_button('simple',4);
361
                        show_topology_diagram($self);
362
                        $window->destroy;
363
        });
364
 
365
 
366
        gen_show_diagram($self,$scrolled_win,'topology',"topology_diagram");
367 43 alirezamon
        $window->show_all();
368 54 alirezamon
        $notebook->set_current_page (0);
369 43 alirezamon
}
370
 
371
 
372 48 alirezamon
sub get_dot_file_text {
373 38 alirezamon
        my ($self,$type)=@_;
374
        my $dotfile;
375
        $dotfile=   get_dot_file($self) if ($type eq 'tile');
376 43 alirezamon
        $dotfile=   get_topology_dot_file($self) if ($type eq 'topology');
377
        $dotfile=   generate_custom_topology_dot_file($self) if ($type eq 'custom_topology');
378 48 alirezamon
        $dotfile=   generate_trace_dot_file($self) if ($type eq 'trace');
379
        $dotfile=   generate_merge_actor_dot_file       ($self) if ($type eq 'merge-actor');
380
        $dotfile=   generate_map_dot_file($self) if ($type eq 'map');
381
        return $dotfile;
382
}
383
 
384
 
385
sub gen_diagram {
386
        my ($self,$type)=@_;
387
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
388
        if ($type eq 'topology' && $topology eq '"CUSTOM"'){
389
 
390
                 my $name=$self->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
391
                 $name=~s/["]//gs;
392
                 my $image=  get_project_dir()."/mpsoc/rtl/src_topolgy/$name/$name.png";
393
                 my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
394
 
395
                 unlink $tmp;
396
                 return 0 unless (-f "$image");
397
                 copy ($image,$tmp);
398
                 return 0 unless (-f "$tmp");
399
                 return 1;
400
        }
401 38 alirezamon
 
402 48 alirezamon
 
403
 
404
        my $dotfile = get_dot_file_text(@_);
405
 
406 34 alirezamon
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
407 43 alirezamon
 
408 34 alirezamon
 
409 38 alirezamon
        my $cmd;
410 43 alirezamon
        #$cmd=  "dot  $tmp_dir/diagram.txt | neato -n  -Tpng -o $tmp_dir/diagram.png" if ($type eq 'tile' || $type eq 'trace'  );
411
        #$cmd = "dot  $tmp_dir/diagram.txt -Kfdp -n -Tpng -o $tmp_dir/diagram.png" if ( $type eq 'map' || $type eq 'topology' || $type eq 'custom_topology' );  
412
        $cmd=  " dot   | neato -n  -Tpng -o $tmp_dir/diagram.png" if ($type eq 'tile' || $type eq 'trace'  );
413
        $cmd = " dot   -Kfdp -n -Tpng -o $tmp_dir/diagram.png" if ( $type eq 'map' || $type eq 'topology' || $type eq 'custom_topology' );
414
    $cmd = "echo \'$dotfile\' | $cmd";
415 34 alirezamon
 
416
        my ($stdout,$exit,$stderr)= run_cmd_in_back_ground_get_stdout ($cmd);
417
 
418 43 alirezamon
        if ( length( $stderr || '' ) !=0)  {
419 34 alirezamon
                message_dialog("$stderr\nHave you installed graphviz? If not run \n \t \"sudo apt-get install graphviz\" \n in terminal");
420 43 alirezamon
                return 0 unless (-f "$tmp_dir/diagram.png");
421 34 alirezamon
        }
422
                return  1;
423
}
424
 
425
 
426
 
427
sub show_diagram {
428 54 alirezamon
        my ($self,$scrolled_win,$name,$image_name)=@_;
429
        $image_name="diagram.png" if (!defined $image_name);
430 48 alirezamon
        my @list = $scrolled_win->get_children();
431
        foreach my $l (@list){
432
                $scrolled_win->remove($l);
433
        }
434
 
435
 
436 38 alirezamon
        my $scale=$self->object_get_attribute($name,"scale");
437 34 alirezamon
        $scale= 1 if (!defined $scale);
438
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
439 54 alirezamon
        my $diagram=open_image("$tmp_dir/$image_name",70*$scale,70*$scale,'percent');
440 43 alirezamon
 
441 48 alirezamon
        add_widget_to_scrolled_win($diagram,$scrolled_win);
442 43 alirezamon
        $scrolled_win->show_all();
443 34 alirezamon
 
444 48 alirezamon
}
445
 
446
sub show_text_in_scrolled_win {
447
        my ($self,$scrolled_win, $text)=@_;
448
        my @list = $scrolled_win->get_children();
449
        foreach my $l (@list){
450
                $scrolled_win->remove($l);
451
        }
452 34 alirezamon
 
453 48 alirezamon
 
454
        my ($u,$tview)=create_txview();
455
 
456
        show_info($tview, $text);
457
        add_widget_to_scrolled_win($u,$scrolled_win);
458
        $scrolled_win->show_all();
459
}
460 34 alirezamon
 
461
 
462
 
463
 
464
sub save_diagram_as {
465 38 alirezamon
        my $self= shift;
466 34 alirezamon
 
467
        my $file;
468
        my $title ='Save as';
469
 
470
 
471
 
472
        my @extensions=('png');
473
        my $open_in=undef;
474 48 alirezamon
        my $dialog = save_file_dialog  ( 'Save file',@extensions);
475
        $dialog->set_current_folder ($open_in) if(defined  $open_in);
476
 
477 34 alirezamon
 
478
        if ( "ok" eq $dialog->run ) {
479 48 alirezamon
                $file = $dialog->get_filename;
480 34 alirezamon
                        my $ext = $dialog->get_filter;
481
                        $ext=$ext->get_name;
482
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
483
                        $file = ($suffix eq ".$ext" )? $file : "$file.$ext";
484
 
485 38 alirezamon
                        $self->object_add_attribute("graph_save","name",$file);
486
                        $self->object_add_attribute("graph_save","extension",$ext);
487 34 alirezamon
                        my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
488
                        copy ($tmp,$file);
489
 
490
 
491
 
492 48 alirezamon
        }
493
        $dialog->destroy;
494 38 alirezamon
}
495 34 alirezamon
 
496
 
497
 
498 48 alirezamon
 
499
sub save_inline_diagram_as {
500
        my $self= shift;
501
 
502
        my $file;
503
        my $title ='Save as';
504
 
505
 
506
 
507
        my @extensions=('png','jpeg');
508
        my $open_in=undef;
509
        my $dialog = save_file_dialog  ('Save file',@extensions);
510
        $dialog->set_current_folder ($open_in) if(defined  $open_in);
511
 
512
 
513
        if ( "ok" eq $dialog->run ) {
514
                $file = $dialog->get_filename;
515
                        my $ext = $dialog->get_filter;
516
                        $ext=$ext->get_name;
517
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
518
 
519
                        $file = ($suffix eq ".$ext" )? $file : "$file.$ext";
520
 
521
                        $self->object_add_attribute("graph_save","name","$path/$name");
522
                        $self->object_add_attribute("graph_save","extension",$ext);
523
                        $self->object_add_attribute("graph_save","enable",1);
524
                        set_gui_status($self,"ref",5);
525
        }
526
        $dialog->destroy;
527
}
528
 
529
 
530
 
531 38 alirezamon
sub generate_trace_dot_file{
532
        my $self=shift;
533
        my $dotfile=
534
"digraph G {
535 48 alirezamon
        graph [ layout = neato, rankdir = LR , splines=polyline, overlap = false];
536 38 alirezamon
 
537
";
538
 
539 48 alirezamon
 
540 38 alirezamon
 
541
#add connections
542 34 alirezamon
 
543 48 alirezamon
        my @traces= get_trace_list($self,'raw');
544 38 alirezamon
        foreach my $p (@traces) {
545 48 alirezamon
                my ($src,$dst, $Mbytes, $file_id, $file_name)=get_trace($self,'raw',$p);
546 38 alirezamon
                $dotfile=$dotfile."\"$src\" -> \"$dst\"  [label=\"$Mbytes\" ];\n";
547
        }
548
 
549
        $dotfile=$dotfile."\n}\n";
550
        return $dotfile;
551
 
552 34 alirezamon
}
553
 
554
 
555
 
556 38 alirezamon
sub generate_map_dot_file{
557
        my $self=shift;
558
        my $dotfile=
559
"digraph G {
560 48 alirezamon
        graph [layout = neato, rankdir = LR ,splines=spline,  overlap = false];
561 38 alirezamon
        node[shape=record];
562
 
563
        ";
564
 
565 48 alirezamon
#add nodes      
566
        my @tasks=get_all_tasks($self,"merge");
567
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($self);
568
        my %pos=get_endp_pos($self);
569
        my @mappedtasks;
570
        for(my $i=0; $i<$NE; $i++){
571
                                        my $task=get_task_assigned_to_tile($self,$i);
572 38 alirezamon
                                        push(@mappedtasks,$task) if (defined $task);
573
 
574
                                        $task= "_" if (!defined $task);
575 48 alirezamon
                                        my $n =    "tile($i)" ;
576
                                        my $m =    "tile($i)" ;
577 38 alirezamon
                                        my $node = "\"$m\"";
578
                                        my $label =   "\"<S$task> $n|<R$task> $task\"" ;
579 48 alirezamon
 
580 38 alirezamon
                                        $dotfile=$dotfile."
581
$node\[
582
        label = $label
583 48 alirezamon
    pos = $pos{$i}
584 38 alirezamon
];";
585 48 alirezamon
 
586 38 alirezamon
        }
587
        $dotfile=$dotfile."\n\n";
588 48 alirezamon
        #add connections
589
        my @traces= get_trace_list($self,'merge');
590
        my %src_dst;
591 38 alirezamon
 
592
        foreach my $p (@traces){
593 48 alirezamon
                my ($src,$dst, $Mbytes, $file_id, $file_name)=get_trace($self,'merge',$p);
594
                my $src_tile=get_task_give_tile($self,"$src");
595
                my $dst_tile=get_task_give_tile($self,"$dst");
596
                next if ($src_dst{"${src_tile}_$dst_tile"}); #make sure there will be only one arow betwenn each source destination tile
597
                next if ( $src_tile eq "-" ||  $dst_tile eq "-" );
598
                $dotfile=$dotfile." \"$src_tile\" :  \"S$src\" ->  \"$dst_tile\" : \"R$dst\"  ;\n" if((defined $src_tile )&& (defined $dst_tile));
599
                $src_dst{"${src_tile}_$dst_tile"}=1;
600 38 alirezamon
        }
601
        $dotfile=$dotfile."\n}\n";
602
        return $dotfile;
603
}
604
 
605
 
606
 
607
 
608
 
609
sub show_trace_diagram {
610
        my ($self,$type)=@_;
611
        my $table=def_table(20,20,FALSE);
612
 
613 48 alirezamon
        my $window=def_popwin_size(80,80,"Trace Diagram",'percent');
614
        my $scrolled_win =add_widget_to_scrolled_win();
615 38 alirezamon
 
616
        $window->add ($table);
617
 
618
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
619
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
620
        my $save = def_image_button('icons/save.png',undef,TRUE);
621 48 alirezamon
        my $dot_file = def_image_button('icons/add-notes.png',undef,TRUE);
622
        set_tip($dot_file, "Show dot file.");
623 38 alirezamon
 
624 48 alirezamon
 
625 38 alirezamon
 
626
        my $scale=$self->object_get_attribute("${type}_diagram","scale");
627
        $scale= 1 if (!defined $scale);
628
 
629
 
630
 
631
 
632
        my $col=0;
633
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
634
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
635
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
636 48 alirezamon
        $table->attach ($dot_file,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
637
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);   
638 38 alirezamon
 
639 48 alirezamon
        while ($col<20){
640 38 alirezamon
                my $tmp=gen_label_in_left('');
641
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
642
        }
643
 
644
        $plus  -> signal_connect("clicked" => sub{
645
                $scale*=1.1 if ($scale <10);
646
                $self->object_add_attribute("${type}_diagram","scale", $scale );
647 48 alirezamon
                my $dotfile = get_dot_file_text($self,$type);
648
                generate_and_show_graph_using_graphviz ($self,$scrolled_win,$dotfile, "${type}_diagram");
649 38 alirezamon
        });
650
        $minues  -> signal_connect("clicked" => sub{
651
                $scale*=.9  if ($scale >0.1); ;
652
                $self->object_add_attribute("${type}_diagram","scale", $scale );
653 48 alirezamon
                gen_show_diagram ($self,$scrolled_win,$type,"${type}_diagram");
654 38 alirezamon
        });
655
        $save-> signal_connect("clicked" => sub{
656 48 alirezamon
                        save_inline_diagram_as ($self);
657
                        show_trace_diagram($self,$type);
658
                        $window->destroy;
659 38 alirezamon
                });
660
 
661 48 alirezamon
        $dot_file-> signal_connect("clicked" => sub{
662
                my $dotfile = get_dot_file_text($self,$type);
663
                show_text_in_scrolled_win($self,$scrolled_win, $dotfile);
664
 
665
        });
666 38 alirezamon
 
667 48 alirezamon
        gen_show_diagram ($self,$scrolled_win,$type,"${type}_diagram");
668
 
669 38 alirezamon
        $window->show_all();
670
}
671 43 alirezamon
 
672
 
673
 
674
 
675
 
676
 
677
sub node_connection{
678 48 alirezamon
        my ($sn,$sx,$sy,$sp,$dn,$dx,$dy,$dp,$gtype)=@_;
679
        $gtype="comp" if(!defined $gtype);
680
 
681
        my $spp = (defined $sp  && $gtype eq "comp" ) ? ":\"p$sp\"" : " ";
682
        my $dpp = (defined $dp  && $gtype eq "comp" ) ? ":\"p$dp\"" : " ";
683 43 alirezamon
        my $sname = (defined $sy) ? "\"$sn${sx}_${sy}\"" : "\"$sn${sx}\"";
684
        my $dname = (defined $dy) ? "\"$dn${dx}_${dy}\"" : "\"$dn${dx}\"";
685
 
686
        my $t= "$sname  $spp -> $dname  $dpp [  dir=none];\n";
687
        return $t;
688
}
689
 
690
sub node_connection2{
691
        my ($sn,$sx,$sp,$dn,$dx,$dy,$dp)=@_;
692
        my $spp = (defined $sp) ? ":\"p$sp\"" : " ";
693
        my $dpp = (defined $dp) ? ":\"p$dp\"" : " ";
694
        my $sname =   "\"$sn${sx}\"";
695
        my $dname =  "\"$dn${dx}\"";
696
 
697
        my $t= "$sname  $spp -> $dname  $dpp [  dir=none];\n";
698
        return $t;
699
}
700
 
701
 
702
 
703
 
704
##################################
705
#
706
##################################
707
 
708
 
709 54 alirezamon
 
710
 
711
sub generate_heat_map_table{
712
        my ($d)=@_ ;
713
 
714
        return (def_table (1, 1, FALSE),def_table (1, 1, FALSE)) if (!defined $d);
715
        my %data=%{$d};
716
        my @xs = (sort {$a<=>$b} keys %data);
717
 
718
 
719
 
720
 
721
        my $max=0;
722
        #for(my $y=0; $y<$dim; $y++){           
723
        #       for(my $x=0; $x<$dim; $x++){    
724
                foreach my $y (@xs){
725
                        foreach my $x (@xs){
726
                        #$data{$x}{$y}=int(rand(50000));
727
                        #$data{$x}{$y}=$y*64+$x;
728
                        $max = $data{$x}{$y} if( $max < $data{$x}{$y});
729
                }
730
        }
731
 
732
 
733
        my $width_max = length int $max;
734
 
735
        my $table = def_table (1, 1, FALSE);
736
 
737
        #for(my $y=0; $y<$dim; $y++){ 
738
        foreach my $y (@xs){
739
                my $l=gen_label_in_center("$y");
740
                $table->attach ($l,     $y+1,$y+2,0,1,'expand','shrink',2,2);
741
        }
742
        #for(my $x=0; $x<$dim; $x++){
743
        foreach my $x (@xs){
744
                my $l=gen_label_in_center("$x");
745
                $table->attach ($l,     0,1,$x+1,$x+2,'expand','shrink',2,2);
746
        }
747
 
748
        #for(my $y=0; $y<$dim; $y++){           
749
        #       for(my $x=0; $x<$dim; $x++){
750
                foreach my $y (@xs){
751
                        foreach my $x (@xs){
752
                        my $d=$data{$x}{$y};
753
                        my $c = int (((5*$d))/($max+1));
754
                        my $v = length int $d;
755
                        until ($v >= $width_max){
756
                                $d="  ".$d;
757
                                $v++;
758
                        }
759
 
760
                my $l =gen_colored_label( "   " ,32+$c);
761
                set_tip($l,"E[$x]->E[$y]=$d");
762
                $table->attach ($l, $y+1,$y+2,$x+1,$x+2,'expand','shrink',2,2);
763
        }
764
 
765
  }
766
 
767
  my $scale = def_table (1, 1, FALSE);
768
  my $v=gen_label_in_center("0");
769
  $scale->attach ($v, 1,2,0,1,'expand','shrink',2,2);
770
  for (my $i=0; $i<5; $i++){
771
        my $l =gen_colored_label( "   " ,32+$i);
772
        my $val =int( (2*$i+1)*$max/10);
773
        my $v=gen_label_in_center($val);
774
        $scale->attach ($v, 0,1,$i+1,$i+2,'expand','shrink',2,2);
775
        $scale->attach ($l, 1,2,$i+1,$i+2,'expand','shrink',2,2);
776
        $scale->attach (gen_label_in_center("$max"), 1,2,$i+2,$i+3,'expand','shrink',2,2) if($i==4);
777
  }
778
 
779
 
780
   return ($table,$scale);
781
 
782
}
783
 
784
 
785
sub generate_heat_map_img_file{
786
        my ($d,$image_file,$title)=@_ ;
787
        return  if (!defined $d);
788
        my %hash=%{$d};
789
        my @data;
790
        my @xs = (sort {$a<=>$b} keys %hash);
791
        foreach my $y (@xs){
792
                my @b;
793
                push (@data ,\@b) if ($y!=0);
794
                foreach my $x (@xs){
795
                        my @a=($x,$y, $hash{$x}{$y});
796
                        push (@data ,\@a);
797
                }
798
 
799
        }
800
 
801
my $length = @xs;
802
$length+=1;
803
 
804
my $chart = Chart::Gnuplot->new(
805
    bg         => 'white',
806
    view       => 'map',
807
    palette    => 'defined (0 0 0 1, 1 1 1 0, 2 1 0 0)',
808
    output     => "$image_file",
809
    title      => "$title",
810
    xlabel     => 'Endp-ID',
811
    ylabel     => 'Endp-ID',
812
    xrange         => [-1, $length],
813
    size       => 'ratio -1',
814
    xtics      => {
815
        labels   => \@xs,
816
    },
817
    ytics      => {
818
       labels   => \@xs,
819
    },
820
    mxtics => '2',
821
    mytics => '2',
822
    border => undef,
823
    grid   => 'front mxtics mytics lw 1.5 lt -1 lc rgb \'white\'',
824
 
825
);
826
my $dataSet = Chart::Gnuplot::DataSet->new(
827
        points => \@data,
828
        view   => 'map',
829
        type   => 'matrix',
830
    using  => "1:2:3 with image",
831
);
832
 
833
 
834
$chart->plot2d($dataSet);
835
 
836
 
837
 
838
 
839
 
840
}
841
 
842
 
843
 
844
sub generate_heat_map_dot_file{
845
        my ($data,$dim)=@_ ;
846
        my $dotfile=
847
"digraph G {
848
        graph [layout = neato, rankdir = RL , splines = true, overlap = true];
849
        node[shape=record];
850
        ";
851
        for(my $y=0; $y<$dim; $y++){
852
                for(my $x=0; $x<$dim; $x++){
853
                        my $tx=$x*2+0.5;
854
                        my $ty=($dim-$y-1)*2+0.5;
855
                        my $w=2;
856
 
857
                    $tx/=2;
858
                        $ty/=2;
859
                        $w/=2;
860
 
861
 
862
                        $dotfile.="
863
                                        \"t${x}_$y\"[
864
        label = \"8822255\"
865
    pos = \"$tx,$ty!\"
866
    width =$w
867
    height=$w
868
        style=filled
869
        fontsize=\"12\"
870
        fillcolor=orange
871
 
872
];
873
"
874
                }
875
        }
876
 
877
        $dotfile=$dotfile."\n}\n";
878
        return $dotfile;
879
 
880
}
881
 
882
 
883
 
884 43 alirezamon
sub generate_mesh_dot_file{
885
        my $self=shift;
886 48 alirezamon
 
887
        my $gtype=$self->object_get_attribute("tile_diagram","gtype");
888
 
889 43 alirezamon
        my $dotfile=
890
"digraph G {
891 48 alirezamon
        graph [layout = neato, rankdir = RL , splines = true, overlap = true];
892 43 alirezamon
 
893
 
894
        node[shape=record];
895
 
896
        ";
897
 
898
#five_port_router [
899
#       label="{ |2| } | {3|R0|1} | { |4|0}"
900
#       shape=record
901
#       color=blue
902
#       style=filled
903
#       fillcolor=blue
904
#];     
905
 
906
#add nodes
907
        my $nx=$self->object_get_attribute('noc_param','T1');
908
        my $ny=$self->object_get_attribute('noc_param','T2');
909
        my $nz=$self->object_get_attribute('noc_param','T3');
910 48 alirezamon
 
911
        my ($NE, $NR, $RAw, $EAw, $Fw)  = get_topology_info($self);
912
 
913
 
914 43 alirezamon
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
915
 
916
 
917
        my $btrace= ($topology eq '"TORUS"' || $topology eq '"RING"');
918
        my $oned = ($topology eq '"RING"' || $topology eq '"LINE"');
919
 
920
        #generate endpoints
921
        for(my $y=0; $y<$ny; $y++){
922
                                for(my $x=0; $x<$nx; $x++){
923
                                        for(my $z=0; $z<$nz; $z++){
924
                                                my $id=($y*$nx+$x)*$nz+$z;
925
                                                my $offsetx = ($z==0 || $z==3) ? 1.05 : -1.05;
926
                                                my $offsety = ($z==0 || $z==1) ? -0.85 : +0.85;
927
                                                my $tx=$x*3+$offsetx;
928
                                                my $ty=($ny-$y-1)*2.5+1+$offsety;
929 48 alirezamon
                                                $dotfile.=get_record_endp_dot_file("T$id","T$id", "$tx,$ty!");
930 43 alirezamon
        }}}
931
 
932 48 alirezamon
        if($topology eq '"FMESH"' ) {
933
                my $tmp = $ny*$nx*$nz;
934
                for(my $x=0; $x<$nx; $x++){
935
                            #top edges
936
                                my $id=$tmp + $x;
937
                                my $tx=$x*3;
938
                                my $ty=($ny)*2.5-.5;
939
                                $dotfile.=get_record_endp_dot_file("T$id","T$id", "$tx,$ty!");
940
                                get_connected_router_id_to_endp($self,$id);
941
 
942
 
943
 
944
                                #down edges
945
                                $id= $tmp + $nx +$x;
946
                                $tx=$x*3;
947
                                $ty=-.5;
948
                                $dotfile.=get_record_endp_dot_file("T$id","T$id", "$tx,$ty!");
949
                }
950
                for(my $y=0; $y<$ny; $y++){
951
                            #right edges
952
                                my $id= $tmp + 2*$nx +$y;
953
                                my $tx=-1.5;
954
                                my $ty=($ny-$y-1)*2.5+1;
955
                                $dotfile.=get_record_endp_dot_file("T$id","T$id", "$tx,$ty!");
956
 
957
 
958
                                #left edges
959
                                $id= $tmp + 2*$nx+$ny +$y;
960
                                $tx=$nx*3-1.5;
961
                                $ty=($ny-$y-1)*2.5+1;
962
                                $dotfile.=get_record_endp_dot_file("T$id","T$id", "$tx,$ty!");
963
 
964
                }
965
 
966
        }
967
 
968
 
969 43 alirezamon
#generate routers       
970
        for(my $y=0; $y<$ny; $y++){
971
                                for(my $x=0; $x<$nx; $x++){
972
                                        my $e0 = '0';
973
                                        my $e1 = ($nz>1)? ( ($oned)? '3':'5') : ' ';
974
                                        my $e2 = ($nz>2)? ( ($oned)? '4':'6') : ' ';
975
                                        my $e3 = ($nz>3)? ( ($oned)? '5':'7') : ' ';
976
 
977
                                        my $id=$y*$nx+$x;
978
                                        my $n = "R${id}";
979
                                        my $label =  ($oned)?
980
                                         "\{<p7>$e2 |<p2> |<p8>$e3 \} | \{<p3>2|$n|<p1>1\} | \{<p6>$e1 |<p4> |<p5>$e0\}"
981
                                        :"\{<p7>$e2 |<p2>2|<p8>$e3 \} | \{<p3>3|$n|<p1>1\} | \{<p6>$e1 |<p4>4|<p5>$e0\}";
982
                                        my $xx=$x*3;
983
                                        my $yy=($ny-$y-1)*2.5+1;
984
 
985
 
986
 
987
 
988 48 alirezamon
                                        $dotfile.=get_router_dot_file($n,$label,"$xx,$yy!",$gtype);
989
 
990 43 alirezamon
 
991
                                }}
992
 
993
 
994
        $dotfile=$dotfile."\n\n";
995
 
996
        #add connections
997
        for(my $y=0; $y<$ny; $y++){
998
                for(my $x=0; $x<$nx; $x++){
999
 
1000 48 alirezamon
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,1,'R',get_router_num($self,($x+1),$y),undef,3,$gtype) if($x <$nx-1);
1001
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,1,'R',get_router_num($self,0,$y),undef,3,$gtype) if($x == ($nx-1) && $btrace);
1002
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,2,'R',get_router_num($self,$x,($y-1)),undef,4,$gtype)if($y>0) ;
1003
             $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,2,'R',get_router_num($self,$x,($ny-1)),undef,4,$gtype) if($y ==0 && $btrace && !$oned);
1004 43 alirezamon
          #   $dotfile=$dotfile.node_connection('R',$x,$y,0,'T',$x,$y);               
1005
    }}
1006 48 alirezamon
if($topology eq '"FMESH"' ) {
1007 43 alirezamon
        for(my $id=0; $id<$NE; $id++){
1008 48 alirezamon
                my $rid= get_connected_router_id_to_endp($self,$id);
1009
                my $tmp = $nx*$ny*$nz;
1010
                my $p = ($id<$tmp)? $id%$nz+5 :
1011
                        ($id<$tmp+$nx)? 2 :
1012
                        ($id<$tmp+2*$nx)? 4 :
1013
                        ($id<$tmp+2*$nx+$ny)? 3:1;
1014
                $dotfile=$dotfile.node_connection('R',$rid,undef,$p,'T',$id,undef,undef,$gtype);
1015
 
1016
        }
1017
 
1018
}else{
1019
        for(my $id=0; $id<$NE; $id++){
1020 43 alirezamon
                my $rid=int($id/$nz);
1021
                my $p =  $id%$nz+5;
1022 48 alirezamon
                $dotfile=$dotfile.node_connection('R',$rid,undef,$p,'T',$id,undef,undef,$gtype);
1023 43 alirezamon
 
1024
        }
1025 48 alirezamon
}
1026 43 alirezamon
        $dotfile=$dotfile."\n}\n";
1027
        return $dotfile;
1028
 
1029
 
1030
 
1031
}
1032
 
1033 48 alirezamon
sub get_endp_pos {
1034
        my $self=shift;
1035
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
1036
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($self);
1037
        my %pos;
1038
        if($topology eq '"FATTREE"' || $topology eq '"TREE"'){
1039
 
1040
                for(my $i=0; $i<$NE; $i++){
1041
                            $pos{$i} = "\"$i,0!\"";
1042
            }
1043
                return %pos;
1044
        }
1045
        #($topology eq '"TORUS"' || $topology eq '"RING"' || $topology eq '"RING"' || $topology eq '"LINE"');   
1046
 
1047
        my $nx=$self->object_get_attribute('noc_param','T1');
1048
        my $ny=$self->object_get_attribute('noc_param','T2');
1049
        my $nz=$self->object_get_attribute('noc_param','T3');
1050
 
1051
 
1052
        #generate endpoints
1053
        for(my $y=0; $y<$ny; $y++){
1054
                                for(my $x=0; $x<$nx; $x++){
1055
                                        for(my $z=0; $z<$nz; $z++){
1056
                                                my $id=($y*$nx+$x)*$nz+$z;
1057
                                                my $offsetx = ($z==0 || $z==3) ? 1.05 : -1.05;
1058
                                                my $offsety = ($z==0 || $z==1) ? -0.85 : +0.85;
1059
                                                my $tx=$x*3+$offsetx;
1060
                                                my $ty=($ny-$y-1)*2.5+1+$offsety;
1061
                                                $pos{$id} = "\"$tx,$ty!\"";
1062
                                        }
1063
                                }
1064
        }
1065
                return %pos;
1066
}
1067 43 alirezamon
 
1068 48 alirezamon
sub get_record_endp_dot_file {
1069
        my ($name,$label,$pos)=@_;
1070 43 alirezamon
 
1071 48 alirezamon
return "$name\[
1072
        label = \"$label\"
1073
    pos = \"$pos\"
1074
    shape=record
1075
        color=orange
1076
        style=filled
1077
        fillcolor=orange
1078
];
1079
"
1080
;
1081
}
1082
 
1083
sub get_router_dot_file {
1084
        my ($name,$label,$pos,$type)=@_;
1085
 
1086
 
1087
        return ($type eq 'comp')? "\"$name\"\[
1088
        label=\"$label\"
1089
    pos = \"$pos\"
1090
    shape=record
1091
        color=blue
1092
        style=filled
1093
        fillcolor=blue
1094
];
1095
"
1096
:
1097
"\"$name\"\[
1098
        label=\"$name\"
1099
    pos = \"$pos\"
1100
    shape=circle
1101
        color=blue
1102
        style=filled
1103
        fillcolor=blue
1104
];
1105
"
1106
;
1107
 
1108
 
1109
}
1110
 
1111 43 alirezamon
sub generate_fattree_dot_file{
1112
        my $self=shift;
1113 48 alirezamon
        my $gtype=$self->object_get_attribute("tile_diagram","gtype");
1114
 
1115 43 alirezamon
 
1116
        my $dotfile=
1117
"digraph G {
1118 48 alirezamon
        graph [layout = neato, rankdir = LR , splines = true, overlap = true];
1119 43 alirezamon
        node[shape=record];
1120
        ";
1121
 
1122
#add nodes
1123 48 alirezamon
    my ($NE, $NR, $RAw, $EAw, $Fw)=get_topology_info($self);
1124
 
1125 43 alirezamon
        my $k=$self->object_get_attribute('noc_param','T1');
1126
        my $nl=$self->object_get_attribute('noc_param','T2');
1127
        my @bp;
1128
        my @hp;
1129
        for(my $p=0; $p<$k; $p++) {push (@bp,"<p$p>$p");}
1130
        for(my $p=$k; $p<2*$k; $p++) {push (@hp,"<p$p>$p");}
1131
        my $bp= join("|",@bp);
1132
        my $hp= join("|",@hp);
1133 48 alirezamon
        #my $NC= powi( $k,$nl  ); #total endpoints
1134
        my $NL= $NE/$k ; #number of nodes in  each layer 
1135 43 alirezamon
 
1136
 
1137
#add endpoints
1138 48 alirezamon
for(my $i=0; $i<$NE; $i++){
1139 43 alirezamon
        my $x=$i%$k;
1140
        my $y=int($i/$k);
1141
 
1142
$dotfile=$dotfile."T$i\[
1143
        label = \"T$i\"
1144
    pos = \"$i,0!\"
1145
    shape=house
1146
    margin=0
1147
        color=orange
1148
        style=filled
1149
        fillcolor=orange
1150
];
1151
";
1152
        }
1153
 
1154
        #add roots
1155
        for(my $pos=0; $pos<$NL; $pos++){
1156
                my $x=($k)*$pos+($k/2)-0.5;
1157
                my $y=  1.5*($nl-1)+1;
1158
                my $r=$pos;
1159 48 alirezamon
                my $label = "\{R$r\}|\{$bp\}";
1160
 
1161
                $dotfile.=get_router_dot_file("R$r",$label,"$x,$y!",$gtype);
1162
 
1163 43 alirezamon
        }
1164
 
1165
        #add leaves
1166
        for(my $l=1; $l<$nl; $l++){
1167
        for(my $pos=0; $pos<$NL; $pos++){
1168 48 alirezamon
                my $x=($k)*$pos+($k/2)-0.5;
1169
                my $y=  1.5*($nl-$l-1)+1;
1170
                my $r=$NL*$l+$pos;
1171
                my $label = "\{$hp\}|\{R$r\}|\{$bp\}";
1172
 
1173
                $dotfile.=get_router_dot_file("R$r",$label,"$x,$y!",$gtype);
1174
 
1175
        }
1176 43 alirezamon
        }
1177
 
1178
 
1179
 
1180 48 alirezamon
        #connect all down input chanels
1181 43 alirezamon
        my $n=$nl;
1182
        my $nPos = powi( $k, $n-1);
1183
        my $chan_per_direction = ($k * powi( $k , $n-1 )); #up or down
1184
        my $chan_per_level = 2*($k * powi( $k , $n-1 )); #up+down
1185
 
1186
        for (my $level = 0; $level<$n-1; $level++){
1187 48 alirezamon
            #input chanel are numbered interleavely, the interleaev depends on level
1188 43 alirezamon
            my $routers_per_neighborhood = powi($k,$n-1-($level));
1189
            my $routers_per_branch = powi($k,$n-1-($level+1));
1190
            my $level_offset = $routers_per_neighborhood*$k;
1191
            for ( my $pos = 0; $pos < $nPos; ++$pos ) {
1192
                        my $neighborhood = int($pos/$routers_per_neighborhood);
1193
                        my $neighborhood_pos = $pos % $routers_per_neighborhood;
1194
                        for ( my $port = 0; $port < $k; ++$port ) {
1195
                                my $link =
1196
                                        (($level+1)*$chan_per_level - $chan_per_direction)  #which levellevel
1197
                                        +$neighborhood*$level_offset   #region in level
1198
                                        +$port*$routers_per_branch*$k  #sub region in region
1199
                                        +($neighborhood_pos)%$routers_per_branch*$k  #router in subregion
1200
                                        +($neighborhood_pos)/$routers_per_branch; #port on router
1201
 
1202
        #int link = (level*chan_per_level - chan_per_direction) + pos*k + port ;
1203
                                my $connect_l= int(($link+$chan_per_direction)/$chan_per_level);
1204
                                my $tmp=(($link+$chan_per_direction) % $chan_per_level);
1205
                                my $connect_pos= int($tmp/$k);
1206
                                my $connect_port= ($tmp%$k)+$k;
1207
                                my $id1=$NL*$level+$pos;
1208
                                my $connect_id=$NL*$connect_l+$connect_pos;
1209 48 alirezamon
                                $dotfile=$dotfile.node_connection('R',$id1,undef,$port,'R',$connect_id,undef,$connect_port,$gtype);
1210 43 alirezamon
                        }
1211
            }
1212
        }
1213
 
1214
        #add endpoints connection
1215 48 alirezamon
        for(my $i=0; $i<$NE; $i++){
1216 43 alirezamon
                my $r= $NL*($nl-1)+int($i/$k);
1217 48 alirezamon
                 $dotfile=$dotfile.node_connection('T',$i,undef,undef,'R',$r,undef,$i%($k),$gtype);
1218 43 alirezamon
 
1219
        }
1220
        $dotfile=$dotfile."\n}\n";
1221
        return $dotfile;
1222
}
1223
 
1224 48 alirezamon
sub generate_star_dot_file{
1225
        my $self=shift;
1226
 
1227
        my $dotfile=
1228
"digraph G {
1229
        graph [layout = neato, fontsize=3, rankdir = LR , splines = true, overlap = false];
1230
        node[shape=record];
1231
        ";
1232
 
1233
        my $pnum=$self->object_get_attribute('noc_param','T1');
1234
        $dotfile.=router_node_dot_sim($pnum,"R","R");
1235
 
1236
        for(my $p=0; $p<$pnum; $p++) {
1237
        $dotfile.=endp_node_dot_sim ("T$p","T$p");
1238
        $dotfile.="R -> T$p [dir=none];\n";
1239
        $dotfile.='#'.node_connection('T',$p,undef,undef,'R',0,undef,$p);
1240
        }
1241
 
1242
        $dotfile.="\n}\n";
1243
        return $dotfile;
1244
}
1245 43 alirezamon
 
1246
 
1247
 
1248 48 alirezamon
 
1249
 
1250
 
1251
 
1252
 
1253
 
1254
 
1255
 
1256
 
1257 43 alirezamon
sub generate_tree_dot_file{
1258
        my $self=shift;
1259 48 alirezamon
        my $gtype=$self->object_get_attribute("tile_diagram","gtype");
1260 43 alirezamon
 
1261
        my $dotfile=
1262
"digraph G {
1263 48 alirezamon
        graph [layout = neato, rankdir = LR , splines = true, overlap = true];
1264 43 alirezamon
        node[shape=record];
1265
        ";
1266
 
1267
 
1268
        my $k=$self->object_get_attribute('noc_param','T1');
1269
        my $nl=$self->object_get_attribute('noc_param','T2');
1270
        #generate routres port interface
1271
        my @bp;
1272
        my @hp;
1273
        for(my $p=0; $p<$k; $p++) {
1274
                push (@bp,"<n$p>") if(($k%2)==0 && $p==$k/2);#if k is odd number add one empty space in the middle
1275
                push (@bp,"<p$p>$p");
1276
 
1277
        }
1278
        for(my $p=$k; $p<2*$k; $p++) {
1279
                if($p==$k+int(($k-1)/2)){
1280
                        push (@hp,"<n$p>") if(($k%2)==0);#if k is odd number add one empty space in the middle
1281
                        push (@hp,"<p$k>$k");
1282
                }else{
1283
                        push (@hp,"<n$p>");
1284
                }
1285
        }
1286
        my $bp= join("|",@bp);
1287
        my $hp= join("|",@hp);
1288 48 alirezamon
#       my ($NE,$NR)=get_topology_info($self);
1289
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($self);
1290 43 alirezamon
 
1291
 
1292
        #add endpoints
1293
        for(my $i=0; $i<$NE; $i++){
1294
                $dotfile=$dotfile."T$i\[
1295
        label = \"T$i\"
1296
    pos = \"$i,0!\"
1297
    shape=house
1298
    margin=0
1299
        color=orange
1300
        style=filled
1301
        fillcolor=orange
1302
];
1303
";
1304
        }
1305
 
1306
        #add roots
1307 48 alirezamon
        my $label = "\{R0\}|\{$bp\}";
1308 43 alirezamon
        my $x=(($NE-1)/2);
1309
        my $y=  1.5*($nl-1)+1;
1310 48 alirezamon
        $dotfile.=get_router_dot_file("R0",$label,"$x,$y!",$gtype);
1311 43 alirezamon
 
1312 48 alirezamon
 
1313
 
1314 43 alirezamon
        #add leaves
1315
        my $t=1;
1316
 
1317
        for(my $l=$nl-1; $l>0; $l--){
1318
                my $NL = powi($k,$l);
1319
                $t*=$k;
1320
                for(my $pos=0; $pos<$NL; $pos++){
1321
                        my $x=  $t*$pos + ($t-1)/2 ;
1322
                        my $y=  1.5*($nl-$l)-.5;
1323
                        my $r=sum_powi($k,$l)+$pos;
1324 48 alirezamon
        my $label = "\{$hp\}|\{R$r\}|\{$bp\}";
1325
 
1326
        $dotfile.=get_router_dot_file("R$r",$label,"$x,$y!",$gtype);
1327
 
1328
 
1329 43 alirezamon
                }
1330
        }
1331
 
1332
        #add leave connections
1333
        for(my $l=$nl-1; $l>0; $l--){
1334
                my $NL = powi($k,$l);
1335
                for(my $pos=0; $pos<$NL; $pos++){
1336
                        my $id1=sum_powi($k,$l)+$pos;
1337
                        my $id2=sum_powi($k,$l-1)+int($pos/$k);
1338 48 alirezamon
                        $dotfile=$dotfile.node_connection('R',$id1,undef,$k,'R',$id2,undef,$pos % $k,$gtype);
1339 43 alirezamon
                }
1340
        }
1341
 
1342
        #add endpoints connection
1343
        for(my $i=0; $i<$NE; $i++){
1344
                 my $r= sum_powi($k,$nl-1)+int($i/$k);
1345 48 alirezamon
                 $dotfile=$dotfile.node_connection('T',$i,undef,undef,'R',$r,undef,$i%($k),$gtype);
1346 43 alirezamon
 
1347
        }
1348
 
1349
 
1350
 
1351
        $dotfile=$dotfile."\n}\n";
1352
        return $dotfile;
1353
}
1354
 
1355
 
1356
sub get_topology_dot_file{
1357
        my $self=shift;
1358
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
1359 48 alirezamon
        return generate_mesh_dot_file ($self) if($topology eq '"RING"' || $topology eq '"LINE"' || $topology eq '"MESH"'|| $topology eq '"FMESH"' || $topology eq '"TORUS"' );
1360 43 alirezamon
        return generate_fattree_dot_file ($self) if($topology eq '"FATTREE"');
1361 48 alirezamon
        return generate_tree_dot_file($self) if($topology eq '"TREE"');
1362
        return generate_star_dot_file($self) if($topology eq '"STAR"');
1363
 
1364 43 alirezamon
}
1365
 
1366
 
1367 48 alirezamon
sub generate_merge_actor_dot_file{
1368
        my $self=shift;
1369
        my $dotfile=
1370
"digraph G {
1371
        graph [ layout = neato, rankdir = LR , splines=polyline, overlap = false];
1372
 
1373
";
1374
 
1375 43 alirezamon
 
1376 48 alirezamon
 
1377
#add connections
1378 43 alirezamon
 
1379 48 alirezamon
        my @traces= get_trace_list($self,'merge');
1380
        my %src_dst;
1381
        my %dests= get_destport_constant_list ($self,'merge');
1382
        my %srcs = get_srcport_constant_list  ($self,'merge');
1383
 
1384
 
1385
 
1386
        foreach my $p (@traces){
1387
                my ($src,$dst, $Mbytes, $file_id, $file_name,$init_weight,$min_pck, $max_pck,  $burst, $injct_rate, $injct_rate_var,$src_port,$dst_port,$buff_size,$chanel,$vc,$class)
1388
                                =get_trace($self,'merge',$p);
1389
 
1390
 
1391
 
1392
                $dotfile=$dotfile."\"$src\" -> \"$dst\"  [label=\"$srcs{$src}{$src_port}{$chanel}->$dests{$dst}{$dst_port}\" ];\n";
1393
        }
1394
 
1395
        $dotfile=$dotfile."\n}\n";
1396
        return $dotfile;
1397
 
1398
}
1399 43 alirezamon
 
1400
 
1401
 
1402
 
1403
 
1404
 
1405
 
1406
 
1407 48 alirezamon
 
1408 34 alirezamon
return 1;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.