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 34

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

Line No. Rev Author Line
1 34 alirezamon
#!/usr/bin/perl -w
2
use strict;
3
use warnings;
4
use soc;
5
require "widget.pl";
6
require "emulator.pl";
7
use File::Copy;
8
 
9
#use GraphViz;
10
 
11
 
12
sub get_dot_file{
13
        my $soc= shift;
14
        my $soc_name=$soc->object_get_attribute('soc_name');
15
        my $remove_clk = $soc->object_get_attribute("diagrame","show_clk");
16
        my $remove_reset = $soc->object_get_attribute("diagrame","show_reset");
17
        my $remove_unused = $soc->object_get_attribute("diagrame","show_unused");
18
 
19
        my $dotfile=
20
"digraph G {
21
        graph [rankdir = LR , splines=polyline, overlap = false];
22
        node[shape=record];
23
";
24
 
25
        my @all_instances=$soc->soc_get_all_instances();
26
        #print "@all_instances\n";
27
        my $graph_connect= '';
28
        my $n=0;
29
        #my %socket_color;
30
        foreach my $instance_id (@all_instances){
31
                my $first=1;
32
                my $instance_name=$soc->soc_get_instance_name($instance_id);
33
                $dotfile="$dotfile \n\t$instance_id \[label=\"{  ";
34
 
35
                my @sockets= $soc->soc_get_all_sockets_of_an_instance($instance_id);
36
                @sockets = remove_scolar_from_array(\@sockets,'clk') if ($remove_clk);
37
                @sockets = remove_scolar_from_array(\@sockets,'reset') if ($remove_reset);
38
 
39
 
40
                foreach my $socket (@sockets){
41
 
42
                        my @nums=$soc->soc_list_socket_nums($instance_id,$socket);
43
                        foreach my $num (@nums){
44
                                my $name= $soc->soc_get_socket_name ($instance_id,$socket,$num);
45
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($instance_id,$socket);
46
                                my $v=$soc->soc_get_module_param_value($instance_id,$s_value);
47
                                $v=1 if ( length( $v || '' ) ==0);
48
                                #for(my $i=$v-1; $i>=0; $i--) {
49
                                for(my $i=0; $i<$v; $i++) {
50
                                        #$socket_color{socket_${socket}\_$i}=$n;
51
                                        #$n = ($n<30)? $n+1 : 0;
52
                                        my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($instance_id,$socket,$i);
53
                                        my %connected_plugs=%$ref1;
54
                                        my %connected_plug_nums=%$ref2;
55
                                        if(%connected_plugs || $remove_unused==0){
56
                                                $dotfile= ($first)? "$dotfile\{<socket_${socket}\_$i>$name\_$i" : "$dotfile |<socket_${socket}_${i}>$name\_${i}";
57
                                                $first=0;
58
                                        }
59
                                }
60
 
61
                        }
62
                }
63
 
64
 
65
 
66
 
67
                $dotfile=($first)? "$dotfile $instance_name"  : "$dotfile}|$instance_name";
68
                $first=1;
69
                my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
70
                @plugs = remove_scolar_from_array(\@plugs,'clk') if ($remove_clk);
71
                @plugs = remove_scolar_from_array(\@plugs,'reset') if ($remove_reset);
72
 
73
                my %plug_order;
74
                my @noconnect;
75
                foreach my $plug (@plugs){
76
 
77
                        my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
78
                        foreach my $num (@nums){
79
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
80
 
81
                                if(defined $connect_socket || $remove_unused==0){
82
                                        #$dotfile= ($first)?  "$dotfile |{<plug_${plug}_${num}>$name" :  "$dotfile|<plug_${plug}_${num}>$name";
83
                                        if(defined $connect_id && defined $connect_socket){
84
                                                my @sockets= $soc->soc_get_all_sockets_of_an_instance($connect_id);
85
                                                my $order_val=0;
86
                                                my $s1=get_pos($connect_id, @all_instances);
87
                                                my $s2=get_pos($connect_socket,  @sockets);
88
                                                $order_val=$s1*1000000+$s2*10000+$connect_socket_num;
89
                                                $plug_order{$order_val}=  "<plug_${plug}_${num}>$name";
90
                                        }else {push (@noconnect,"<plug_${plug}_${num}>$name");}
91
                                }
92
 
93
 
94
                                #my $connect_name=$soc->soc_get_instance_name($connect_id);
95
                                #my $color = get_color_hex_string($n);
96
                                #$n = ($n<30)? $n+1 : 0;
97
 
98
                                $graph_connect="$graph_connect $instance_id:plug_${plug}_${num} ->  $connect_id:socket_${connect_socket}_${connect_socket_num} [  dir=none]\n" if(defined $connect_socket);
99
 
100
                        }
101
                }
102
                foreach my $p (sort {$a<=>$b} keys %plug_order){
103
                                        my $k=$plug_order{$p};
104
                                        #print "$instance_name   : $k=\$plug_order{$p}\n";
105
                                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
106
                                        $first=0;
107
 
108
                                }
109
 
110
                foreach my $k (@noconnect){
111
                        $dotfile= ($first) ?   "$dotfile |{ ${k}": "$dotfile |${k}";
112
                        $first=0;
113
                }
114
 
115
                $dotfile=  "$dotfile} }\"];";
116
 
117
 
118
 
119
        }
120
        $dotfile="$dotfile\n\n$graph_connect";
121
        $dotfile="$dotfile\n\n}\n";
122
 
123
 
124
        return $dotfile;
125
 
126
 
127
}
128
 
129
 
130
 
131
 
132
 
133
sub show_tile_diagram {
134
        my $soc= shift;
135
 
136
        my $table=def_table(20,20,FALSE);
137
 
138
        my $window=def_popwin_size(80,80,"Processing Tile functional block diagram",'percent');
139
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
140
        $scrolled_win->set_policy( "automatic", "automatic" );
141
 
142
        $window->add ($table);
143
 
144
        my $plus = def_image_button('icons/plus.png',undef,TRUE);
145
        my $minues = def_image_button('icons/minus.png',undef,TRUE);
146
        my $unused = gen_check_box_object ($soc,"diagrame","show_unused",0,undef,undef);
147
        my $save = def_image_button('icons/save.png',undef,TRUE);
148
        my $clk = gen_check_box_object ($soc,"diagrame","show_clk",0,undef,undef);
149
        my $reset = gen_check_box_object ($soc,"diagrame","show_reset",0,undef,undef);
150
        #my $save = def_image_button('icons/save.png',undef,TRUE);
151
 
152
        my $scale=$soc->object_get_attribute("diagrame","scale");
153
        $scale= 1 if (!defined $scale);
154
 
155
 
156
 
157
 
158
        my $col=0;
159
        $table->attach ($plus ,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
160
        $table->attach ($minues,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
161
        $table->attach ($save,  $col, $col+1,0,1,'shrink','shrink',2,2); $col++;
162
        $table->attach (gen_label_in_left("     Remove unconnected Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
163
        $table->attach ($unused,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
164
        $table->attach (gen_label_in_left("     Remove Clk Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
165
        $table->attach ($clk,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
166
        $table->attach (gen_label_in_left("     Remove Reset Interfaces"),  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
167
        $table->attach ($reset,  $col,  $col+1,0,1,'shrink','shrink',2,2); $col++;
168
        while ($col<20){
169
 
170
                my $tmp=gen_label_in_left('');
171
                $table->attach_defaults ($tmp, $col,  $col+1,0,1);$col++;
172
        }
173
 
174
        $plus  -> signal_connect("clicked" => sub{
175
                $scale*=1.1 if ($scale <10);
176
                $soc->object_add_attribute("diagrame","scale", $scale );
177
                show_diagram ($soc,$scrolled_win,$table);
178
        });
179
        $minues  -> signal_connect("clicked" => sub{
180
                $scale*=.9  if ($scale >0.1); ;
181
                $soc->object_add_attribute("diagrame","scale", $scale );
182
                show_diagram ($soc,$scrolled_win,$table);
183
        });
184
        $save-> signal_connect("clicked" => sub{
185
                        save_diagram_as ($soc);
186
                });
187
        $unused-> signal_connect("toggled" => sub{
188
                if(gen_diagram($soc)){
189
                        show_diagram ($soc,$scrolled_win,$table);
190
                }
191
 
192
        });
193
        $clk-> signal_connect("toggled" => sub{
194
                if(gen_diagram($soc)){
195
                        show_diagram ($soc,$scrolled_win,$table);
196
        }
197
 
198
        });
199
        $reset-> signal_connect("toggled" => sub{
200
                if(gen_diagram($soc)){
201
                        show_diagram ($soc,$scrolled_win,$table);
202
                }
203
 
204
        });
205
 
206
 
207
 
208
 
209
        if(gen_diagram($soc)){
210
                show_diagram ($soc,$scrolled_win,$table);
211
        }
212
        $window->show_all();
213
 
214
 
215
 
216
 
217
 
218
}
219
 
220
 
221
 
222
sub gen_diagram {
223
        my ($soc)=@_;
224
 
225
 
226
 
227
        my $dotfile= get_dot_file($soc);
228
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
229
        mkpath("$tmp_dir/",1,01777);
230
        open(FILE,  ">$tmp_dir/diagram.txt") || die "Can not open: $!";
231
        print FILE $dotfile;
232
        close(FILE) || die "Error closing file: $!";
233
 
234
        my $cmd = "dot  $tmp_dir/diagram.txt | neato -n  -Tpng -o $tmp_dir/diagram.png";
235
 
236
 
237
        my ($stdout,$exit,$stderr)= run_cmd_in_back_ground_get_stdout ($cmd);
238
 
239
         if ( length( $stderr || '' ) !=0)  {
240
                message_dialog("$stderr\nHave you installed graphviz? If not run \n \t \"sudo apt-get install graphviz\" \n in terminal");
241
                return 0;
242
        }
243
        else {
244
                #my $diagram=show_gif("$tmp_dir/diagram.png");
245
 
246
 
247
                return  1;
248
 
249
        }
250
 
251
 
252
}
253
 
254
 
255
 
256
sub show_diagram {
257
        my ($soc,$scrolled_win,$table)=@_;
258
 
259
        $scrolled_win->destroy;
260
        $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
261
        $scrolled_win->set_policy( "automatic", "automatic" );
262
        $table->attach_defaults ($scrolled_win, 0, 20, 1, 20); #,'fill','shrink',2,2);           
263
        my $scale=$soc->object_get_attribute("diagrame","scale");
264
        $scale= 1 if (!defined $scale);
265
        my $tmp_dir  = "$ENV{'PRONOC_WORK'}/tmp";
266
        my $diagram=open_image("$tmp_dir/diagram.png",70*$scale,70*$scale,'percent');
267
                $scrolled_win->add_with_viewport($diagram);
268
                $scrolled_win->show_all();
269
 
270
 
271
 
272
 
273
}
274
 
275
 
276
sub save_diagram_as {
277
        my $soc= shift;
278
 
279
        my $file;
280
        my $title ='Save as';
281
 
282
 
283
 
284
        my @extensions=('png');
285
        my $open_in=undef;
286
        my $dialog = Gtk2::FileChooserDialog->new(
287
                'Save file', undef,
288
                'save',
289
                'gtk-cancel' => 'cancel',
290
                'gtk-ok'     => 'ok',
291
                );
292
        # if(defined $extension){
293
 
294
                foreach my $ext (@extensions){
295
                        my $filter = Gtk2::FileFilter->new();
296
                        $filter->set_name($ext);
297
                        $filter->add_pattern("*.$ext");
298
                        $dialog->add_filter ($filter);
299
                }
300
 
301
        # }
302
          if(defined  $open_in){
303
                $dialog->set_current_folder ($open_in);
304
                # print "$open_in\n";
305
 
306
        }
307
 
308
        if ( "ok" eq $dialog->run ) {
309
                        $file = $dialog->get_filename;
310
                        my $ext = $dialog->get_filter;
311
                        $ext=$ext->get_name;
312
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
313
                        $file = ($suffix eq ".$ext" )? $file : "$file.$ext";
314
 
315
                        $soc->object_add_attribute("graph_save","name",$file);
316
                        $soc->object_add_attribute("graph_save","extension",$ext);
317
                        my $tmp  = "$ENV{'PRONOC_WORK'}/tmp/diagram.png";
318
                        copy ($tmp,$file);
319
 
320
 
321
 
322
                         }
323
                        $dialog->destroy;
324
 
325
 
326
 
327
 
328
 
329
 
330
}
331
 
332
 
333
 
334
return 1;

powered by: WebSVN 2.1.0

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