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 38

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
use soc;
6
require "widget.pl";
7
require "emulator.pl";
8
use File::Copy;
9
 
10
#use GraphViz;
11
 
12
 
13
sub get_dot_file{
14 38 alirezamon
        my $self= shift;
15
        my $self_name=$self->object_get_attribute('soc_name');
16
        my $remove_clk = $self->object_get_attribute("tile_diagram","show_clk");
17
        my $remove_reset = $self->object_get_attribute("tile_diagram","show_reset");
18
        my $remove_unused = $self->object_get_attribute("tile_diagram","show_unused");
19 34 alirezamon
 
20
        my $dotfile=
21
"digraph G {
22
        graph [rankdir = LR , splines=polyline, overlap = false];
23
        node[shape=record];
24
";
25
 
26 38 alirezamon
        my @all_instances=$self->soc_get_all_instances();
27 34 alirezamon
        #print "@all_instances\n";
28
        my $graph_connect= '';
29
        my $n=0;
30
        #my %socket_color;
31
        foreach my $instance_id (@all_instances){
32
                my $first=1;
33 38 alirezamon
                my $instance_name=$self->soc_get_instance_name($instance_id);
34 34 alirezamon
                $dotfile="$dotfile \n\t$instance_id \[label=\"{  ";
35
 
36 38 alirezamon
                my @sockets= $self->soc_get_all_sockets_of_an_instance($instance_id);
37 34 alirezamon
                @sockets = remove_scolar_from_array(\@sockets,'clk') if ($remove_clk);
38
                @sockets = remove_scolar_from_array(\@sockets,'reset') if ($remove_reset);
39
 
40
 
41
                foreach my $socket (@sockets){
42
 
43 38 alirezamon
                        my @nums=$self->soc_list_socket_nums($instance_id,$socket);
44 34 alirezamon
                        foreach my $num (@nums){
45 38 alirezamon
                                my $name= $self->soc_get_socket_name ($instance_id,$socket,$num);
46
                                my  ($s_type,$s_value,$s_connection_num)=$self->soc_get_socket_of_instance($instance_id,$socket);
47
                                my $v=$self->soc_get_module_param_value($instance_id,$s_value);
48 34 alirezamon
                                $v=1 if ( length( $v || '' ) ==0);
49
                                #for(my $i=$v-1; $i>=0; $i--) {
50
                                for(my $i=0; $i<$v; $i++) {
51
                                        #$socket_color{socket_${socket}\_$i}=$n;
52
                                        #$n = ($n<30)? $n+1 : 0;
53 38 alirezamon
                                        my ($ref1,$ref2)= $self->soc_get_modules_plug_connected_to_socket($instance_id,$socket,$i);
54 34 alirezamon
                                        my %connected_plugs=%$ref1;
55
                                        my %connected_plug_nums=%$ref2;
56
                                        if(%connected_plugs || $remove_unused==0){
57
                                                $dotfile= ($first)? "$dotfile\{<socket_${socket}\_$i>$name\_$i" : "$dotfile |<socket_${socket}_${i}>$name\_${i}";
58
                                                $first=0;
59
                                        }
60
                                }
61
 
62
                        }
63
                }
64
 
65
 
66
 
67
 
68
                $dotfile=($first)? "$dotfile $instance_name"  : "$dotfile}|$instance_name";
69
                $first=1;
70 38 alirezamon
                my @plugs= $self->soc_get_all_plugs_of_an_instance($instance_id);
71 34 alirezamon
                @plugs = remove_scolar_from_array(\@plugs,'clk') if ($remove_clk);
72
                @plugs = remove_scolar_from_array(\@plugs,'reset') if ($remove_reset);
73
 
74
                my %plug_order;
75
                my @noconnect;
76
                foreach my $plug (@plugs){
77
 
78 38 alirezamon
                        my @nums=$self->soc_list_plug_nums($instance_id,$plug);
79 34 alirezamon
                        foreach my $num (@nums){
80 38 alirezamon
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$self->soc_get_plug($instance_id,$plug,$num);
81 34 alirezamon
 
82
                                if(defined $connect_socket || $remove_unused==0){
83
                                        #$dotfile= ($first)?  "$dotfile |{<plug_${plug}_${num}>$name" :  "$dotfile|<plug_${plug}_${num}>$name";
84
                                        if(defined $connect_id && defined $connect_socket){
85 38 alirezamon
                                                my @sockets= $self->soc_get_all_sockets_of_an_instance($connect_id);
86 34 alirezamon
                                                my $order_val=0;
87
                                                my $s1=get_pos($connect_id, @all_instances);
88
                                                my $s2=get_pos($connect_socket,  @sockets);
89
                                                $order_val=$s1*1000000+$s2*10000+$connect_socket_num;
90
                                                $plug_order{$order_val}=  "<plug_${plug}_${num}>$name";
91
                                        }else {push (@noconnect,"<plug_${plug}_${num}>$name");}
92
                                }
93
 
94
 
95 38 alirezamon
                                #my $connect_name=$self->soc_get_instance_name($connect_id);
96 34 alirezamon
                                #my $color = get_color_hex_string($n);
97
                                #$n = ($n<30)? $n+1 : 0;
98
 
99
                                $graph_connect="$graph_connect $instance_id:plug_${plug}_${num} ->  $connect_id:socket_${connect_socket}_${connect_socket_num} [  dir=none]\n" if(defined $connect_socket);
100
 
101
                        }
102
                }
103
                foreach my $p (sort {$a<=>$b} keys %plug_order){
104
                                        my $k=$plug_order{$p};
105
                                        #print "$instance_name   : $k=\$plug_order{$p}\n";
106
                                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
107
                                        $first=0;
108
 
109
                                }
110
 
111
                foreach my $k (@noconnect){
112
                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
113
                        $first=0;
114
                }
115
 
116
                $dotfile=  "$dotfile} }\"];";
117
 
118
 
119
 
120
        }
121
        $dotfile="$dotfile\n\n$graph_connect";
122
        $dotfile="$dotfile\n\n}\n";
123
 
124
 
125
        return $dotfile;
126
 
127
 
128
}
129
 
130
 
131
 
132
 
133
 
134
sub show_tile_diagram {
135 38 alirezamon
        my $self= shift;
136 34 alirezamon
 
137
        my $table=def_table(20,20,FALSE);
138
 
139
        my $window=def_popwin_size(80,80,"Processing Tile functional block diagram",'percent');
140
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
141
        $scrolled_win->set_policy( "automatic", "automatic" );
142
 
143
        $window->add ($table);
144
 
145
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
146
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
147 38 alirezamon
        my $unused = gen_check_box_object ($self,"tile_diagram","show_unused",0,undef,undef);
148 34 alirezamon
        my $save = def_image_button('icons/save.png',undef,TRUE);
149 38 alirezamon
        my $clk = gen_check_box_object ($self,"tile_diagram","show_clk",0,undef,undef);
150
        my $reset = gen_check_box_object ($self,"tile_diagram","show_reset",0,undef,undef);
151 34 alirezamon
        #my $save = def_image_button('icons/save.png',undef,TRUE);
152
 
153 38 alirezamon
        my $scale=$self->object_get_attribute("tile_diagram","scale");
154 34 alirezamon
        $scale= 1 if (!defined $scale);
155
 
156
 
157
 
158
 
159
        my $col=0;
160
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
161
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
162
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
163
        $table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
164
        $table->attach ($unused,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
165
        $table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
166
        $table->attach ($clk,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
167
        $table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
168
        $table->attach ($reset,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
169
        while ($col<20){
170
 
171
                my $tmp=gen_label_in_left('');
172
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
173
        }
174
 
175
        $plus  -> signal_connect("clicked" => sub{
176
                $scale*=1.1 if ($scale <10);
177 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
178
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
179 34 alirezamon
        });
180
        $minues  -> signal_connect("clicked" => sub{
181
                $scale*=.9  if ($scale >0.1); ;
182 38 alirezamon
                $self->object_add_attribute("tile_diagram","scale", $scale );
183
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
184 34 alirezamon
        });
185
        $save-> signal_connect("clicked" => sub{
186 38 alirezamon
                        save_diagram_as ($self);
187 34 alirezamon
                });
188
        $unused-> signal_connect("toggled" => sub{
189 38 alirezamon
                if(gen_diagram($self,'tile')){
190
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
191 34 alirezamon
                }
192
 
193
        });
194
        $clk-> signal_connect("toggled" => sub{
195 38 alirezamon
                if(gen_diagram($self,'tile')){
196
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
197 34 alirezamon
        }
198
 
199
        });
200
        $reset-> signal_connect("toggled" => sub{
201 38 alirezamon
                if(gen_diagram($self,'tile')){
202
                        show_diagram ($self,$scrolled_win,$table,"tile_diagram");
203 34 alirezamon
                }
204
 
205
        });
206
 
207 38 alirezamon
        if(gen_diagram($self,'tile')){
208
                show_diagram ($self,$scrolled_win,$table,"tile_diagram");
209 34 alirezamon
        }
210
        $window->show_all();
211
}
212
 
213
 
214
 
215
sub gen_diagram {
216 38 alirezamon
        my ($self,$type)=@_;
217 34 alirezamon
 
218
 
219 38 alirezamon
        my $dotfile;
220
        $dotfile=   get_dot_file($self) if ($type eq 'tile');
221
        $dotfile=   generate_trace_dot_file($self) if ($type eq 'trace');
222
        $dotfile=   generate_map_dot_file($self) if ($type eq 'map');
223
 
224 34 alirezamon
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
225
        mkpath("$tmp_dir/",1,01777);
226
        open(FILE,  ">$tmp_dir/diagram.txt") || die "Can not open: $!";
227
        print FILE $dotfile;
228
        close(FILE) || die "Error closing file: $!";
229
 
230 38 alirezamon
        my $cmd;
231
        $cmd=  "dot  $tmp_dir/diagram.txt | neato -n  -Tpng -o $tmp_dir/diagram.png" if ($type eq 'tile' || $type eq 'trace');
232
        $cmd = "dot  $tmp_dir/diagram.txt -Kfdp -n -Tpng -o $tmp_dir/diagram.png" if ( $type eq 'map');
233 34 alirezamon
 
234
 
235
        my ($stdout,$exit,$stderr)= run_cmd_in_back_ground_get_stdout ($cmd);
236
 
237
         if ( length( $stderr || '' ) !=0)  {
238
                message_dialog("$stderr\nHave you installed graphviz? If not run \n \t \"sudo apt-get install graphviz\" \n in terminal");
239
                return 0;
240
        }
241
        else {
242
                #my $diagram=show_gif("$tmp_dir/diagram.png");
243
 
244
 
245
                return  1;
246
 
247
        }
248
 
249
 
250
}
251
 
252
 
253
 
254
sub show_diagram {
255 38 alirezamon
        my ($self,$scrolled_win,$table, $name)=@_;
256 34 alirezamon
 
257
        $scrolled_win->destroy;
258
        $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
259
        $scrolled_win->set_policy( "automatic", "automatic" );
260
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);           
261 38 alirezamon
        my $scale=$self->object_get_attribute($name,"scale");
262 34 alirezamon
        $scale= 1 if (!defined $scale);
263
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
264
        my $diagram=open_image("$tmp_dir/diagram.png",70*$scale,70*$scale,'percent');
265
                $scrolled_win->add_with_viewport($diagram);
266
                $scrolled_win->show_all();
267
 
268
 
269
 
270
 
271
}
272
 
273
 
274
sub save_diagram_as {
275 38 alirezamon
        my $self= shift;
276 34 alirezamon
 
277
        my $file;
278
        my $title ='Save as';
279
 
280
 
281
 
282
        my @extensions=('png');
283
        my $open_in=undef;
284
        my $dialog = Gtk2::FileChooserDialog->new(
285
                'Save file', undef,
286
                'save',
287
                'gtk-cancel' => 'cancel',
288
                'gtk-ok'     => 'ok',
289
                );
290
        # if(defined $extension){
291
 
292
                foreach my $ext (@extensions){
293
                        my $filter = Gtk2::FileFilter->new();
294
                        $filter->set_name($ext);
295
                        $filter->add_pattern("*.$ext");
296
                        $dialog->add_filter ($filter);
297
                }
298
 
299
        # }
300
          if(defined  $open_in){
301
                $dialog->set_current_folder ($open_in);
302
                # print "$open_in\n";
303
 
304
        }
305
 
306
        if ( "ok" eq $dialog->run ) {
307
                        $file = $dialog->get_filename;
308
                        my $ext = $dialog->get_filter;
309
                        $ext=$ext->get_name;
310
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
311
                        $file = ($suffix eq ".$ext" )? $file : "$file.$ext";
312
 
313 38 alirezamon
                        $self->object_add_attribute("graph_save","name",$file);
314
                        $self->object_add_attribute("graph_save","extension",$ext);
315 34 alirezamon
                        my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
316
                        copy ($tmp,$file);
317
 
318
 
319
 
320
                         }
321
                        $dialog->destroy;
322 38 alirezamon
}
323 34 alirezamon
 
324
 
325
 
326 38 alirezamon
sub generate_trace_dot_file{
327
        my $self=shift;
328
        my $dotfile=
329
"digraph G {
330
        graph [rankdir = LR , splines=polyline, overlap = false];
331
 
332
";
333
 
334
#add nodes
335
        #my @tasks=get_all_tasks($self);
336
        #foreach my $p (@tasks){
337
        #       $dotfile=$dotfile."\"$p\" [label=\"{   $p} }\"];\n";            
338
        #}      
339
 
340
#add connections
341 34 alirezamon
 
342 38 alirezamon
        my @traces= $self->get_trace_list();
343
        foreach my $p (@traces) {
344
                my ($src,$dst, $Mbytes, $file_id, $file_name)=$self->get_trace($p);
345
                $dotfile=$dotfile."\"$src\" -> \"$dst\"  [label=\"$Mbytes\" ];\n";
346
        }
347
 
348
        $dotfile=$dotfile."\n}\n";
349
        return $dotfile;
350
 
351 34 alirezamon
}
352
 
353
 
354
 
355 38 alirezamon
sub generate_map_dot_file_old{
356
        my $self=shift;
357
        my $dotfile=
358
"digraph G {
359
        graph [rankdir = LR , splines=ortho, overlap = false];
360
        node[shape=record];
361
 
362
        NoC [label=\"";
363
 
364
 
365
#add nodes
366
        my $nx=$self->object_get_attribute('noc_param','NX');
367
        my $ny=$self->object_get_attribute('noc_param','NY');
368
        my $nc= $nx * $ny;
369
        my @tasks=get_all_tasks($self);
370
 
371
 
372
 
373
 
374
 
375
        for(my $y=0; $y<$ny; $y++){
376
                                for(my $x=0; $x<$nx; $x++){
377
                                        my $task=get_task_assigned_to_tile($self,$x,$y);
378
                                        my $id=$y*$nx+$x;
379
                                        $dotfile=       $dotfile."{" if ($x==0);
380
                                        $dotfile=   $dotfile." <$task>  IP${id}(${y},$x)\n$task" if (defined $task);
381
                                        $dotfile=   $dotfile."   IP${id}(${y},$x)" if (!defined $task);
382
                                        $dotfile=$dotfile."|"  if($nx != 1 && $x !=$nx-1 );
383
                                        $dotfile=       $dotfile."}" if ($x==$nx-1);
384
 
385
                                }
386
                                $dotfile=$dotfile."|"  if($ny != 1 && $y !=$ny-1 );
387
        }
388
        $dotfile=$dotfile."\"];\n\n";
389
 
390
 
391
 
392
 
393
 
394
 
395
 
396
 
397
        $dotfile=$dotfile."\n}\n";
398
        return $dotfile;
399
 
400
}
401
 
402
sub generate_map_dot_file{
403
        my $self=shift;
404
        my $dotfile=
405
"digraph G {
406
        graph [rankdir = LR ,splines=spline,  overlap = false];
407
        node[shape=record];
408
 
409
        ";
410
 
411
 
412
 
413
#add nodes
414
        my $nx=$self->object_get_attribute('noc_param','NX');
415
        my $ny=$self->object_get_attribute('noc_param','NY');
416
        my $nc= $nx * $ny;
417
        my @tasks=get_all_tasks($self);
418
 
419
        my @mappedtasks;
420
 
421
 
422
        for(my $y=0; $y<$ny; $y++){
423
 
424
 
425
                                for(my $x=0; $x<$nx; $x++){
426
                                        my $id=$y*$nx+$x;
427
                                        my $task=get_task_assigned_to_tile($self,$x,$y);
428
                                        push(@mappedtasks,$task) if (defined $task);
429
 
430
                                        $task= "_" if (!defined $task);
431
                                        my $n = ($ny==1)?   "tile(${x})" : "tile${id}(${x}_$y)" ;
432
                                        my $m = ($ny==1)?   "tile(${x})" : "tile(${x}_$y)" ;
433
                                        my $node = "\"$m\"";
434
                                        my $label =   "\"<S$task> $n|<R$task> $task\"" ;
435
                                        my $xx=$x*1.5;
436
                                        my $yy=($ny-$y-1)*1.5;
437
 
438
                                        $dotfile=$dotfile."
439
$node\[
440
        label = $label
441
    pos = \"$xx,$yy!\"
442
];";
443
 
444
 
445
 
446
                                }
447
 
448
        }
449
 
450
 
451
        $dotfile=$dotfile."\n\n";
452
 
453
        #add connections
454
        my @traces= $self->get_trace_list();
455
        foreach my $p (@traces){
456
                my ($src,$dst, $Mbytes, $file_id, $file_name)=$self->get_trace($p);
457
 
458
                my $src_tile= $self->object_get_attribute("MAP_TILE","$src");
459
                my $dst_tile= $self->object_get_attribute("MAP_TILE","$dst");
460
 
461
                next if ( $src_tile eq "-" ||  $dst_tile eq "-" ) ;
462
 
463
 
464
 
465
                $dotfile=$dotfile." \"$src_tile\" :  \"S$src\" ->  \"$dst_tile\" : \"R$dst\"  ;\n";
466
 
467
 
468
        }
469
 
470
 
471
 
472
 
473
        $dotfile=$dotfile."\n}\n";
474
        return $dotfile;
475
 
476
}
477
 
478
 
479
 
480
 
481
 
482
sub show_trace_diagram {
483
        my ($self,$type)=@_;
484
 
485
        my $table=def_table(20,20,FALSE);
486
 
487
        my $window=def_popwin_size(80,80,"Processing Tile functional block diagram",'percent');
488
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
489
        $scrolled_win->set_policy( "automatic", "automatic" );
490
 
491
        $window->add ($table);
492
 
493
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
494
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
495
        my $save = def_image_button('icons/save.png',undef,TRUE);
496
 
497
 
498
        my $scale=$self->object_get_attribute("${type}_diagram","scale");
499
        $scale= 1 if (!defined $scale);
500
 
501
 
502
 
503
 
504
        my $col=0;
505
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
506
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
507
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
508
 
509
        while ($col<20){
510
 
511
 
512
 
513
                my $tmp=gen_label_in_left('');
514
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
515
        }
516
 
517
        $plus  -> signal_connect("clicked" => sub{
518
                $scale*=1.1 if ($scale <10);
519
                $self->object_add_attribute("${type}_diagram","scale", $scale );
520
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
521
        });
522
        $minues  -> signal_connect("clicked" => sub{
523
                $scale*=.9  if ($scale >0.1); ;
524
                $self->object_add_attribute("${type}_diagram","scale", $scale );
525
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
526
        });
527
        $save-> signal_connect("clicked" => sub{
528
                        save_diagram_as ($self);
529
                });
530
 
531
 
532
 
533
 
534
        if(gen_diagram($self,$type)){
535
                show_diagram ($self,$scrolled_win,$table, "${type}_diagram");
536
        }
537
        $window->show_all();
538
 
539
 
540
 
541
 
542
}
543 34 alirezamon
return 1;

powered by: WebSVN 2.1.0

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