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 22

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
 
378
 
379
 
380
 
381 18 alirezamon
 
382 16 alirezamon
sub port_select{
383
        my ($infc_gen,$soc_state,$info,$table,$row)=@_;
384 17 alirezamon
        my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types,%default_outs);
385
        $infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types,\%default_outs);
386 16 alirezamon
 
387
        my $size = keys %types;
388
        if($size >0){
389
                my $sep = Gtk2::HSeparator->new;
390
                $table->attach_defaults ($sep, 0, 10 , $row, $row+1);    $row++;
391
 
392
 
393 17 alirezamon
                my $swap= def_image_button("icons/swap.png","swap");
394
 
395 16 alirezamon
                $swap->signal_connect('clicked'=>sub{
396
                        my $type=$infc_gen->intfc_get_interface_type();
397
                        if($type eq 'plug'){
398
                                        $infc_gen->intfc_set_interface_type('socket');
399
                        }
400
                        else {
401
                                        $infc_gen->intfc_set_interface_type('plug');
402
                        }
403
                        set_state($soc_state,"refresh",1);
404
 
405
                });
406
 
407
 
408
                my @intfcs=("plug","socket");
409
                my $inttype=$infc_gen->intfc_get_interface_type();
410
                if (!defined $inttype){
411
                        $inttype='plug';
412
                        $infc_gen->intfc_set_interface_type($inttype);
413
                }
414
 
415
                #my $lab1= gen_label_in_center($inttype);
416
                my ($lab1,$lab2);
417
                if ($inttype eq 'plug'){
418
                        $lab1=def_image_label('icons/plug.png'  ,'plug  ');
419
                        $lab2=def_image_label('icons/socket.png','socket');
420
                }else {
421
                        $lab2=def_image_label('icons/plug.png','plug');
422
                        $lab1=def_image_label('icons/socket.png','socket');
423
 
424
                }
425
 
426 17 alirezamon
                my $sep2 = Gtk2::HSeparator->new;
427 16 alirezamon
 
428
 
429 17 alirezamon
                $table->attach_defaults ($lab1, 1, 2 , $row, $row+1);
430
                $table->attach_defaults ($swap, 3, 4 , $row, $row+1);
431
                $table->attach_defaults ($lab2, 5, 6 , $row, $row+1);   $row++;
432
                $table->attach_defaults ($sep2, 0, 9 , $row, $row+1);    $row++;
433 16 alirezamon
 
434
 
435
                my $lab3= gen_label_in_center("Type");
436
                my $lab4= gen_label_in_center("Range");
437
                my $lab5= gen_label_in_center("Name");
438
                $table->attach_defaults ($lab3, 0, 1 , $row, $row+1);
439 17 alirezamon
                $table->attach_defaults ($lab4, 1, 2 , $row, $row+1);
440
                $table->attach_defaults ($lab5, 2, 3 , $row, $row+1);
441 16 alirezamon
                my $lab6= gen_label_in_center("Type");
442
                my $lab7= gen_label_in_center("Range");
443
                my $lab8= gen_label_in_center("Name");
444 17 alirezamon
                $table->attach_defaults ($lab6, 4, 5 , $row, $row+1);
445
                $table->attach_defaults ($lab7, 5, 6 , $row, $row+1);
446
                $table->attach_defaults ($lab8, 6, 7 , $row, $row+1);
447
                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 ");
448
                $table->attach_defaults ($lab9, 8, 9 , $row, $row+1);
449 16 alirezamon
                $row++;
450
 
451
                foreach my $id (sort keys %ranges){
452
                        my $type=$types{$id};
453
                        my $range=$ranges{$id};
454
                        my $name=$names{$id};
455
                        my $connect_type=$connect_types{$id};
456
                        my $connect_range=$connect_ranges{$id};
457
                        my $connect_name=$connect_names{$id};
458
                        my $outport_type=$outport_types{$id};
459 17 alirezamon
                        my $default_out=$default_outs{$id};
460
                        if(! defined $default_out){
461
                                $default_out = "Active low"; # port_width_repeat($connect_range,"1\'b0");
462
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
463
                                print "\$default_out is set to: $default_out\n ";
464
                        }
465 16 alirezamon
 
466 17 alirezamon
                        #my $box=def_hbox(FALSE,0);
467
 
468 16 alirezamon
                        my @ports_type=("input","output","inout");
469
                        my $pos=get_scolar_pos($type,@ports_type);
470
                        my $combo1=gen_combo(\@ports_type,$pos);
471
                        my $entry2=gen_entry($range);
472
                        my $entry3=gen_entry($name);
473
                        my $separator = Gtk2::VSeparator->new;
474
                        my $connect_type_lable= gen_label_in_center($connect_type);
475
                        my $entry4=gen_entry($connect_range);
476
                        my $entry5=gen_entry($connect_name);
477
                        my @outport_types=("shared","concatenate");
478 17 alirezamon
                        my $pos2=get_scolar_pos($outport_type,@outport_types);
479 16 alirezamon
                        my $combo2=gen_combo(\@outport_types,$pos2);
480 17 alirezamon
 
481 16 alirezamon
 
482 17 alirezamon
                        #my @list=(port_width_repeat($range,"1\'b0"),port_width_repeat($range,"1\'b1"),port_width_repeat($range,"1\'bx"));
483
                        my @list=("Active low","Active high","Don't care");
484
 
485
                        my $combentry=gen_combo_entry(\@list);
486
                        $pos2=get_scolar_pos($default_out,@list);
487
                        if( defined $pos2){
488
                                $combentry->set_active($pos2);
489
                        } else {
490
                                ($combentry->child)->set_text($default_out);
491
                        }
492
 
493
 
494
                        #$box->pack_start($entry3,TRUE,FALSE,3);
495
                        #$box->pack_start($separator,TRUE,FALSE,3);
496 16 alirezamon
 
497
                        $table->attach_defaults ($combo1, 0, 1 , $row, $row+1);
498 17 alirezamon
                        $table->attach_defaults ($entry2, 1, 2 , $row, $row+1);
499
                        $table->attach_defaults ($entry3, 2, 3 , $row, $row+1);
500 16 alirezamon
 
501
 
502 17 alirezamon
                        $table->attach_defaults ($connect_type_lable, 4, 5 , $row, $row+1);
503
                        $table->attach_defaults ($entry4, 5, 6 , $row, $row+1);
504
                        $table->attach_defaults ($entry5, 6, 7 , $row, $row+1);
505
                        $table->attach_defaults ($combentry, 8, 9 , $row, $row+1);
506 16 alirezamon
 
507
                        $combo1->signal_connect("changed"=>sub{
508
                                my $new_type=$combo1->get_active_text();
509
                                my $new_connect_type=($new_type eq "input")? "output" : ($new_type eq "output")? "input" : $new_type;
510 17 alirezamon
                                $infc_gen->intfc_add_port($id,$new_type,$range,$name,$new_connect_type,$connect_range,$connect_name,$outport_type,$default_out);
511 16 alirezamon
                                set_state($soc_state,"refresh",1);
512
 
513
                        });
514
                        $entry2->signal_connect("changed"=>sub{
515
                                $range=$entry2->get_text();
516 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
517 16 alirezamon
                                set_state($soc_state,"refresh",50);
518
 
519
                        });
520
                        $entry3->signal_connect("changed"=>sub{
521
                                $name=$entry3->get_text();
522 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
523 16 alirezamon
                                set_state($soc_state,"refresh",50);
524
 
525
                        });
526
 
527
                        $entry4->signal_connect("changed"=>sub{
528
                                $connect_range=$entry4->get_text();
529 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
530 16 alirezamon
                                set_state($soc_state,"refresh",50);
531
 
532
                        });
533
                        $entry5->signal_connect("changed"=>sub{
534
                                $connect_name=$entry5->get_text();
535 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
536 16 alirezamon
                                set_state($soc_state,"refresh",50);
537
 
538
                        });
539
                        $combo2->signal_connect("changed"=>sub{
540
                                my $new_outport_type=$combo2->get_active_text();
541 17 alirezamon
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$new_outport_type,$default_out);
542 16 alirezamon
                                set_state($soc_state,"refresh",1);
543
 
544
                        });
545 17 alirezamon
                        ($combentry->child)->signal_connect('changed' => sub {
546
                                my ($entry) = @_;
547
                                $default_out=$entry->get_text();
548
                                $infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
549 16 alirezamon
 
550 17 alirezamon
 
551
                        });
552 16 alirezamon
 
553 17 alirezamon
 
554
 
555 16 alirezamon
                        $row++;
556
 
557
 
558
                }#foreach port  
559
 
560
 
561
        }
562
        return $row;
563
}
564
 
565
 
566
 
567
 
568
 
569
 
570
 
571
 
572
 
573
 
574
sub dev_box_gen{
575
        my($infc_gen,$soc_state,$info)=@_;
576
        my $table = def_table(20,10,FALSE);
577
 
578
        file_box($infc_gen,$soc_state,$info,$table,0);
579
        module_select($infc_gen,$soc_state,$info,$table,1);
580
        interface_type_select($infc_gen,$soc_state,$info,$table,2);
581
        my $row=port_select($infc_gen,$soc_state,$info,$table,3);
582
        for (my $i=$row; $i<20; $i++){
583
                my $temp=gen_label_in_center("");
584
                $table->attach_defaults ($temp, 0, 1 , $i, $i+1);
585
        }
586
 
587
        return  $table;
588
}
589
 
590
 
591
 
592
 
593
 
594
sub dev_box_show{
595
        my($infc_gen,$soc_state,$info,$refresh_ref)=@_;
596
        my $box= def_table (1, 1, TRUE);
597
        my $dev_table = dev_box_gen($infc_gen,$soc_state,$info);
598
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
599
        $scrolled_win->set_policy( "automatic", "automatic" );
600
        $scrolled_win->add_with_viewport($dev_table);
601
 
602
 
603
 
604
        $$refresh_ref-> signal_connect("clicked" => sub{
605
                $dev_table->destroy;
606 22 alirezamon
                select(undef, undef, undef, 0.1); #wait 10 ms
607 16 alirezamon
                $dev_table = dev_box_gen($infc_gen,$soc_state,$info);
608
                #$box->attach_defaults ($dev_table, 0, 1, 0, 1);#( $dev_table, FALSE, FALSE, 3);
609
                $scrolled_win->add_with_viewport($dev_table);
610
                $dev_table->show;
611
                $scrolled_win->show_all;
612
 
613
 
614 17 alirezamon
 
615 16 alirezamon
        });
616
        #$box->attach_defaults ($dev_table, 0, 1, 0, 1);#$box->pack_start( $dev_table, FALSE, FALSE, 3);
617
        #$box->show_all;
618
        return $scrolled_win;
619
 
620
}
621
 
622
 
623
 
624
 
625
sub check_intfc{
626
        my $intfc_gen=shift;
627
        my $result;
628
        my $message;
629
 
630
 
631
        $result=$intfc_gen->intfc_ckeck_ports_available();
632
        if(!defined $result){$message="No port connection has been selected for this interface!";}
633
        $result=$intfc_gen->intfc_get_interface_name();
634
        if(!defined $result){$message="The interface name is empty!";}
635
        $result=$intfc_gen->intfc_get_interface_file();
636
        if(!defined $result){$message="The verilog file containig the interface has not been selected!";}
637
 
638
        if(!defined $message){return 1;}
639
        else {message_dialog($message); return 0;}
640
 
641
 
642
}
643
 
644
 
645
 
646
sub generate_lib{
647
        my $intfc_gen=shift;
648
        my $name=$intfc_gen->intfc_get_interface_name();
649
        my $category=$intfc_gen->intfc_get_category();
650
        # Write
651
        if(defined ($category)){
652
                open(FILE,  ">lib/interface/$name.ITC") || die "Can not open: $!";
653
                print FILE Data::Dumper->Dump([\%$intfc_gen],["HashRef"]);
654
                close(FILE) || die "Error closing file: $!";
655
                #store \%$intfc_gen, "lib/$name.ITC";
656
                my $message="Interface $name has been generated successfully" ;
657
                message_dialog($message);
658 17 alirezamon
                exec($^X, $0, @ARGV);# reset ProNoC to apply changes
659 16 alirezamon
                #$hashref = retrieve('file');
660
        }else{
661
                my $message="Category must be defined!";
662
                message_dialog($message);
663
 
664
        }
665
 
666
 
667
return 1;
668
}
669
 
670
 
671
 
672
###########
673
#       get description
674
#########
675
 
676
sub get_intfc_description{
677
        my ($intfc_gen,$soc_state,$info)=@_;
678
        my $description = $intfc_gen->intfc_get_description();
679
        my $table = Gtk2::Table->new (15, 15, TRUE);
680
        my $window=def_popwin_size(500,500,"Add description");
681
        my ($scrwin,$text_view)=create_text();
682
        #my $buffer = $textbox->get_buffer();
683
        my $ok=def_image_button("icons/select.png",' Ok ');
684
 
685
        $table->attach_defaults($scrwin,0,15,0,14);
686
        $table->attach_defaults($ok,6,9,14,15);
687
        my $text_buffer = $text_view->get_buffer;
688
        if(defined $description) {$text_buffer->set_text($description)};
689
 
690
        $ok->signal_connect("clicked"=> sub {
691
                $window->destroy;
692
 
693
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
694
                 $intfc_gen->intfc_set_description($text);
695
                #print "$text\n";
696
 
697
        });
698
 
699
        $window->add($table);
700
        $window->show_all();
701
 
702
}
703
 
704
 
705
 
706 17 alirezamon
sub load_interface{
707
        my ($intfc_gen,$soc_state)=@_;
708
        my $file;
709
        my $dialog = Gtk2::FileChooserDialog->new(
710
                'Select a File', undef,
711
                'open',
712
                'gtk-cancel' => 'cancel',
713
                'gtk-ok'     => 'ok',
714
                );
715 16 alirezamon
 
716 17 alirezamon
        my $filter = Gtk2::FileFilter->new();
717
        $filter->set_name("ITC");
718
        $filter->add_pattern("*.ITC");
719
        $dialog->add_filter ($filter);
720
        my $dir = Cwd::getcwd();
721
        $dialog->set_current_folder ("$dir/lib/interface")      ;
722 16 alirezamon
 
723
 
724 17 alirezamon
        if ( "ok" eq $dialog->run ) {
725
                $file = $dialog->get_filename;
726
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
727
                if($suffix eq '.ITC'){
728
                        $intfc_gen->intfc_set_interface_file($file);
729
                        set_state($soc_state,"load_file",0);
730
                }
731
     }
732
     $dialog->destroy;
733
 
734
 
735
 
736
}
737
 
738
 
739
 
740 16 alirezamon
############
741
#    main
742
############
743
sub intfc_main{
744
 
745
        my $intfc_gen= intfc_gen->interface_generator();
746
 
747
        my $soc_state=  def_state("ideal");
748
        # main window
749
        #my $window = def_win_size(1000,800,"Top");
750
        #  The main table containg the lib tree, selected modules and info section 
751 17 alirezamon
        my $main_table = Gtk2::Table->new (15, 12, FALSE);
752 16 alirezamon
 
753
        # The box which holds the info, warning, error ...  mesages
754
        my ($infobox,$info)= create_text();
755
 
756
 
757
        my $refresh = Gtk2::Button->new_from_stock('ref');
758
        my $generate = def_image_button('icons/gen.png','Generate');
759
        my $genbox=def_hbox(TRUE,5);
760
        $genbox->pack_start($generate,   FALSE, FALSE,3);
761
 
762
        # A tree view for holding a library
763
        #my $tree_box = create_tree ($info,$lib,$soc,$soc_state);
764
 
765
 
766
 
767
        $main_table->set_row_spacings (4);
768
        $main_table->set_col_spacings (1);
769
 
770
        my $devbox=dev_box_show($intfc_gen,$soc_state,$info,\$refresh);
771
 
772
        $main_table->attach_defaults ($devbox , 0, 12, 0,12);
773
        $main_table->attach_defaults ($infobox  , 0, 12, 12,14);
774
        $main_table->attach_defaults ($genbox   , 6, 8, 14,15);
775
 
776 17 alirezamon
 
777
        my $open = def_image_button('icons/browse.png','Load Interface');
778
        my $openbox=def_hbox(TRUE,0);
779
        $openbox->pack_start($open,   FALSE, FALSE,0);
780
        $main_table->attach_defaults ($openbox,0, 2, 14,15);
781
 
782 16 alirezamon
        #check soc status every 0.5 second. referesh gui if there is any changes 
783
Glib::Timeout->add (100, sub{
784
 
785
                my ($state,$timeout)= get_state($soc_state);
786
                if ($timeout>0){
787
                        $timeout--;
788
                        set_state($soc_state,$state,$timeout);
789
                }
790
                elsif($state eq "load_file"){
791
                        my $file=$intfc_gen->intfc_get_interface_file();
792
                        my $pp= eval { do $file };
793
                        clone_obj($intfc_gen,$pp);
794
 
795
 
796
                        set_state($soc_state,"ref",1);
797
 
798
 
799
                }
800
                elsif( $state ne "ideal" ){
801
                        $refresh->clicked;
802
                        set_state($soc_state,"ideal",0);
803
 
804
                }
805
                return TRUE;
806
 
807
                } );
808 17 alirezamon
 
809
        $open-> signal_connect("clicked" => sub{
810
                load_interface($intfc_gen,$soc_state);
811
 
812
        });
813 16 alirezamon
 
814
        $generate-> signal_connect("clicked" => sub{
815 17 alirezamon
                if( check_intfc($intfc_gen)) {
816
                        generate_lib($intfc_gen);
817
 
818
                }
819 16 alirezamon
 
820
                $refresh->clicked;
821
 
822
});
823
 
824
        #show_selected_dev($info,\@active_dev,\$dev_list_refresh,\$dev_table);
825
 
826
 
827
 
828
#$box->show;
829
        #$window->add ($main_table);
830
        #$window->show_all;
831
        #return $main_table;
832
 
833
        my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
834
                $sc_win->set_policy( "automatic", "automatic" );
835
                $sc_win->add_with_viewport($main_table);
836
 
837
        return $sc_win;
838
 
839
 
840
}
841
 
842
 
843
 
844
 
845
 
846
1
847
 

powered by: WebSVN 2.1.0

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