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 43

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 34 alirezamon
#!/usr/bin/perl -w
2 38 alirezamon
use Glib qw/TRUE FALSE/;
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
 
15
 
16 43 alirezamon
 
17 34 alirezamon
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
                                my $v=$self->soc_get_module_param_value($instance_id,$s_value);
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
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
143
        $scrolled_win->set_policy( "automatic", "automatic" );
144
 
145
        $window->add ($table);
146
 
147
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
148
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
149 38 alirezamon
        my $unused = gen_check_box_object ($self,"tile_diagram","show_unused",0,undef,undef);
150 34 alirezamon
        my $save = def_image_button('icons/save.png',undef,TRUE);
151 38 alirezamon
        my $clk = gen_check_box_object ($self,"tile_diagram","show_clk",0,undef,undef);
152
        my $reset = gen_check_box_object ($self,"tile_diagram","show_reset",0,undef,undef);
153 34 alirezamon
        #my $save = def_image_button('icons/save.png',undef,TRUE);
154
 
155 38 alirezamon
        my $scale=$self->object_get_attribute("tile_diagram","scale");
156 34 alirezamon
        $scale= 1 if (!defined $scale);
157
 
158
 
159
 
160
 
161
        my $col=0;
162
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
163
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
164
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
165
        $table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
166
        $table->attach ($unused,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
167
        $table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
168
        $table->attach ($clk,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
169
        $table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
170
        $table->attach ($reset,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
171
        while ($col<20){
172
 
173
                my $tmp=gen_label_in_left('');
174
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
175
        }
176
 
177
        $plus  -> signal_connect("clicked" => sub{
178
                $scale*=1.1 if ($scale <10);
179 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
180
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
181 34 alirezamon
        });
182
        $minues  -> signal_connect("clicked" => sub{
183
                $scale*=.9  if ($scale >0.1); ;
184 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
185
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
186 34 alirezamon
        });
187
        $save-> signal_connect("clicked" => sub{
188 38 alirezamon
                        save_diagram_as ($self);
189 34 alirezamon
                });
190
        $unused-> signal_connect("toggled" => sub{
191 38 alirezamon
                if(gen_diagram($self,'tile')){
192
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
193 34 alirezamon
                }
194
 
195
        });
196
        $clk-> signal_connect("toggled" => sub{
197 38 alirezamon
                if(gen_diagram($self,'tile')){
198
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
199 34 alirezamon
        }
200
 
201
        });
202
        $reset-> signal_connect("toggled" => sub{
203 38 alirezamon
                if(gen_diagram($self,'tile')){
204
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
205 34 alirezamon
                }
206
 
207
        });
208
 
209 38 alirezamon
        if(gen_diagram($self,'tile')){
210
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
211 34 alirezamon
        }
212
        $window->show_all();
213
}
214
 
215
 
216 43 alirezamon
sub show_topology_diagram {
217
        my $self= shift;
218 34 alirezamon
 
219 43 alirezamon
        my $table=def_table(20,20,FALSE);
220
 
221
        my $window=def_popwin_size(80,80,"NoC-based MCSoC topology block diagram",'percent');
222
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
223
        $scrolled_win->set_policy( "automatic", "automatic" );
224
 
225
        $window->add ($table);
226
 
227
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
228
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
229
        my $save = def_image_button('icons/save.png',undef,TRUE);
230
 
231
        my $scale=$self->object_get_attribute("tile_diagram","scale");
232
        $scale= 1 if (!defined $scale);
233
 
234
 
235
 
236
 
237
        my $col=0;
238
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
239
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
240
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
241
        #$table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
242
        #$table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
243
        #$table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
244
        while ($col<20){
245
                my $tmp=gen_label_in_left('');
246
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
247
        }
248
 
249
        $plus  -> signal_connect("clicked" => sub{
250
                $scale*=1.1 if ($scale <10);
251
                $self->object_add_attribute("topology_diagram","scale", $scale );
252
                show_diagram ($self,$scrolled_win,$table,"topology_diagram");
253
        });
254
        $minues  -> signal_connect("clicked" => sub{
255
                $scale*=.9  if ($scale >0.1); ;
256
                $self->object_add_attribute("topology_diagram","scale", $scale );
257
                show_diagram ($self,$scrolled_win,$table,"topology_diagram");
258
        });
259
        $save-> signal_connect("clicked" => sub{
260
                        save_diagram_as ($self);
261
                });
262
 
263
 
264
        if(gen_diagram($self,'topology')){
265
                show_diagram ($self,$scrolled_win,$table,"topology_diagram");
266
        }
267
        $window->show_all();
268
}
269
 
270
 
271
 
272
 
273
 
274 34 alirezamon
sub gen_diagram {
275 38 alirezamon
        my ($self,$type)=@_;
276 34 alirezamon
 
277 38 alirezamon
        my $dotfile;
278
        $dotfile=   get_dot_file($self) if ($type eq 'tile');
279 43 alirezamon
        $dotfile=   get_topology_dot_file($self) if ($type eq 'topology');
280
        $dotfile=   generate_custom_topology_dot_file($self) if ($type eq 'custom_topology');
281 38 alirezamon
        $dotfile=   generate_trace_dot_file($self) if ($type eq 'trace');
282
        $dotfile=   generate_map_dot_file($self) if ($type eq 'map');
283
 
284 34 alirezamon
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
285 43 alirezamon
        #mkpath("$tmp_dir/",1,01777);
286
        #open(FILE,  ">$tmp_dir/diagram.txt") || die "Can not open: $!";
287
        #print FILE $dotfile;
288
        #close(FILE) || die "Error closing file: $!";
289
 
290
        #unlink "$tmp_dir/diagram.png";
291 34 alirezamon
 
292 38 alirezamon
        my $cmd;
293 43 alirezamon
        #$cmd=  "dot  $tmp_dir/diagram.txt | neato -n  -Tpng -o $tmp_dir/diagram.png" if ($type eq 'tile' || $type eq 'trace'  );
294
        #$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' );  
295
        $cmd=  " dot   | neato -n  -Tpng -o $tmp_dir/diagram.png" if ($type eq 'tile' || $type eq 'trace'  );
296
        $cmd = " dot   -Kfdp -n -Tpng -o $tmp_dir/diagram.png" if ( $type eq 'map' || $type eq 'topology' || $type eq 'custom_topology' );
297
    $cmd = "echo \'$dotfile\' | $cmd";
298 34 alirezamon
 
299
        my ($stdout,$exit,$stderr)= run_cmd_in_back_ground_get_stdout ($cmd);
300
 
301 43 alirezamon
        if ( length( $stderr || '' ) !=0)  {
302 34 alirezamon
                message_dialog("$stderr\nHave you installed graphviz? If not run \n \t \"sudo apt-get install graphviz\" \n in terminal");
303 43 alirezamon
                return 0 unless (-f "$tmp_dir/diagram.png");
304 34 alirezamon
        }
305
                return  1;
306
}
307
 
308
 
309
 
310
sub show_diagram {
311 38 alirezamon
        my ($self,$scrolled_win,$table, $name)=@_;
312 34 alirezamon
 
313
        $scrolled_win->destroy;
314
        $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
315
        $scrolled_win->set_policy( "automatic", "automatic" );
316
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);           
317 38 alirezamon
        my $scale=$self->object_get_attribute($name,"scale");
318 34 alirezamon
        $scale= 1 if (!defined $scale);
319
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
320
        my $diagram=open_image("$tmp_dir/diagram.png",70*$scale,70*$scale,'percent');
321 43 alirezamon
 
322
        $scrolled_win->add_with_viewport($diagram);
323
        $scrolled_win->show_all();
324 34 alirezamon
 
325
 
326
 
327
 
328
}
329
 
330
 
331
sub save_diagram_as {
332 38 alirezamon
        my $self= shift;
333 34 alirezamon
 
334
        my $file;
335
        my $title ='Save as';
336
 
337
 
338
 
339
        my @extensions=('png');
340
        my $open_in=undef;
341
        my $dialog = Gtk2::FileChooserDialog->new(
342
                'Save file', undef,
343
                'save',
344
                'gtk-cancel' => 'cancel',
345
                'gtk-ok'     => 'ok',
346
                );
347
        # if(defined $extension){
348
 
349
                foreach my $ext (@extensions){
350
                        my $filter = Gtk2::FileFilter->new();
351
                        $filter->set_name($ext);
352
                        $filter->add_pattern("*.$ext");
353
                        $dialog->add_filter ($filter);
354
                }
355
 
356
        # }
357
          if(defined  $open_in){
358
                $dialog->set_current_folder ($open_in);
359
                # print "$open_in\n";
360
 
361
        }
362
 
363
        if ( "ok" eq $dialog->run ) {
364
                        $file = $dialog->get_filename;
365
                        my $ext = $dialog->get_filter;
366
                        $ext=$ext->get_name;
367
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
368
                        $file = ($suffix eq ".$ext" )? $file : "$file.$ext";
369
 
370 38 alirezamon
                        $self->object_add_attribute("graph_save","name",$file);
371
                        $self->object_add_attribute("graph_save","extension",$ext);
372 34 alirezamon
                        my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
373
                        copy ($tmp,$file);
374
 
375
 
376
 
377
                         }
378
                        $dialog->destroy;
379 38 alirezamon
}
380 34 alirezamon
 
381
 
382
 
383 38 alirezamon
sub generate_trace_dot_file{
384
        my $self=shift;
385
        my $dotfile=
386
"digraph G {
387
        graph [rankdir = LR , splines=polyline, overlap = false];
388
 
389
";
390
 
391
#add nodes
392
        #my @tasks=get_all_tasks($self);
393
        #foreach my $p (@tasks){
394
        #       $dotfile=$dotfile."\"$p\" [label=\"{   $p} }\"];\n";            
395
        #}      
396
 
397
#add connections
398 34 alirezamon
 
399 38 alirezamon
        my @traces= $self->get_trace_list();
400
        foreach my $p (@traces) {
401
                my ($src,$dst, $Mbytes, $file_id, $file_name)=$self->get_trace($p);
402
                $dotfile=$dotfile."\"$src\" -> \"$dst\"  [label=\"$Mbytes\" ];\n";
403
        }
404
 
405
        $dotfile=$dotfile."\n}\n";
406
        return $dotfile;
407
 
408 34 alirezamon
}
409
 
410
 
411
 
412 38 alirezamon
sub generate_map_dot_file{
413
        my $self=shift;
414
        my $dotfile=
415
"digraph G {
416
        graph [rankdir = LR ,splines=spline,  overlap = false];
417
        node[shape=record];
418
 
419
        ";
420
 
421
 
422
 
423
#add nodes
424 43 alirezamon
        my $nx=$self->object_get_attribute('noc_param','T1');
425
        my $ny=$self->object_get_attribute('noc_param','T2');
426 38 alirezamon
        my $nc= $nx * $ny;
427
        my @tasks=get_all_tasks($self);
428
 
429
        my @mappedtasks;
430
 
431
 
432
        for(my $y=0; $y<$ny; $y++){
433
 
434
 
435
                                for(my $x=0; $x<$nx; $x++){
436
                                        my $id=$y*$nx+$x;
437
                                        my $task=get_task_assigned_to_tile($self,$x,$y);
438
                                        push(@mappedtasks,$task) if (defined $task);
439
 
440
                                        $task= "_" if (!defined $task);
441
                                        my $n = ($ny==1)?   "tile(${x})" : "tile${id}(${x}_$y)" ;
442
                                        my $m = ($ny==1)?   "tile(${x})" : "tile(${x}_$y)" ;
443
                                        my $node = "\"$m\"";
444
                                        my $label =   "\"<S$task> $n|<R$task> $task\"" ;
445
                                        my $xx=$x*1.5;
446
                                        my $yy=($ny-$y-1)*1.5;
447
 
448
                                        $dotfile=$dotfile."
449
$node\[
450
        label = $label
451
    pos = \"$xx,$yy!\"
452
];";
453
 
454
 
455
 
456
                                }
457
 
458
        }
459
 
460
 
461
        $dotfile=$dotfile."\n\n";
462
 
463
        #add connections
464
        my @traces= $self->get_trace_list();
465
        foreach my $p (@traces){
466
                my ($src,$dst, $Mbytes, $file_id, $file_name)=$self->get_trace($p);
467
 
468
                my $src_tile= $self->object_get_attribute("MAP_TILE","$src");
469
                my $dst_tile= $self->object_get_attribute("MAP_TILE","$dst");
470
 
471
                next if ( $src_tile eq "-" ||  $dst_tile eq "-" ) ;
472
 
473
 
474
 
475
                $dotfile=$dotfile." \"$src_tile\" :  \"S$src\" ->  \"$dst_tile\" : \"R$dst\"  ;\n";
476
 
477
 
478
        }
479
 
480
 
481
 
482
 
483
        $dotfile=$dotfile."\n}\n";
484
        return $dotfile;
485
 
486
}
487
 
488
 
489
 
490
 
491
 
492
sub show_trace_diagram {
493
        my ($self,$type)=@_;
494
 
495
        my $table=def_table(20,20,FALSE);
496
 
497
        my $window=def_popwin_size(80,80,"Processing Tile functional block diagram",'percent');
498
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
499
        $scrolled_win->set_policy( "automatic", "automatic" );
500
 
501
        $window->add ($table);
502
 
503
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
504
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
505
        my $save = def_image_button('icons/save.png',undef,TRUE);
506
 
507
 
508
        my $scale=$self->object_get_attribute("${type}_diagram","scale");
509
        $scale= 1 if (!defined $scale);
510
 
511
 
512
 
513
 
514
        my $col=0;
515
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
516
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
517
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
518
 
519
        while ($col<20){
520
 
521
 
522
 
523
                my $tmp=gen_label_in_left('');
524
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
525
        }
526
 
527
        $plus  -> signal_connect("clicked" => sub{
528
                $scale*=1.1 if ($scale <10);
529
                $self->object_add_attribute("${type}_diagram","scale", $scale );
530
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
531
        });
532
        $minues  -> signal_connect("clicked" => sub{
533
                $scale*=.9  if ($scale >0.1); ;
534
                $self->object_add_attribute("${type}_diagram","scale", $scale );
535
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
536
        });
537
        $save-> signal_connect("clicked" => sub{
538
                        save_diagram_as ($self);
539
                });
540
 
541
 
542
 
543
 
544
        if(gen_diagram($self,$type)){
545
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
546
        }
547
        $window->show_all();
548
 
549
 
550
 
551
 
552
}
553 43 alirezamon
 
554
 
555
 
556
 
557
 
558
 
559
sub node_connection{
560
        my ($sn,$sx,$sy,$sp,$dn,$dx,$dy,$dp)=@_;
561
        my $spp = (defined $sp) ? ":\"p$sp\"" : " ";
562
        my $dpp = (defined $dp) ? ":\"p$dp\"" : " ";
563
        my $sname = (defined $sy) ? "\"$sn${sx}_${sy}\"" : "\"$sn${sx}\"";
564
        my $dname = (defined $dy) ? "\"$dn${dx}_${dy}\"" : "\"$dn${dx}\"";
565
 
566
        my $t= "$sname  $spp -> $dname  $dpp [  dir=none];\n";
567
        return $t;
568
}
569
 
570
sub node_connection2{
571
        my ($sn,$sx,$sp,$dn,$dx,$dy,$dp)=@_;
572
        my $spp = (defined $sp) ? ":\"p$sp\"" : " ";
573
        my $dpp = (defined $dp) ? ":\"p$dp\"" : " ";
574
        my $sname =   "\"$sn${sx}\"";
575
        my $dname =  "\"$dn${dx}\"";
576
 
577
        my $t= "$sname  $spp -> $dname  $dpp [  dir=none];\n";
578
        return $t;
579
}
580
 
581
 
582
sub generate_mesh_dot_file_old{
583
        my $self=shift;
584
        my $dotfile=
585
"digraph G {
586
        graph [rankdir = LR , splines = true, overlap = true];
587
 
588
 
589
 
590
        node[shape=record];
591
 
592
        ";
593
 
594
#five_port_router [
595
#       label="{ |2| } | {3|R0|1} | { |4|0}"
596
#       shape=record
597
#       color=blue
598
#       style=filled
599
#       fillcolor=blue
600
#];     
601
 
602
#add nodes
603
        my $nx=$self->object_get_attribute('noc_param','T1');
604
        my $ny=$self->object_get_attribute('noc_param','T2');
605
        my $nc= $nx * $ny;
606
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
607
        my $btrace= ($topology eq '"TORUS"' || $topology eq '"RING"');
608
        my $oned = ($topology eq '"RING"' || $topology eq '"LINE"');
609
        for(my $y=0; $y<$ny; $y++){
610
                                for(my $x=0; $x<$nx; $x++){
611
                                        my $id=$y*$nx+$x;
612
 
613
 
614
                                        my $n =    "R${id}" ;
615
                                        my $node = "${x}_$y";
616
                                        my $label =  ($oned)?
617
                                         "\{ |<p2>| \} | \{<p3>2|$n|<p1>1\} | \{ |<p4>|<p0>0\}"
618
                                        :  "\{ |<p2>2| \} | \{<p3>3|$n|<p1>1\} | \{ |<p4>4|<p0>0\}";
619
                                        my $xx=$x*2.5;
620
                                        my $yy=($ny-$y-1)*2.5+1;
621
                                        my $tx=$xx+0.75;
622
                                        my $ty=$yy-1;
623
                                        $dotfile=$dotfile."
624
\"R$node\"\[
625
        label = \"$label\"
626
    pos = \"$xx,$yy!\"
627
    shape=record
628
        color=blue
629
        style=filled
630
        fillcolor=blue
631
];
632
 
633
T$node\[
634
        label = \"Tile_$id($node)\"
635
    pos = \"$tx,$ty!\"
636
    shape=record
637
        color=orange
638
        style=filled
639
        fillcolor=orange
640
];";
641
 
642
;
643
                }
644
 
645
        }
646
 
647
 
648
        $dotfile=$dotfile."\n\n";
649
 
650
        #add connections
651
        for(my $y=0; $y<$ny; $y++){
652
                for(my $x=0; $x<$nx; $x++){
653
                         $dotfile=$dotfile.node_connection('R',$x,$y,1,'R',($x+1),$y,3) if($x <$nx-1);
654
                         $dotfile=$dotfile.node_connection('R',$x,$y,1,'R',0,$y,3) if($x == ($nx-1) && $btrace);
655
                         $dotfile=$dotfile.node_connection('R',$x,$y,2,'R',$x,($y-1),4)if($y>0) ;
656
             $dotfile=$dotfile.node_connection('R',$x,$y,2,'R',$x,($ny-1),4)   if($y ==0 && $btrace && !$oned);
657
             $dotfile=$dotfile.node_connection('R',$x,$y,0,'T',$x,$y);
658
 
659
 
660
 
661
        }}
662
 
663
 
664
 
665
 
666
        $dotfile=$dotfile."\n}\n";
667
        return $dotfile;
668
 
669
}
670
 
671
 
672
##################################
673
#
674
##################################
675
 
676
 
677
sub generate_mesh_dot_file{
678
        my $self=shift;
679
        my $dotfile=
680
"digraph G {
681
        graph [rankdir = RL , splines = true, overlap = true];
682
 
683
 
684
        node[shape=record];
685
 
686
        ";
687
 
688
#five_port_router [
689
#       label="{ |2| } | {3|R0|1} | { |4|0}"
690
#       shape=record
691
#       color=blue
692
#       style=filled
693
#       fillcolor=blue
694
#];     
695
 
696
#add nodes
697
        my $nx=$self->object_get_attribute('noc_param','T1');
698
        my $ny=$self->object_get_attribute('noc_param','T2');
699
        my $nz=$self->object_get_attribute('noc_param','T3');
700
        my $NE = $nx*$ny*$nz;
701
        my $NR = $nx*$ny;
702
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
703
 
704
 
705
        my $btrace= ($topology eq '"TORUS"' || $topology eq '"RING"');
706
        my $oned = ($topology eq '"RING"' || $topology eq '"LINE"');
707
 
708
        #generate endpoints
709
        for(my $y=0; $y<$ny; $y++){
710
                                for(my $x=0; $x<$nx; $x++){
711
                                        for(my $z=0; $z<$nz; $z++){
712
                                                my $id=($y*$nx+$x)*$nz+$z;
713
                                                my $offsetx = ($z==0 || $z==3) ? 1.05 : -1.05;
714
                                                my $offsety = ($z==0 || $z==1) ? -0.85 : +0.85;
715
                                                my $tx=$x*3+$offsetx;
716
                                                my $ty=($ny-$y-1)*2.5+1+$offsety;
717
 
718
$dotfile=$dotfile."
719
 
720
T$id\[
721
        label = \"T${id}\"
722
    pos = \"$tx,$ty!\"
723
    shape=record
724
        color=orange
725
        style=filled
726
        fillcolor=orange
727
];";
728
 
729
        }}}
730
 
731
#generate routers       
732
        for(my $y=0; $y<$ny; $y++){
733
                                for(my $x=0; $x<$nx; $x++){
734
                                        my $e0 = '0';
735
                                        my $e1 = ($nz>1)? ( ($oned)? '3':'5') : ' ';
736
                                        my $e2 = ($nz>2)? ( ($oned)? '4':'6') : ' ';
737
                                        my $e3 = ($nz>3)? ( ($oned)? '5':'7') : ' ';
738
 
739
                                        my $id=$y*$nx+$x;
740
                                        my $n = "R${id}";
741
                                        my $label =  ($oned)?
742
                                         "\{<p7>$e2 |<p2> |<p8>$e3 \} | \{<p3>2|$n|<p1>1\} | \{<p6>$e1 |<p4> |<p5>$e0\}"
743
                                        :"\{<p7>$e2 |<p2>2|<p8>$e3 \} | \{<p3>3|$n|<p1>1\} | \{<p6>$e1 |<p4>4|<p5>$e0\}";
744
                                        my $xx=$x*3;
745
                                        my $yy=($ny-$y-1)*2.5+1;
746
 
747
 
748
 
749
$dotfile=$dotfile."
750
\"$n\"\[
751
        label = \"$label\"
752
    pos = \"$xx,$yy!\"
753
    shape=record
754
        color=blue
755
        style=filled
756
        fillcolor=blue
757
];
758
 
759
";
760
 
761
                                }}
762
 
763
 
764
        $dotfile=$dotfile."\n\n";
765
 
766
        #add connections
767
        for(my $y=0; $y<$ny; $y++){
768
                for(my $x=0; $x<$nx; $x++){
769
 
770
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,1,'R',get_router_num($self,($x+1),$y),undef,3) if($x <$nx-1);
771
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,1,'R',get_router_num($self,0,$y),undef,3) if($x == ($nx-1) && $btrace);
772
                         $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,2,'R',get_router_num($self,$x,($y-1)),undef,4)if($y>0) ;
773
             $dotfile=$dotfile.node_connection('R',get_router_num($self,$x,$y),undef,2,'R',get_router_num($self,$x,($ny-1)),undef,4) if($y ==0 && $btrace && !$oned);
774
          #   $dotfile=$dotfile.node_connection('R',$x,$y,0,'T',$x,$y);               
775
    }}
776
 
777
        for(my $id=0; $id<$NE; $id++){
778
                my $rid=int($id/$nz);
779
                my $p =  $id%$nz+5;
780
                $dotfile=$dotfile.node_connection('R',$rid,undef,$p,'T',$id,undef);
781
 
782
        }
783
 
784
        $dotfile=$dotfile."\n}\n";
785
        return $dotfile;
786
 
787
 
788
 
789
}
790
 
791
 
792
 
793
sub generate_fattree_dot_file{
794
        my $self=shift;
795
 
796
        my $dotfile=
797
"digraph G {
798
        graph [rankdir = LR , splines = true, overlap = true];
799
        node[shape=record];
800
        ";
801
 
802
#add nodes
803
        my $k=$self->object_get_attribute('noc_param','T1');
804
        my $nl=$self->object_get_attribute('noc_param','T2');
805
        my @bp;
806
        my @hp;
807
        for(my $p=0; $p<$k; $p++) {push (@bp,"<p$p>$p");}
808
        for(my $p=$k; $p<2*$k; $p++) {push (@hp,"<p$p>$p");}
809
        my $bp= join("|",@bp);
810
        my $hp= join("|",@hp);
811
        my $NC= powi( $k,$nl  ); #total endpoints
812
        my $NL= $NC/$k ; #number of nodes in  each layer 
813
 
814
 
815
#add endpoints
816
for(my $i=0; $i<$NC; $i++){
817
        my $x=$i%$k;
818
        my $y=int($i/$k);
819
 
820
$dotfile=$dotfile."T$i\[
821
        label = \"T$i\"
822
    pos = \"$i,0!\"
823
    shape=house
824
    margin=0
825
        color=orange
826
        style=filled
827
        fillcolor=orange
828
];
829
";
830
        }
831
 
832
        #add roots
833
        for(my $pos=0; $pos<$NL; $pos++){
834
                my $x=($k)*$pos+($k/2)-0.5;
835
                my $y=  1.5*($nl-1)+1;
836
                my $r=$pos;
837
                my $lable = "\{R$r\}|\{$bp\}";
838
        $dotfile=$dotfile."
839
\"R$r\"\[
840
        label=\"$lable\"
841
    pos = \"$x,$y!\"
842
    shape=record
843
        color=blue
844
        style=filled
845
        fillcolor=blue
846
];
847
";
848
        }
849
 
850
        #add leaves
851
        for(my $l=1; $l<$nl; $l++){
852
        for(my $pos=0; $pos<$NL; $pos++){
853
        my $x=($k)*$pos+($k/2)-0.5;
854
        my $y=  1.5*($nl-$l-1)+1;
855
        my $r=$NL*$l+$pos;
856
        my $lable = "\{$hp\}|\{R$r\}|\{$bp\}";
857
         $dotfile=$dotfile."
858
\"R$r\"\[
859
        label=\"$lable\"
860
    pos = \"$x,$y!\"
861
    shape=record
862
        color=blue
863
        style=filled
864
        fillcolor=blue
865
];
866
";
867
                }
868
        }
869
 
870
 
871
 
872
        #connect all down input channels
873
        my $n=$nl;
874
        my $nPos = powi( $k, $n-1);
875
        my $chan_per_direction = ($k * powi( $k , $n-1 )); #up or down
876
        my $chan_per_level = 2*($k * powi( $k , $n-1 )); #up+down
877
 
878
        for (my $level = 0; $level<$n-1; $level++){
879
            #input channel are numbered interleavely, the interleaev depends on level
880
            my $routers_per_neighborhood = powi($k,$n-1-($level));
881
            my $routers_per_branch = powi($k,$n-1-($level+1));
882
            my $level_offset = $routers_per_neighborhood*$k;
883
            for ( my $pos = 0; $pos < $nPos; ++$pos ) {
884
                        my $neighborhood = int($pos/$routers_per_neighborhood);
885
                        my $neighborhood_pos = $pos % $routers_per_neighborhood;
886
                        for ( my $port = 0; $port < $k; ++$port ) {
887
                                my $link =
888
                                        (($level+1)*$chan_per_level - $chan_per_direction)  #which levellevel
889
                                        +$neighborhood*$level_offset   #region in level
890
                                        +$port*$routers_per_branch*$k  #sub region in region
891
                                        +($neighborhood_pos)%$routers_per_branch*$k  #router in subregion
892
                                        +($neighborhood_pos)/$routers_per_branch; #port on router
893
 
894
        #int link = (level*chan_per_level - chan_per_direction) + pos*k + port ;
895
                                my $connect_l= int(($link+$chan_per_direction)/$chan_per_level);
896
                                my $tmp=(($link+$chan_per_direction) % $chan_per_level);
897
                                my $connect_pos= int($tmp/$k);
898
                                my $connect_port= ($tmp%$k)+$k;
899
                                my $id1=$NL*$level+$pos;
900
                                my $connect_id=$NL*$connect_l+$connect_pos;
901
                                $dotfile=$dotfile.node_connection('R',$id1,undef,$port,'R',$connect_id,undef,$connect_port);
902
                        }
903
            }
904
        }
905
 
906
        #add endpoints connection
907
        for(my $i=0; $i<$NC; $i++){
908
                my $r= $NL*($nl-1)+int($i/$k);
909
                 $dotfile=$dotfile.node_connection('T',$i,undef,undef,'R',$r,undef,$i%($k));
910
 
911
        }
912
        $dotfile=$dotfile."\n}\n";
913
        return $dotfile;
914
}
915
 
916
 
917
 
918
 
919
sub generate_tree_dot_file{
920
        my $self=shift;
921
 
922
        my $dotfile=
923
"digraph G {
924
        graph [rankdir = LR , splines = true, overlap = true];
925
        node[shape=record];
926
        ";
927
 
928
 
929
        my $k=$self->object_get_attribute('noc_param','T1');
930
        my $nl=$self->object_get_attribute('noc_param','T2');
931
        #generate routres port interface
932
        my @bp;
933
        my @hp;
934
        for(my $p=0; $p<$k; $p++) {
935
                push (@bp,"<n$p>") if(($k%2)==0 && $p==$k/2);#if k is odd number add one empty space in the middle
936
                push (@bp,"<p$p>$p");
937
 
938
        }
939
        for(my $p=$k; $p<2*$k; $p++) {
940
                if($p==$k+int(($k-1)/2)){
941
                        push (@hp,"<n$p>") if(($k%2)==0);#if k is odd number add one empty space in the middle
942
                        push (@hp,"<p$k>$k");
943
                }else{
944
                        push (@hp,"<n$p>");
945
                }
946
        }
947
        my $bp= join("|",@bp);
948
        my $hp= join("|",@hp);
949
        my ($NE,$NR)=get_topology_info($self);
950
 
951
 
952
 
953
        #add endpoints
954
        for(my $i=0; $i<$NE; $i++){
955
                $dotfile=$dotfile."T$i\[
956
        label = \"T$i\"
957
    pos = \"$i,0!\"
958
    shape=house
959
    margin=0
960
        color=orange
961
        style=filled
962
        fillcolor=orange
963
];
964
";
965
        }
966
 
967
        #add roots
968
        my $lable = "\{R0\}|\{$bp\}";
969
        my $x=(($NE-1)/2);
970
        my $y=  1.5*($nl-1)+1;
971
        $dotfile=$dotfile."
972
\"R0\"\[
973
        label=\"$lable\"
974
    pos = \"$x,$y!\"
975
    shape=record
976
        color=blue
977
        style=filled
978
        fillcolor=blue
979
];
980
";
981
 
982
        #add leaves
983
        my $t=1;
984
 
985
        for(my $l=$nl-1; $l>0; $l--){
986
                my $NL = powi($k,$l);
987
                $t*=$k;
988
                for(my $pos=0; $pos<$NL; $pos++){
989
                        my $x=  $t*$pos + ($t-1)/2 ;
990
                        my $y=  1.5*($nl-$l)-.5;
991
                        my $r=sum_powi($k,$l)+$pos;
992
        my $lable = "\{$hp\}|\{R$r\}|\{$bp\}";
993
         $dotfile=$dotfile."
994
\"R$r\"\[
995
        label=\"$lable\"
996
    pos = \"$x,$y!\"
997
    shape=record
998
        color=blue
999
        style=filled
1000
        fillcolor=blue
1001
];
1002
";
1003
                }
1004
        }
1005
 
1006
        #add leave connections
1007
        for(my $l=$nl-1; $l>0; $l--){
1008
                my $NL = powi($k,$l);
1009
                for(my $pos=0; $pos<$NL; $pos++){
1010
                        my $id1=sum_powi($k,$l)+$pos;
1011
                        my $id2=sum_powi($k,$l-1)+int($pos/$k);
1012
                        $dotfile=$dotfile.node_connection('R',$id1,undef,$k,'R',$id2,undef,$pos % $k);
1013
                }
1014
        }
1015
 
1016
        #add endpoints connection
1017
        for(my $i=0; $i<$NE; $i++){
1018
                 my $r= sum_powi($k,$nl-1)+int($i/$k);
1019
                 $dotfile=$dotfile.node_connection('T',$i,undef,undef,'R',$r,undef,$i%($k));
1020
 
1021
        }
1022
 
1023
 
1024
 
1025
        $dotfile=$dotfile."\n}\n";
1026
        return $dotfile;
1027
}
1028
 
1029
 
1030
sub get_topology_dot_file{
1031
        my $self=shift;
1032
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
1033
        return generate_mesh_dot_file ($self) if($topology eq '"RING"' || $topology eq '"LINE"' || $topology eq '"MESH"' || $topology eq '"TORUS"' );
1034
        return generate_fattree_dot_file ($self) if($topology eq '"FATTREE"');
1035
        return generate_tree_dot_file($self);
1036
}
1037
 
1038
 
1039
 
1040
 
1041
 
1042
 
1043
 
1044
 
1045
 
1046
 
1047
 
1048
 
1049 34 alirezamon
return 1;

powered by: WebSVN 2.1.0

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