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/] [interface_gen.pl] - Blame information for rev 17

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

Line No. Rev Author Line
1 16 alirezamon
#! /usr/bin/perl -w
2
use Glib qw/TRUE FALSE/;
3
use strict;
4
use warnings;
5
use Data::Dumper;
6
use intfc_gen;
7
use rvp;
8
use Gtk2;
9
 
10
 
11
 
12
require "widget.pl";
13
 
14
 
15
sub read_file_modules{
16
        my ($file,$intfc_gen,$soc_state,$info)=@_;
17
 
18
        if (!defined $file) {return; }
19
        if (-e $file) {
20
                my $vdb =  read_file($file);
21
                my @modules=sort $vdb->get_modules($file);
22
                #foreach my $p(@module_list) {print "$p\n"}
23
                $intfc_gen->intfc_set_interface_file($file);
24
                $intfc_gen->intfc_set_module_name($modules[0]);
25
                $intfc_gen->intfc_add_module_list(@modules);
26
 
27
                set_state($soc_state,"file_selected",1);
28
                show_info(\$info,"Select the module which contain the interface ports\n ");
29
 
30
        }
31
        else {
32
                show_info(\$info,"File $file doese not exsit!\n ");
33
 
34
        }
35
}
36
 
37
 
38
################
39
#  check_input_intfc_file
40
################
41
 
42
sub check_input_intfc_file{
43
        my ($file,$intfc_gen,$soc_state,$info)=@_;
44
        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
45
        if($suffix eq '.ITC'){
46
                $intfc_gen->intfc_set_interface_file($file);
47
                set_state($soc_state,"load_file",0);
48
 
49
 
50
        }else{
51
                read_file_modules($file,$intfc_gen,$soc_state,$info);
52
 
53
        }
54
 
55
 
56
}
57
 
58
sub file_box {
59
        my ($intfc_gen,$soc_state,$info,$table,$row)=@_;
60
        my $label = gen_label_in_left("Select file:");
61
        my $entry = Gtk2::Entry->new;
62
        my $open= def_image_button("icons/select.png","Open");
63
        my $browse= def_image_button("icons/browse.png","Browse");
64
        my $file= $intfc_gen->intfc_get_interface_file();
65 17 alirezamon
        my $intfc_info= def_image_button("icons/info.png","Description");
66
        $intfc_info->signal_connect("clicked"=> sub{
67
                get_intfc_description($intfc_gen,$soc_state,$info);
68
 
69
 
70
        });
71
 
72 16 alirezamon
        if(defined $file){$entry->set_text($file);}
73
        show_info(\$info,"Please select the verilog file containig the interface\n");
74
        $browse->signal_connect("clicked"=> sub{
75
                my $entry_ref=$_[1];
76
                my $file;
77
        my $dialog = Gtk2::FileChooserDialog->new(
78
                'Select a File', undef,
79
                'open',
80
                'gtk-cancel' => 'cancel',
81
                'gtk-ok'     => 'ok',
82
                );
83
 
84
                        my $filter = Gtk2::FileFilter->new();
85
                        $filter->set_name("Verilog");
86
                        $filter->add_pattern("*.v");
87
                        my $filter2 = Gtk2::FileFilter->new();
88
                        $filter2->set_name("Interface");
89
                        $filter2->add_pattern("*.ITC");
90
                        $dialog->add_filter ($filter);
91
                        $dialog->add_filter ($filter2);
92
 
93
 
94
                if ( "ok" eq $dialog->run ) {
95
                        $file = $dialog->get_filename;
96
                                        $$entry_ref->set_text($file);
97
                                        check_input_intfc_file($file,$intfc_gen,$soc_state,$info);
98
                                        #read_file_modules($file,$intfc_gen,$soc_state,$info);
99
                        #print "file = $file\n";
100
                 }
101
                $dialog->destroy;
102
 
103
 
104
 
105
        } , \$entry);
106
 
107
        $open->signal_connect("clicked"=> sub{
108
                my $file_name=$entry->get_text();
109
                check_input_intfc_file($file,$intfc_gen,$soc_state,$info);
110
                #read_file_modules($file_name,$intfc_gen,$soc_state,$info);
111
 
112
                });
113
        $entry->signal_connect("activate"=>sub{
114
                my $file_name=$entry->get_text();
115
                read_file_modules($file_name,$intfc_gen,$soc_state,$info);
116
        });
117
 
118
        $entry->signal_connect("changed"=>sub{
119
                show_info(\$info,"Please select the verilog file containig the interface\n");
120
        });
121
 
122 17 alirezamon
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
123
        $table->attach_defaults ($entry, 1, 7 , $row, $row+1);
124
        $table->attach_defaults ($browse, 7, 8, $row, $row+1);
125
        $table->attach_defaults ($intfc_info, 8, 9 , $row, $row+1);
126
        #$table->attach_defaults ($open,  9, 10, $row, $row+1);
127 16 alirezamon
        #$table->attach_defaults ($entry, $col, $col+1, $row, $row+1);
128
        #return $table;
129
 
130
 
131
}
132
 
133
 
134
 
135
sub get_ports_type{
136
        my ($vdb,$top_module)=@_;
137
        my %ports;
138
 
139
        foreach my $sig (sort $vdb->get_modules_signals($top_module)) {
140
        my ($line,$a_line,$i_line,$type,$file,$posedge,$negedge,
141
         $type2,$s_file,$s_line,$range,$a_file,$i_file,$dims) =
142
           $vdb->get_module_signal($top_module,$sig);
143
 
144
                if($type eq "input" or $type eq "inout" or $type eq "output" ){
145
                        $ports{$sig}=$type;
146
 
147
                }
148
        }
149
        return %ports;
150
}
151
 
152
 
153
 
154
sub get_ports_rang{
155
        my ($vdb,$top_module)=@_;
156
        my %ports;
157
 
158
        foreach my $sig (sort $vdb->get_modules_signals($top_module)) {
159
        my ($line,$a_line,$i_line,$type,$file,$posedge,$negedge,
160
         $type2,$s_file,$s_line,$range,$a_file,$i_file,$dims) =
161
           $vdb->get_module_signal($top_module,$sig);
162
 
163
                if($type eq "input" or $type eq "inout" or $type eq "output" ){
164
 
165
 
166
 
167
                        $ports{$sig}=remove_all_white_spaces($range);
168
 
169
                }
170
        }
171
        return %ports;
172
}
173
 
174
 
175
 
176
sub get_interface_ports {
177
        my ($infc_gen,$soc_state,$info)=@_;
178
        my $window=def_popwin_size(800,600,"Import Ports");
179
 
180
        my $file=$infc_gen->intfc_get_interface_file();
181
        if (!defined $file){show_info(\$info,"File name has not been defined yet!");  return;}
182
        my $module=$infc_gen->intfc_get_module_name();
183
        if (!defined $module){  show_info(\$info,"Module name has not been selected yet!");  return;}
184
        my $vdb=read_file($file);
185
        my %port_type=get_ports_type($vdb,$module);
186
        my %port_range=get_ports_rang($vdb,$module);
187
 
188
        my $table=def_table(8,8,TRUE);
189
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
190
        $scrolled_win->set_policy( "automatic", "automatic" );
191
        $scrolled_win->add_with_viewport($table);
192
 
193
 
194
 
195
        my $title=gen_label_in_center("Select the ports included in the interface");
196
        my $title1=gen_label_in_center("Type");
197
        my $title2=gen_label_in_center("Range");
198
        my $title3=gen_label_in_center("Name");
199
        my $title4=gen_label_in_center("Select");
200
 
201
        my $row =0;
202
        $table->attach_defaults($title, 0,8, $row, $row+1);
203
        $row++;
204
        $table->attach_defaults($title1, 0,1, $row, $row+1);
205
        $table->attach_defaults($title2, 1,4, $row, $row+1);
206
        $table->attach_defaults($title3, 4,7, $row, $row+1);
207
        $table->attach_defaults($title4, 7,8, $row, $row+1);
208
 
209
        my $separator = Gtk2::HSeparator->new;
210
        $row++;
211
 
212
        $table->attach_defaults($separator, 0,8, $row, $row+1);
213
 
214
        $row++;
215
        $infc_gen->intfc_remove_ports();
216
        foreach my $p (sort keys %port_type){
217
                my $port_id= $p;
218
                my $porttype=$port_type{$p};
219
                my $label1= gen_label_in_center("$porttype");
220
                $table->attach_defaults($label1, 0,1, $row, $row+1);
221
                my $portrange=$port_range{$p};
222
                if (  $port_range{$p} ne ''){
223
 
224
                        my $label2= gen_label_in_center("\[$portrange\]");
225
                        $table->attach_defaults($label2, 1,4, $row, $row+1);
226
                }
227
 
228
                my $label3= gen_label_in_center($p);
229
                $table->attach_defaults($label3, 4,7, $row, $row+1);
230
 
231
                my $check= Gtk2::CheckButton->new;
232
                $table->attach_defaults($check, 7,8, $row, $row+1);
233
 
234
                $row++;
235
                if($row>8){$table->resize ($row, 8);}
236
                #print "$p\:$port_type{$p}\n";
237
 
238
                $check->signal_connect("toggled"=>sub{
239
                        my $widget=shift;
240
                        my $in=$widget->get_active();
241
                        if ($in eq 1){
242
                                my $connect_type=($porttype eq "input")? "output" : ($porttype eq "output")? "input" : $porttype;
243 17 alirezamon
                                $infc_gen->intfc_add_port($port_id,$porttype,$portrange,$p,$connect_type,$portrange,$p,"concatenate","Active low");
244 16 alirezamon
 
245
 
246
 
247
                                #print "chanhed to $in \n";
248
                        }else {
249
                                $infc_gen->intfc_remove_port($port_id);
250
 
251
                                #print "chanhed to 0 \n";
252
 
253
                        }
254
 
255
 
256
                });
257
 
258
        }
259
 
260
 
261
        my $ok= def_image_button("icons/select.png","ok");
262
        $table->attach_defaults($ok, 3,5, $row, $row+1);
263
 
264
        $ok->signal_connect("clicked"=>sub{
265
                $window->destroy;
266
                set_state($soc_state,"refresh",1);
267
 
268
 
269
                });
270
 
271
        $window->add($scrolled_win);
272
 
273
        $window->show_all();
274
}
275
 
276
 
277
 
278
 
279
 
280
 
281
sub module_select{
282
        my ($infc_gen,$soc_state,$info,$table,$row)=@_;
283
        my $file= $infc_gen->intfc_get_interface_file();
284
        my $label = gen_label_in_left("Select module:");
285
 
286
        my @modules= $infc_gen->intfc_get_module_list();
287
        my $saved_module=$infc_gen->intfc_get_module_name();
288
        my $pos=(defined $saved_module ) ? get_scolar_pos( $saved_module,@modules) : 0;
289
        my $combo = gen_combo(\@modules, $pos);
290
        my $port= def_image_button("icons/import.png","Import Ports");
291
        my $label2= gen_label_in_left(" Select Category:");
292
        my ($category,$category_entry)=gen_entry_help('Define the Interface category:e.g RAM, wishbone,...');
293
        my $saved_category=$infc_gen->intfc_get_category();
294
        if(defined $saved_category){$category_entry->set_text($saved_category);}
295
 
296
 
297 17 alirezamon
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
298
        $table->attach_defaults ($combo, 1, 3 , $row,$row+1);
299
        $table->attach_defaults ($port, 3, 4 , $row, $row+1);
300
        $table->attach_defaults ($label2, 4, 5 , $row, $row+1);
301
        $table->attach_defaults ($category, 5, 6 , $row, $row+1);
302 16 alirezamon
 
303 17 alirezamon
 
304
 
305 16 alirezamon
        $combo->signal_connect("changed"=> sub{
306
                my $module= $combo->get_active_text();
307
                $infc_gen->intfc_set_module_name($module);
308
 
309
 
310
        });
311
 
312
        $port->signal_connect("clicked"=> sub{
313
                get_interface_ports($infc_gen,$soc_state,$info);
314
 
315
 
316
        });
317
        $category_entry->signal_connect("changed"=> sub{
318
                my $name=$category_entry->get_text();
319
                $infc_gen->intfc_set_category($name);
320
 
321
        });
322
 
323
 
324
 
325
 
326 17 alirezamon
 
327 16 alirezamon
}
328
 
329
sub interface_type_select {
330
        my ($infc_gen,$soc_state,$info,$table,$row)=@_;
331
        my $saved_intfc_type= $infc_gen->intfc_get_interface_type();
332
        my $label = gen_label_in_left("Interface name:");
333
 
334 17 alirezamon
 
335 16 alirezamon
        my $saved_name=$infc_gen->intfc_get_interface_name();
336
        my $entry=gen_entry($saved_name);
337 17 alirezamon
 
338 16 alirezamon
        $entry->signal_connect("changed"=>sub{
339
                my $widget=shift;
340
                my $name=$widget->get_text();
341
                $infc_gen->intfc_set_interface_name($name);
342
                set_state($soc_state,"refresh",50);
343
 
344
        }
345
        );
346
 
347
        my $saved_connection_num= $infc_gen->intfc_get_connection_num();
348
        my $label2 = gen_label_in_left("Select soket type:");
349 17 alirezamon
 
350 16 alirezamon
        my @connection_nums=("single connection","multi connection");
351
        my $pos;
352
        if(defined $saved_connection_num){
353
                $pos= get_scolar_pos( $saved_connection_num,@connection_nums);
354
        }
355
        else {
356
                $pos= 0;
357
                $infc_gen->intfc_set_connection_num($connection_nums[0]);
358
        }
359
        my $combo=gen_combo(\@connection_nums,$pos);
360 17 alirezamon
 
361 16 alirezamon
        $combo->signal_connect("changed"=>sub{
362
                my $widget=shift;
363
                my $connection_num=$widget->get_active_text();
364
                $infc_gen->intfc_set_connection_num($connection_num);
365
                set_state($soc_state,"refresh",1);
366
 
367
        });
368 17 alirezamon
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
369
        $table->attach_defaults ($entry, 1, 2 , $row, $row+1);
370
        $table->attach_defaults ($label2, 2, 3 , $row, $row+1);
371
        $table->attach_defaults ($combo, 3, 4 , $row, $row+1);
372 16 alirezamon
 
373
 
374
 
375
}
376
 
377 17 alirezamon
sub port_width_repeat{
378
        my ($range,$value)=@_;
379
        $range=remove_all_white_spaces($range);
380
        my ($h,$l)=split(':',$range);
381
        return "$value" if(!defined $h ) ; # port width is 1
382
        return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
383
        $h=$l if($h eq "0" && "$l" ne "0");
384
        if($h =~ /-1$/){ # the address ranged is endup with -1 
385
                $h =~ s/-1$//; # remove -1
386
                return "\{$h\{$value\}\}"  if($h =~ /\)$/);
387
                return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
388
                return "\{$h\{$value\}\}";
389
        }
390
        return "\{($h+1){$value}}";
391
}
392 16 alirezamon
 
393
 
394
 
395
 
396
sub port_select{
397
        my ($infc_gen,$soc_state,$info,$table,$row)=@_;
398 17 alirezamon
        my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types,%default_outs);
399
        $infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types,\%default_outs);
400 16 alirezamon
 
401
        my $size = keys %types;
402
        if($size >0){
403
                my $sep = Gtk2::HSeparator->new;
404
                $table->attach_defaults ($sep, 0, 10 , $row, $row+1);    $row++;
405
 
406
 
407 17 alirezamon
                my $swap= def_image_button("icons/swap.png","swap");
408
 
409 16 alirezamon
                $swap->signal_connect('clicked'=>sub{
410
                        my $type=$infc_gen->intfc_get_interface_type();
411
                        if($type eq 'plug'){
412
                                        $infc_gen->intfc_set_interface_type('socket');
413
                        }
414
                        else {
415
                                        $infc_gen->intfc_set_interface_type('plug');
416
                        }
417
                        set_state($soc_state,"refresh",1);
418
 
419
                });
420
 
421
 
422
                my @intfcs=("plug","socket");
423
                my $inttype=$infc_gen->intfc_get_interface_type();
424
                if (!defined $inttype){
425
                        $inttype='plug';
426
                        $infc_gen->intfc_set_interface_type($inttype);
427
                }
428
 
429
                #my $lab1= gen_label_in_center($inttype);
430
                my ($lab1,$lab2);
431
                if ($inttype eq 'plug'){
432
                        $lab1=def_image_label('icons/plug.png'  ,'plug  ');
433
                        $lab2=def_image_label('icons/socket.png','socket');
434
                }else {
435
                        $lab2=def_image_label('icons/plug.png','plug');
436
                        $lab1=def_image_label('icons/socket.png','socket');
437
 
438
                }
439
 
440 17 alirezamon
                my $sep2 = Gtk2::HSeparator->new;
441 16 alirezamon
 
442
 
443 17 alirezamon
                $table->attach_defaults ($lab1, 1, 2 , $row, $row+1);
444
                $table->attach_defaults ($swap, 3, 4 , $row, $row+1);
445
                $table->attach_defaults ($lab2, 5, 6 , $row, $row+1);   $row++;
446
                $table->attach_defaults ($sep2, 0, 9 , $row, $row+1);    $row++;
447 16 alirezamon
 
448
 
449
                my $lab3= gen_label_in_center("Type");
450
                my $lab4= gen_label_in_center("Range");
451
                my $lab5= gen_label_in_center("Name");
452
                $table->attach_defaults ($lab3, 0, 1 , $row, $row+1);
453 17 alirezamon
                $table->attach_defaults ($lab4, 1, 2 , $row, $row+1);
454
                $table->attach_defaults ($lab5, 2, 3 , $row, $row+1);
455 16 alirezamon
                my $lab6= gen_label_in_center("Type");
456
                my $lab7= gen_label_in_center("Range");
457
                my $lab8= gen_label_in_center("Name");
458 17 alirezamon
                $table->attach_defaults ($lab6, 4, 5 , $row, $row+1);
459
                $table->attach_defaults ($lab7, 5, 6 , $row, $row+1);
460
                $table->attach_defaults ($lab8, 6, 7 , $row, $row+1);
461
                my $lab9= gen_label_help ("When an IP core does not have any of interface output port, the default value will be send to the IP core's input port which is supposed to be connected to that port","Output port Default ");
462
                $table->attach_defaults ($lab9, 8, 9 , $row, $row+1);
463 16 alirezamon
                $row++;
464
 
465
                foreach my $id (sort keys %ranges){
466
                        my $type=$types{$id};
467
                        my $range=$ranges{$id};
468
                        my $name=$names{$id};
469
                        my $connect_type=$connect_types{$id};
470
                        my $connect_range=$connect_ranges{$id};
471
                        my $connect_name=$connect_names{$id};
472
                        my $outport_type=$outport_types{$id};
473 17 alirezamon
                        my $default_out=$default_outs{$id};
474
                        if(! defined $default_out){
475
                                $default_out = "Active low"; # port_width_repeat($connect_range,"1\'b0");
476
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
477
                                print "\$default_out is set to: $default_out\n ";
478
                        }
479 16 alirezamon
 
480 17 alirezamon
                        #my $box=def_hbox(FALSE,0);
481
 
482 16 alirezamon
                        my @ports_type=("input","output","inout");
483
                        my $pos=get_scolar_pos($type,@ports_type);
484
                        my $combo1=gen_combo(\@ports_type,$pos);
485
                        my $entry2=gen_entry($range);
486
                        my $entry3=gen_entry($name);
487
                        my $separator = Gtk2::VSeparator->new;
488
                        my $connect_type_lable= gen_label_in_center($connect_type);
489
                        my $entry4=gen_entry($connect_range);
490
                        my $entry5=gen_entry($connect_name);
491
                        my @outport_types=("shared","concatenate");
492 17 alirezamon
                        my $pos2=get_scolar_pos($outport_type,@outport_types);
493 16 alirezamon
                        my $combo2=gen_combo(\@outport_types,$pos2);
494 17 alirezamon
 
495 16 alirezamon
 
496 17 alirezamon
                        #my @list=(port_width_repeat($range,"1\'b0"),port_width_repeat($range,"1\'b1"),port_width_repeat($range,"1\'bx"));
497
                        my @list=("Active low","Active high","Don't care");
498
 
499
                        my $combentry=gen_combo_entry(\@list);
500
                        $pos2=get_scolar_pos($default_out,@list);
501
                        if( defined $pos2){
502
                                $combentry->set_active($pos2);
503
                        } else {
504
                                ($combentry->child)->set_text($default_out);
505
                        }
506
 
507
 
508
                        #$box->pack_start($entry3,TRUE,FALSE,3);
509
                        #$box->pack_start($separator,TRUE,FALSE,3);
510 16 alirezamon
 
511
                        $table->attach_defaults ($combo1, 0, 1 , $row, $row+1);
512 17 alirezamon
                        $table->attach_defaults ($entry2, 1, 2 , $row, $row+1);
513
                        $table->attach_defaults ($entry3, 2, 3 , $row, $row+1);
514 16 alirezamon
 
515
 
516 17 alirezamon
                        $table->attach_defaults ($connect_type_lable, 4, 5 , $row, $row+1);
517
                        $table->attach_defaults ($entry4, 5, 6 , $row, $row+1);
518
                        $table->attach_defaults ($entry5, 6, 7 , $row, $row+1);
519
                        $table->attach_defaults ($combentry, 8, 9 , $row, $row+1);
520 16 alirezamon
 
521
                        $combo1->signal_connect("changed"=>sub{
522
                                my $new_type=$combo1->get_active_text();
523
                                my $new_connect_type=($new_type eq "input")? "output" : ($new_type eq "output")? "input" : $new_type;
524 17 alirezamon
                                $infc_gen->intfc_add_port($id,$new_type,$range,$name,$new_connect_type,$connect_range,$connect_name,$outport_type,$default_out);
525 16 alirezamon
                                set_state($soc_state,"refresh",1);
526
 
527
                        });
528
                        $entry2->signal_connect("changed"=>sub{
529
                                $range=$entry2->get_text();
530 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
531 16 alirezamon
                                set_state($soc_state,"refresh",50);
532
 
533
                        });
534
                        $entry3->signal_connect("changed"=>sub{
535
                                $name=$entry3->get_text();
536 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
537 16 alirezamon
                                set_state($soc_state,"refresh",50);
538
 
539
                        });
540
 
541
                        $entry4->signal_connect("changed"=>sub{
542
                                $connect_range=$entry4->get_text();
543 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
544 16 alirezamon
                                set_state($soc_state,"refresh",50);
545
 
546
                        });
547
                        $entry5->signal_connect("changed"=>sub{
548
                                $connect_name=$entry5->get_text();
549 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
550 16 alirezamon
                                set_state($soc_state,"refresh",50);
551
 
552
                        });
553
                        $combo2->signal_connect("changed"=>sub{
554
                                my $new_outport_type=$combo2->get_active_text();
555 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$new_outport_type,$default_out);
556 16 alirezamon
                                set_state($soc_state,"refresh",1);
557
 
558
                        });
559 17 alirezamon
                        ($combentry->child)->signal_connect('changed' => sub {
560
                                my ($entry) = @_;
561
                                $default_out=$entry->get_text();
562
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
563 16 alirezamon
 
564 17 alirezamon
 
565
                        });
566 16 alirezamon
 
567 17 alirezamon
 
568
 
569 16 alirezamon
                        $row++;
570
 
571
 
572
                }#foreach port  
573
 
574
 
575
        }
576
        return $row;
577
}
578
 
579
 
580
 
581
 
582
 
583
 
584
 
585
 
586
 
587
 
588
sub dev_box_gen{
589
        my($infc_gen,$soc_state,$info)=@_;
590
        my $table = def_table(20,10,FALSE);
591
 
592
        file_box($infc_gen,$soc_state,$info,$table,0);
593
        module_select($infc_gen,$soc_state,$info,$table,1);
594
        interface_type_select($infc_gen,$soc_state,$info,$table,2);
595
        my $row=port_select($infc_gen,$soc_state,$info,$table,3);
596
        for (my $i=$row; $i<20; $i++){
597
                my $temp=gen_label_in_center("");
598
                $table->attach_defaults ($temp, 0, 1 , $i, $i+1);
599
        }
600
 
601
        return  $table;
602
}
603
 
604
 
605
 
606
 
607
 
608
sub dev_box_show{
609
        my($infc_gen,$soc_state,$info,$refresh_ref)=@_;
610
        my $box= def_table (1, 1, TRUE);
611
        my $dev_table = dev_box_gen($infc_gen,$soc_state,$info);
612
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
613
        $scrolled_win->set_policy( "automatic", "automatic" );
614
        $scrolled_win->add_with_viewport($dev_table);
615
 
616
 
617
 
618
        $$refresh_ref-> signal_connect("clicked" => sub{
619
                $dev_table->destroy;
620
                $dev_table = dev_box_gen($infc_gen,$soc_state,$info);
621
                #$box->attach_defaults ($dev_table, 0, 1, 0, 1);#( $dev_table, FALSE, FALSE, 3);
622
                $scrolled_win->add_with_viewport($dev_table);
623
                $dev_table->show;
624
                $scrolled_win->show_all;
625
 
626
 
627 17 alirezamon
 
628 16 alirezamon
        });
629
        #$box->attach_defaults ($dev_table, 0, 1, 0, 1);#$box->pack_start( $dev_table, FALSE, FALSE, 3);
630
        #$box->show_all;
631
        return $scrolled_win;
632
 
633
}
634
 
635
 
636
 
637
 
638
sub check_intfc{
639
        my $intfc_gen=shift;
640
        my $result;
641
        my $message;
642
 
643
 
644
        $result=$intfc_gen->intfc_ckeck_ports_available();
645
        if(!defined $result){$message="No port connection has been selected for this interface!";}
646
        $result=$intfc_gen->intfc_get_interface_name();
647
        if(!defined $result){$message="The interface name is empty!";}
648
        $result=$intfc_gen->intfc_get_interface_file();
649
        if(!defined $result){$message="The verilog file containig the interface has not been selected!";}
650
 
651
        if(!defined $message){return 1;}
652
        else {message_dialog($message); return 0;}
653
 
654
 
655
}
656
 
657
 
658
 
659
sub generate_lib{
660
        my $intfc_gen=shift;
661
        my $name=$intfc_gen->intfc_get_interface_name();
662
        my $category=$intfc_gen->intfc_get_category();
663
        # Write
664
        if(defined ($category)){
665
                open(FILE,  ">lib/interface/$name.ITC") || die "Can not open: $!";
666
                print FILE Data::Dumper->Dump([\%$intfc_gen],["HashRef"]);
667
                close(FILE) || die "Error closing file: $!";
668
                #store \%$intfc_gen, "lib/$name.ITC";
669
                my $message="Interface $name has been generated successfully" ;
670
                message_dialog($message);
671 17 alirezamon
                exec($^X, $0, @ARGV);# reset ProNoC to apply changes
672 16 alirezamon
                #$hashref = retrieve('file');
673
        }else{
674
                my $message="Category must be defined!";
675
                message_dialog($message);
676
 
677
        }
678
 
679
 
680
return 1;
681
}
682
 
683
 
684
 
685
###########
686
#       get description
687
#########
688
 
689
sub get_intfc_description{
690
        my ($intfc_gen,$soc_state,$info)=@_;
691
        my $description = $intfc_gen->intfc_get_description();
692
        my $table = Gtk2::Table->new (15, 15, TRUE);
693
        my $window=def_popwin_size(500,500,"Add description");
694
        my ($scrwin,$text_view)=create_text();
695
        #my $buffer = $textbox->get_buffer();
696
        my $ok=def_image_button("icons/select.png",' Ok ');
697
 
698
        $table->attach_defaults($scrwin,0,15,0,14);
699
        $table->attach_defaults($ok,6,9,14,15);
700
        my $text_buffer = $text_view->get_buffer;
701
        if(defined $description) {$text_buffer->set_text($description)};
702
 
703
        $ok->signal_connect("clicked"=> sub {
704
                $window->destroy;
705
 
706
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
707
                 $intfc_gen->intfc_set_description($text);
708
                #print "$text\n";
709
 
710
        });
711
 
712
        $window->add($table);
713
        $window->show_all();
714
 
715
}
716
 
717
 
718
 
719 17 alirezamon
sub load_interface{
720
        my ($intfc_gen,$soc_state)=@_;
721
        my $file;
722
        my $dialog = Gtk2::FileChooserDialog->new(
723
                'Select a File', undef,
724
                'open',
725
                'gtk-cancel' => 'cancel',
726
                'gtk-ok'     => 'ok',
727
                );
728 16 alirezamon
 
729 17 alirezamon
        my $filter = Gtk2::FileFilter->new();
730
        $filter->set_name("ITC");
731
        $filter->add_pattern("*.ITC");
732
        $dialog->add_filter ($filter);
733
        my $dir = Cwd::getcwd();
734
        $dialog->set_current_folder ("$dir/lib/interface")      ;
735 16 alirezamon
 
736
 
737 17 alirezamon
        if ( "ok" eq $dialog->run ) {
738
                $file = $dialog->get_filename;
739
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
740
                if($suffix eq '.ITC'){
741
                        $intfc_gen->intfc_set_interface_file($file);
742
                        set_state($soc_state,"load_file",0);
743
                }
744
     }
745
     $dialog->destroy;
746
 
747
 
748
 
749
}
750
 
751
 
752
 
753 16 alirezamon
############
754
#    main
755
############
756
sub intfc_main{
757
 
758
        my $intfc_gen= intfc_gen->interface_generator();
759
 
760
        my $soc_state=  def_state("ideal");
761
        # main window
762
        #my $window = def_win_size(1000,800,"Top");
763
        #  The main table containg the lib tree, selected modules and info section 
764 17 alirezamon
        my $main_table = Gtk2::Table->new (15, 12, FALSE);
765 16 alirezamon
 
766
        # The box which holds the info, warning, error ...  mesages
767
        my ($infobox,$info)= create_text();
768
 
769
 
770
        my $refresh = Gtk2::Button->new_from_stock('ref');
771
        my $generate = def_image_button('icons/gen.png','Generate');
772
        my $genbox=def_hbox(TRUE,5);
773
        $genbox->pack_start($generate,   FALSE, FALSE,3);
774
 
775
        # A tree view for holding a library
776
        #my $tree_box = create_tree ($info,$lib,$soc,$soc_state);
777
 
778
 
779
 
780
        $main_table->set_row_spacings (4);
781
        $main_table->set_col_spacings (1);
782
 
783
        my $devbox=dev_box_show($intfc_gen,$soc_state,$info,\$refresh);
784
 
785
        $main_table->attach_defaults ($devbox , 0, 12, 0,12);
786
        $main_table->attach_defaults ($infobox  , 0, 12, 12,14);
787
        $main_table->attach_defaults ($genbox   , 6, 8, 14,15);
788
 
789 17 alirezamon
 
790
        my $open = def_image_button('icons/browse.png','Load Interface');
791
        my $openbox=def_hbox(TRUE,0);
792
        $openbox->pack_start($open,   FALSE, FALSE,0);
793
        $main_table->attach_defaults ($openbox,0, 2, 14,15);
794
 
795 16 alirezamon
        #check soc status every 0.5 second. referesh gui if there is any changes 
796
Glib::Timeout->add (100, sub{
797
 
798
                my ($state,$timeout)= get_state($soc_state);
799
                if ($timeout>0){
800
                        $timeout--;
801
                        set_state($soc_state,$state,$timeout);
802
                }
803
                elsif($state eq "load_file"){
804
                        my $file=$intfc_gen->intfc_get_interface_file();
805
                        my $pp= eval { do $file };
806
                        clone_obj($intfc_gen,$pp);
807
 
808
 
809
                        set_state($soc_state,"ref",1);
810
 
811
 
812
                }
813
                elsif( $state ne "ideal" ){
814
                        $refresh->clicked;
815
                        set_state($soc_state,"ideal",0);
816
 
817
                }
818
                return TRUE;
819
 
820
                } );
821 17 alirezamon
 
822
        $open-> signal_connect("clicked" => sub{
823
                load_interface($intfc_gen,$soc_state);
824
 
825
        });
826 16 alirezamon
 
827
        $generate-> signal_connect("clicked" => sub{
828 17 alirezamon
                if( check_intfc($intfc_gen)) {
829
                        generate_lib($intfc_gen);
830
 
831
                }
832 16 alirezamon
 
833
                $refresh->clicked;
834
 
835
});
836
 
837
        #show_selected_dev($info,\@active_dev,\$dev_list_refresh,\$dev_table);
838
 
839
 
840
 
841
#$box->show;
842
        #$window->add ($main_table);
843
        #$window->show_all;
844
        #return $main_table;
845
 
846
        my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
847
                $sc_win->set_policy( "automatic", "automatic" );
848
                $sc_win->add_with_viewport($main_table);
849
 
850
        return $sc_win;
851
 
852
 
853
}
854
 
855
 
856
 
857
 
858
 
859
1
860
 

powered by: WebSVN 2.1.0

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