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

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 wb_addr;
6
use interface;
7
use intfc_gen;
8
use ip_gen;
9
use rvp;
10
use Cwd 'abs_path';
11
 
12
use File::Basename;
13
 
14
use Gtk2;
15
 
16
 
17
require "widget.pl";
18
 
19
 
20
use String::Similarity;
21
 
22
 
23
sub find_the_most_similar_position{
24
        my ($item ,@list)=@_;
25
        my $most_similar_pos=0;
26
        my $lastsim=0;
27
        my $i=0;
28
        foreach my $p(@list){
29
                my $similarity= similarity $item, $p;
30
                if ($similarity > $lastsim){
31
                        $lastsim=$similarity;
32
                        $most_similar_pos=$i;
33
                }
34
                $i++;
35
        }
36
        return $most_similar_pos;
37
}
38
 
39
 
40
use constant DISPLY_COLUMN    => 0;
41
use constant CATGR_COLUMN    => 1;
42
use constant INTFC_COLUMN     => 2;
43
use constant ITAL_COLUMN   => 3;
44
use constant NUM_COLUMN     => 4;
45
 
46
################
47
#  check_input_file
48
################
49
 
50
sub check_input_file{
51
        my ($file,$ipgen,$soc_state,$info)=@_;
52
        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
53
        if($suffix eq '.IP'){
54
                $ipgen->ipgen_set_file($file);
55
                set_state($soc_state,"load_file",0);
56
 
57
 
58
        }else{
59
                read_all_module ($file,$ipgen,$soc_state,$info);
60
 
61
        }
62
 
63
 
64
}
65
 
66
 
67
sub read_all_module{
68
        my ($file,$ipgen,$soc_state,$info)=@_;
69
 
70
        if (!defined $file) {return; }
71
        if (-e $file) {
72
                my $vdb =  read_file($file);
73
                my @modules=sort $vdb->get_modules($file);
74
                #foreach my $p(@module_list) {print "$p\n"}
75
                $ipgen->ipgen_set_file($file);
76
                $ipgen->ipgen_set_module_name($modules[0]);
77
                $ipgen->ipgen_set_module_list(@modules);
78
                load_deafult_setting($ipgen,$modules[0]);
79
 
80
 
81
                set_state($soc_state,"file_selected",1);
82
                show_info(\$info,"Select the module which contain the interface ports\n ");
83
 
84
        }
85
        else {
86
                show_info(\$info,"File $file doese not exsit!\n ");
87
 
88
        }
89
}
90
 
91
 
92
##############
93
#       create_interface_tree 
94
##############
95
sub create_interface_tree {
96
   my ($info,$intfc,$ipgen,$soc_state)=@_;
97
   my $model = Gtk2::TreeStore->new ('Glib::String', 'Glib::String', 'Glib::Scalar', 'Glib::Boolean');
98
   my $tree_view = Gtk2::TreeView->new;
99
   $tree_view->set_model ($model);
100
   my $selection = $tree_view->get_selection;
101
 
102
   $selection->set_mode ('browse');
103
   $tree_view->set_size_request (200, -1);
104
 
105
 
106
  # my @interface= $intfc->get_interfaces();
107
        my @categories= $intfc->get_categories();
108
 
109
 
110
 
111
   foreach my $p (@categories)
112
   {
113
        my @intfc_names=  $intfc->get_intfcs_of_category($p);
114
        #my @dev_entry=  @{$tree_entry{$p}};    
115
        my $iter = $model->append (undef);
116
        $model->set ($iter,
117
                   DISPLY_COLUMN,    $p,
118
                   CATGR_COLUMN, $p || '',
119
                   INTFC_COLUMN,     0     || '',
120
                   ITAL_COLUMN,   FALSE);
121
 
122
        next unless  @intfc_names;
123
 
124
        foreach my $v ( @intfc_names){
125
                 my $child_iter = $model->append ($iter);
126
                 my $entry= '';
127
 
128
                $model->set ($child_iter,
129
                                        DISPLY_COLUMN,    $v,
130
                        CATGR_COLUMN, $p|| '',
131
                        INTFC_COLUMN,     $v     || '',
132
                        ITAL_COLUMN,   FALSE);
133
        }
134
 
135
 
136
 
137
   }
138
 
139
   my $cell = Gtk2::CellRendererText->new;
140
   $cell->set ('style' => 'italic');
141
   my $column = Gtk2::TreeViewColumn->new_with_attributes
142
                                        ("Double click to add the interface",
143
                                        $cell,
144
                                        'text' => DISPLY_COLUMN,
145
                                        'style_set' => ITAL_COLUMN);
146
 
147
  $tree_view->append_column ($column);
148
  my @ll=($model,\$info);
149
#row selected
150
 
151
  $selection->signal_connect (changed =>sub {
152
        my ($selection, $ref) = @_;
153
        my ($model,$info)=@{$ref};
154
        my $iter = $selection->get_selected;
155
        return unless defined $iter;
156
 
157
        my ($category) = $model->get ($iter, CATGR_COLUMN);
158
        my ($name) = $model->get ($iter,INTFC_COLUMN );
159
        my $describ=$intfc->get_description($category,$name);
160
 
161
        if($describ){
162
                #print "$entry description is: $describ \n";
163
                show_info($info,$describ);
164
 
165
        }
166
 
167
 
168
}, \@ll);
169
 
170
#  row_activated 
171
  $tree_view->signal_connect (row_activated => sub{
172
 
173
        my ($tree_view, $path, $column) = @_;
174
        my $model = $tree_view->get_model;
175
        my $iter = $model->get_iter ($path);
176
        my ($category) = $model->get ($iter, CATGR_COLUMN);
177
        my ($name) = $model->get ($iter,INTFC_COLUMN );
178
 
179
 
180
 
181
        if($name){
182
                #print "$infc_name-$infc_type  is selected via row activaton!\n";
183
                add_intfc_to_ip($intfc,$ipgen,$name,'plug',\$info,$soc_state);
184
 
185
        }
186
 
187
}, \@ll);
188
 
189
  #$tree_view->expand_all;
190
 
191
  my $scrolled_window = Gtk2::ScrolledWindow->new;
192
  $scrolled_window->set_policy ('automatic', 'automatic');
193
  $scrolled_window->set_shadow_type ('in');
194
  $scrolled_window->add($tree_view);
195
 
196
  my $hbox = Gtk2::HBox->new (TRUE, 0);
197
  $hbox->pack_start ( $scrolled_window, TRUE, TRUE, 0);
198
 
199
 
200
 
201
  return $hbox;
202
}
203
 
204
 
205
 
206
sub save_ports_all{
207
        my ($ipgen,$vdb,$top_module)=@_;
208
 
209
        foreach my $sig (sort $vdb->get_modules_signals($top_module)) {
210
        my ($line,$a_line,$i_line,$type,$file,$posedge,$negedge,
211
         $type2,$s_file,$s_line,$range,$a_file,$i_file,$dims) =
212
           $vdb->get_module_signal($top_module,$sig);
213
 
214
                if($type eq "input" or $type eq "inout" or $type eq "output" ){
215
                        $ipgen->ipgen_add_port($sig,$range,$type,'IO','IO');
216
                        #print "$sig,$range,$type,'IO','IO'\n";
217
 
218
                }
219
 
220
 
221
        }
222
 
223
}
224
 
225
 
226
############
227
#       file_info
228
#############
229
 
230
sub ip_file_box {
231
        my ($ipgen,$soc_state,$info,$table,$row)=@_;
232
        my $label = gen_label_in_left(" Select file:");
233
        my $entry = Gtk2::Entry->new;
234
        #my $open= def_image_button("icons/select.png","Open");
235
        my $browse= def_image_button("icons/browse.png","Browse");
236
        my $label2= gen_label_in_left(" IP name:");
237
        my $entry2= gen_entry();
238
        my $file= $ipgen->ipgen_get_file();
239
        if(defined $file){$entry->set_text($file);}
240
        my $ip_name= $ipgen->ipgen_get_ip_name();
241
        if(defined $ip_name){$entry2->set_text($ip_name);}
242
        show_info(\$info,"Please select the verilog file containig the ip module\n");
243
        $browse->signal_connect("clicked"=> sub{
244
                my $entry_ref=$_[1];
245
                my $file;
246
        my $dialog = Gtk2::FileChooserDialog->new(
247
                'Select a File', undef,
248
                'open',
249
                'gtk-cancel' => 'cancel',
250
                'gtk-ok'     => 'ok',
251
                );
252
 
253
                my $filter = Gtk2::FileFilter->new();
254
                        $filter->set_name("Verilog");
255
                        $filter->add_pattern("*.v");
256
                        my $filter2 = Gtk2::FileFilter->new();
257
                        $filter2->set_name("IP");
258
                        $filter2->add_pattern("*.IP");
259
                        $dialog->add_filter ($filter);
260
                        $dialog->add_filter ($filter2);
261
 
262
                if ( "ok" eq $dialog->run ) {
263
                        $file = $dialog->get_filename;
264
                                        $$entry_ref->set_text($file);
265
                                        check_input_file($file,$ipgen,$soc_state,$info);
266
                        #print "file = $file\n";
267
                 }
268
                $dialog->destroy;
269
 
270
 
271
 
272
        } , \$entry);
273
 
274
 
275
 
276
        #$open->signal_connect("clicked"=> sub{
277
                #my $file_name=$entry->get_text();
278
                #check_input_file($file_name,$ipgen,$soc_state,$info);
279
 
280
                #});
281
        $entry->signal_connect("activate"=>sub{
282
                my $file_name=$entry->get_text();
283
                check_input_file($file_name,$ipgen,$soc_state,$info);
284
        });
285
 
286
        $entry->signal_connect("changed"=>sub{
287
                show_info(\$info,"Please select the verilog file containig the interface\n");
288
        });
289
        $entry2->signal_connect("changed"=>sub{
290
                my $name=$entry2->get_text();
291
                $ipgen->ipgen_set_ip_name($name);
292
 
293
        });
294
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
295
        $table->attach_defaults ($entry, 1, 8 , $row, $row+1);
296
        $table->attach_defaults ($browse, 8, 9, $row, $row+1);
297
        $table->attach_defaults ($label2, 9, 10, $row, $row+1);
298
        $table->attach_defaults ($entry2,  10, 11, $row, $row+1);
299
        #$table->attach_defaults ($open,  7, 8, $row, $row+1);
300
        #$table->attach_defaults ($entry, $col, $col+1, $row, $row+1);
301
        #return $table;
302
 
303
 
304
}
305
 
306
 
307
 
308
 
309
sub select_module{
310
        my ($ipgen,$soc_state,$info,$table,$row)=@_;
311
        my $label= gen_label_in_left("  Select module:");
312
        my @modules= $ipgen->ipgen_get_module_list();
313
        my $saved_module=$ipgen->ipgen_get_module_name();
314
        my $pos=(defined $saved_module ) ? get_scolar_pos( $saved_module,@modules) : 0;
315
        my $combo = gen_combo(\@modules, $pos);
316
        my $param= def_image_button("icons/setting.png","Parameter\n   setting");
317
        my $label2= gen_label_in_left("  Select Category:");
318
        my ($category,$category_entry)=gen_entry_help('Define the IP category:e.g RAM, GPIO,...');
319
        my $saved_category=$ipgen->ipgen_get_category();
320
        if(defined $saved_category){$category_entry->set_text($saved_category);}
321
        my $ipinfo= def_image_button("icons/info.png","IP Description");
322
        my $header_h= def_image_button("icons/h_file.png","Add Headerfile");
323
        my $lib_hdl= def_image_button("icons/add-notes.png","Add HDL files");
324
 
325
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
326
        $table->attach_defaults ($combo, 1, 5 , $row,$row+1);
327
        $table->attach_defaults ($param, 5, 6 , $row, $row+1);
328
        $table->attach_defaults ($label2, 6, 7 , $row, $row+1);
329
        $table->attach_defaults ($category, 7, 8 , $row, $row+1);
330
        $table->attach_defaults ($ipinfo, 8, 9 , $row, $row+1);
331
        $table->attach_defaults ($header_h, 9, 10 , $row, $row+1);
332
        $table->attach_defaults ($lib_hdl, 10, 11 , $row, $row+1);
333
 
334
 
335
        $combo->signal_connect("changed"=> sub{
336
 
337
                my $module= $combo->get_active_text();
338
                load_deafult_setting($ipgen,$module);
339
                set_state($soc_state,'intfc_changed',0);
340
 
341
 
342
        });
343
 
344
        $param->signal_connect("clicked"=> sub{
345
                get_parameter_setting($ipgen,$soc_state,$info);
346
 
347
 
348
        });
349
        $category_entry->signal_connect("changed"=> sub{
350
                my $name=$category_entry->get_text();
351
                $ipgen->ipgen_set_category($name);
352
 
353
        });
354
        $ipinfo->signal_connect("clicked"=> sub{
355
                get_Description($ipgen,$soc_state,$info);
356
 
357
        });
358
        $header_h->signal_connect("clicked"=> sub{
359
                get_header_file($ipgen,$soc_state,$info);
360
 
361
        });
362
        $lib_hdl->signal_connect("clicked"=> sub{
363
                get_hdl_file($ipgen,$soc_state,$info);
364
 
365
        });
366
}
367
 
368
sub load_deafult_setting{
369
        my ($ipgen,$module)=@_;
370
        my $file= $ipgen->ipgen_get_file();
371
        $ipgen->ipgen_set_module_name($module);
372
        my $vdb =read_file($file);
373
        my %parameters = $vdb->get_modules_parameters_not_local($module);
374
        my @parameters_order= $vdb->get_modules_parameters_not_local_order($module);
375
        my @ports_order=$vdb->get_module_ports_order($module);
376
        #print "@port_order\n";
377
 
378
        #add deafult parameter setting
379
        $ipgen->ipgen_remove_all_parameters();
380
        foreach my $p (keys %parameters){
381
                        #print "$p\n";
382
                        my $v = $parameters{$p};
383
                        $v =~s/[\n]//gs;
384
                        $ipgen->ipgen_add_parameter($p,$v,'Fixed','');
385
 
386
        }
387
        #add parameter order. 
388
        $ipgen->ipgen_add_parameters_order(@parameters_order);
389
        #add port order.
390
        $ipgen->ipgen_add_ports_order(@ports_order);
391
        #add ports 
392
        $ipgen->ipgen_remove_all_ports();
393
        save_ports_all($ipgen,$vdb,$module);
394
 
395
 
396
 
397
}
398
 
399
sub file_info_box {
400
        my($ipgen,$soc_state,$info)=@_;
401
        my $table=def_table(2,11,FALSE);
402
        ip_file_box ($ipgen,$soc_state,$info,$table,0);
403
        select_module($ipgen,$soc_state,$info,$table,1);
404
        return $table;
405
 
406
 
407
}
408
 
409
 
410
 
411
 
412
sub show_file_info{
413
        my($ipgen,$soc_state,$info,$refresh_ref)=@_;
414
        my $table = file_info_box($ipgen,$soc_state,$info,$info);
415
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
416
        $scrolled_win->set_policy( "automatic", "never" );
417
        $scrolled_win->add_with_viewport($table);
418
 
419
 
420
 
421
        $$refresh_ref-> signal_connect("clicked" => sub{
422
                $table->destroy;
423
                $table = file_info_box($ipgen,$soc_state,$info,$info);
424
 
425
                $scrolled_win->add_with_viewport($table);
426
                $table->show;
427
                $scrolled_win->show_all;
428
 
429
                #print "llllllllllllllllllllllllllllllllllllll\n";
430
 
431
 
432
        });
433
 
434
        return $scrolled_win;
435
 
436
 
437
 
438
}
439
 
440
 
441
sub show_port_info{
442
        my($intfc,$ipgen,$soc_state,$info,$refresh_ref)=@_;
443
        my $table = port_info_box($intfc,$ipgen,$soc_state,$info,$info);
444
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
445
        $scrolled_win->set_policy( "automatic", "automatic" );
446
        $scrolled_win->add_with_viewport($table);
447
 
448
 
449
 
450
        $$refresh_ref-> signal_connect("clicked" => sub{
451
                $table->destroy;
452
                $table = port_info_box($intfc,$ipgen,$soc_state,$info,$info);
453
 
454
                $scrolled_win->add_with_viewport($table);
455
                $table->show;
456
                $scrolled_win->show_all;
457
 
458
 
459
 
460
 
461
        });
462
 
463
        return $scrolled_win;
464
 
465
}
466
 
467
 
468
sub show_interface_info{
469
        my($intfc,$ipgen,$soc_state,$info,$refresh_ref)=@_;
470
        my $table = interface_info_box($intfc,$ipgen,$soc_state,$info,$info);
471
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
472
        $scrolled_win->set_policy( "automatic", "automatic" );
473
        $scrolled_win->add_with_viewport($table);
474
 
475
 
476
 
477
        $$refresh_ref-> signal_connect("clicked" => sub{
478
                $table->destroy;
479
                $table = interface_info_box($intfc,$ipgen,$soc_state,$info,$info);
480
 
481
                $scrolled_win->add_with_viewport($table);
482
                $table->show;
483
                $scrolled_win->show_all;
484
 
485
 
486
        });
487
 
488
        return $scrolled_win;
489
 
490
 
491
 
492
}
493
 
494
 
495
 
496
 
497
 
498
 
499
 
500
 
501
############
502
#  get_parameter_setting
503
##########
504
sub get_parameter_setting {
505
        my ($ipgen,$soc_state,$info)=@_;
506
 
507
        my $module = $ipgen->ipgen_get_module_name();
508
        my $file= $ipgen->ipgen_get_file();
509
        if (!defined $file) {
510
                        message_dialog("The input verilog file is empty");
511
                        return;
512
 
513
        }
514
 
515
        #my $titelbox=def_title_box(TRUE,5,("Parameter name","Deafult value","Widget type","Widget content","Global param   Optional info",));
516
 
517
 
518
 
519
 
520
 
521
        my @widget_type_list=("Fixed","Entry","Combo-box","Spin-button");
522
        my @param_type_list=("localparam-pass", "parameter-pass", "localparam-notpass","parameter-notpass");
523
        my $type_info="Define the parameter type:
524
\tFixed: The parameter is fixed and get the deafult value. the user can not see or change it.
525
\tEntry: The parameter value is recived via entry. The user can type anything.
526
\tCombo-box: The parameter value can be selected from a list of predefined value.
527
\tSpin-button: The parameter is numeric and will be adjast using spin button.";
528
        my $content_info='
529
For Fixed and Entry leave it empty.
530
For Combo box define the parameters which must be shown in combo box as: "PAEAMETER1","PARAMETER2"...,"PARAMETERn".
531
For Spin button define it as "minimum, maximum, step" e.g 0,10,1.';
532
        my $param_info='
533
        If checked, the parameter will be defined as parameter in SoC file too, otherwise it will be defined as localparam.';
534
 
535
        my $redefine_info='
536
        If checked, the defined parameter/localparam in SoC will be passed to the IP core';
537
 
538
        #TABLE
539
        my $table = Gtk2::Table->new (12, 8, FALSE);
540
        my @positions=(0,1,2,3,4,5,6,7,8);
541
        my $col=0;
542
        #title
543
        my @title;
544
        $title[0]=gen_label_in_center("Parameter name");
545
        $title[1]=gen_label_in_center("Deafult value");
546
        $title[2]=gen_label_help($type_info,"Widget type");
547
        $title[3]=gen_label_help($content_info,"Widget content");
548
        $title[4]=gen_label_help($param_info);
549
        $title[5]=gen_label_help($redefine_info);
550
        $title[6]=gen_label_help("You can add aditional information about this parameter.","info");
551
        $title[7]=gen_label_in_center("add/remove");
552
 
553
 
554
        foreach my $t (@title){
555
                $table->attach_defaults ($title[$col], $positions[$col], $positions[$col+1], 0, 1);$col++;
556
 
557
        }
558
 
559
 
560
 
561
        my ($box,$window)=def_scrolled_window_box(1200,500,"Define parameters detail");
562
 
563
 
564
 
565
 
566
        my @parameters=$ipgen->ipgen_get_all_parameters_list();
567
        my @params_order= $ipgen->ipgen_get_parameters_order();
568
        if((@params_order)) {@parameters=@params_order;}
569
 
570
        my $ok = def_image_button('icons/select.png','OK');
571
        my $okbox=def_hbox(TRUE,0);
572
        $okbox->pack_start($ok,   FALSE, FALSE,0);
573
 
574
        my ($b,$new_param)= def_h_labeled_entry("Add new parameter name:");
575
        my $add = def_image_button('icons/plus.png','Add parameter');
576
        my $addbox=def_hbox(FALSE,0);
577
        $addbox->pack_start($b,FALSE, FALSE,0);
578
        $addbox->pack_start($add,   FALSE, FALSE,0);
579
 
580
        my @allowed;
581
 
582
        my $row=1;
583
 
584
        push(@parameters,"#new#");
585
        foreach my $p (@parameters) {
586
                my ($saved_deafult,$saved_widget_type,$saved_content,$saved_info,$global_param,$redefine_param)=  $ipgen->ipgen_get_parameter_detail($p);
587
                #print  "($saved_deafult,$saved_type,$saved_content)\n";
588
                my $parameter_box = def_hbox(TRUE,5);
589
                my $param_name;
590
                my $add_remove;
591
                if($p ne "#new#"){
592
                        $param_name= def_label($p);
593
                        $add_remove=def_image_button("icons/cancel.png","remove");
594
                } else {
595
                        $param_name= gen_entry();
596
                        $add_remove=def_image_button("icons/plus.png","add");
597
                }
598
 
599
                my $deafult_entry= gen_entry($saved_deafult);
600
                my $pos=(defined $saved_widget_type ) ? get_scolar_pos( $saved_widget_type,@widget_type_list) : 0;
601
                my $widget_type_combo=gen_combo(\@widget_type_list, $pos);
602
                my $content_entry= gen_entry($saved_content);
603
                my $check_param= Gtk2::CheckButton->new('Parameter');
604
                $check_param->set_active($global_param) if(defined $global_param );
605
                my $check_redefine= Gtk2::CheckButton->new('Redefine');
606
                $check_redefine->set_active(1) ;
607
                $check_redefine->set_active($redefine_param) if(defined $redefine_param );
608
 
609
 
610
 
611
 
612
 
613
                #my $check= Gtk2::CheckButton->new;
614
                #$check->set_active($global_param) if(defined $global_param );
615
 
616
 
617
                my $info=def_image_button("icons/addinfo.png");
618
                #print "\$global_param =$global_param\n";
619
 
620
                $col=0;
621
                my @all_widget=($param_name,$deafult_entry,$widget_type_combo,$content_entry,$check_param,$check_redefine,$info,$add_remove);
622
                foreach my $t (@all_widget){
623
                        $table->attach_defaults ($t, $positions[$col], $positions[$col+1], $row, $row+1);$col++;
624
 
625
                }
626
 
627
 
628
                $info->signal_connect (clicked => sub{
629
 
630
                        get_param_info($ipgen,\$saved_info);
631
                });
632
 
633
 
634
                $ok->signal_connect (clicked => sub{
635
                        if($p ne "#new#"){
636
                                my $deafult=$deafult_entry->get_text();
637
                                my $type= $widget_type_combo->get_active_text();
638
                                my $content=$content_entry->get_text();
639
                                my $check_result=$check_param->get_active();
640
                                my $global_param=($check_result eq 1)? 1:0;
641
                                $check_result=$check_redefine->get_active();
642
                                my $redefine_param=($check_result eq 1)? 1:0;
643
                                $ipgen->ipgen_add_parameter($p,$deafult,$type,$content,$saved_info,$global_param,$redefine_param);
644
                        }
645
                });
646
                $add_remove->signal_connect (clicked => sub{
647
                        if($p eq "#new#"){ #add new parameter
648
                                my $param= $param_name->get_text();
649
 
650
                                if( length($param) ){
651
                                        my $deafult=$deafult_entry->get_text();
652
                                        my $type=$widget_type_combo->get_active_text();
653
                                        my $content=$content_entry->get_text();
654
                                        my $check_result=$check_param->get_active();
655
                                        my $global_param=($check_result eq 1)? 1:0;
656
                                           $check_result=$check_redefine->get_active();
657
                                        my $redefine_param=($check_result eq 1)? 1:0;
658
                                        $ipgen->ipgen_add_parameter($param,$deafult,$type,$content,$saved_info,$global_param,$redefine_param);
659
                                        $ipgen->ipgen_push_parameters_order($param);
660
                                        set_state($soc_state,"change_parameter",0);
661
                                        $ok->clicked;
662
                                        #$window->destroy();
663
                                }
664
 
665
                        } else { #remove the parameter
666
                                $ipgen->ipgen_remove_parameter($p);
667
                                $ipgen->ipgen_remove_parameters_order($p);
668
                                set_state($soc_state,"change_parameter",0);
669
                                $ok->clicked;
670
                                        #$window->destroy();
671
 
672
                        }
673
                        #my $param_name=$new_param->get_text();
674
                        #       if( length($param_name) ){
675
                        #               print "$param_name\n";
676
                        #               $ipgen->ipgen_add_parameter($param_name,undef);
677
                        #               set_state($soc_state,"change_parameter",0);
678
                        #               $window->destroy();
679
 
680
                });
681
 
682
 
683
 
684
        $row++;
685
        }
686
        $box->pack_start( $table, FALSE, FALSE, 3);
687
 
688
        for (my $i=$row; $i<7;$i++){
689
                my $temp=gen_label_in_center(' ');
690
                $box->pack_start($temp,   TRUE, FALSE,3);
691
        }
692
 
693
        $box->pack_start($okbox,   TRUE, FALSE,3);
694
 
695
        $add->signal_connect (clicked => sub{
696
                my $param_name=$new_param->get_text();
697
                if( length($param_name) ){
698
                        #print "$param_name\n";
699
                        $ipgen->ipgen_add_parameter($param_name,undef);
700
                        set_state($soc_state,"change_parameter",0);
701
                        $window->destroy();
702
                }
703
 
704
#/*******************************************************************************************************************************/
705
 
706
        });
707
 
708
        $ok->signal_connect (clicked => sub{
709
 
710
                $window->destroy();
711
 
712
        });
713
 
714
 
715
 
716
 
717
 
718
        $window->show_all;
719
}
720
 
721
###########
722
#       get description
723
#########
724
 
725
sub get_Description{
726
        my ($ipgen,$soc_state,$info)=@_;
727
        my $description = $ipgen->ipgen_get_description();
728
        my $table = Gtk2::Table->new (15, 15, TRUE);
729
        my $window=def_popwin_size(500,500,"Add description");
730
        my ($scrwin,$text_view)=create_text();
731
        #my $buffer = $textbox->get_buffer();
732
        my $ok=def_image_button("icons/select.png",' Ok ');
733
 
734
        $table->attach_defaults($scrwin,0,15,0,14);
735
        $table->attach_defaults($ok,6,9,14,15);
736
        my $text_buffer = $text_view->get_buffer;
737
        if(defined $description) {$text_buffer->set_text($description)};
738
 
739
        $ok->signal_connect("clicked"=> sub {
740
                $window->destroy;
741
 
742
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
743
                 $ipgen->ipgen_set_description($text);
744
                #print "$text\n";
745
 
746
        });
747
 
748
        $window->add($table);
749
        $window->show_all();
750
 
751
}
752
 
753
 
754
###########
755
#       get header file 
756
#########
757
 
758
sub get_header_file{
759
        my ($ipgen,$soc_state,$info)=@_;
760
        my $hdr = $ipgen->ipgen_get_hdr();
761
        my $table = Gtk2::Table->new (15, 15, TRUE);
762
        my $window=def_popwin_size(600,600,"Add header file");
763
        my ($scrwin,$text_view)=create_text();
764
        my $ok=def_image_button("icons/select.png",' Ok ');
765
        my $help_text=
766
'Define the header file for this peripheral device.
767
You can use two variable $BASEn and $IP.
768
   $BASE  is the wishbone base addresse(s) and will be added
769
   during soc generation to system.h. If more than one slave
770
   wishbone bus are used  define them as $BASE0, $BASE1 ...
771
 
772
   $IP:  is the peripheral device name. It is recommended to
773
   add it to the global variables, definitions and functions.
774
   when more than one peripheral device is allowed to be
775
   called in the SoC.
776
 
777
header file example
778
 
779
 #define $IP_REG_0   (*((volatile unsigned int *) ($BASE)))
780
 #define $IP_REG_1   (*((volatile unsigned int *) ($BASE+4)))
781
 
782
 
783
 #define $IP_WRITE_REG1(value)  $IP_REG_1=value
784
 #define $IP_READ_REG1()        $IP_REG_1
785
  ';
786
 
787
        my $help=gen_label_help($help_text,"Define the header file for this peripheral devive");
788
        $table->attach_defaults($help,0,15,0,1);
789
        $table->attach_defaults($scrwin,0,15,1,14);
790
        $table->attach_defaults($ok,6,9,14,15);
791
        my $text_buffer = $text_view->get_buffer;
792
        if(defined $hdr) {$text_buffer->set_text($hdr)};
793
 
794
        $ok->signal_connect("clicked"=> sub {
795
                $window->destroy;
796
 
797
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
798
                 $ipgen->ipgen_set_hdr($text);
799
                #print "$text\n";
800
 
801
        });
802
 
803
        $window->add($table);
804
        $window->show_all();
805
 
806
}
807
 
808
#############
809
#       get hdl files
810
############
811
sub get_hdl_file{
812
my ($ipgen,$soc_state,$info)=@_;
813
        my $hdr = $ipgen->ipgen_get_hdr();
814
        my $table = Gtk2::Table->new (15, 15, TRUE);
815
        my $window=def_popwin_size(600,600,"Add header file");
816
        my @saved_files=$ipgen->ipgen_get_hdl_files_list();
817
        my $ok=def_image_button("icons/select.png",' Ok ');
818
        my $scrwin=gen_file_list($ipgen,\@saved_files,$ok);
819
 
820
        my $label=gen_label_in_left("Selecet the design files you want to include for the IP core");
821
        my $brows=def_image_button("icons/browse.png",' Browse');
822
        $table->attach_defaults($label,0,10,0,1);
823
        $table->attach_defaults($brows,10,12,0,1);
824
        $table->attach_defaults($scrwin,0,15,1,14);
825
        $table->attach_defaults($ok,6,9,14,15);
826
 
827
        my $dir = Cwd::getcwd();
828
        my $project_dir   = abs_path("$dir/../../"); #mpsoc directory address
829
 
830
 
831
        $brows->signal_connect("clicked"=> sub {
832
                my @files;
833
        my $dialog = Gtk2::FileChooserDialog->new(
834
                'Select a File',
835
                 undef,
836
                 'open',
837
                'gtk-cancel' => 'cancel',
838
                'gtk-ok'     => 'ok',
839
                );
840
 
841
                my $filter = Gtk2::FileFilter->new();
842
                        my $dir = Cwd::getcwd();
843
                        $dialog->set_current_folder ("$dir/..") ;
844
                        $dialog->set_select_multiple(TRUE);
845
 
846
                if ( "ok" eq $dialog->run ) {
847
                        @files = $dialog->get_filenames;
848
 
849
                        @saved_files=$ipgen->ipgen_get_hdl_files_list();
850
                        foreach my $p (@files){
851
                                #remove $project_dir form beginig of each file
852
                                $p =~ s/$project_dir//;
853
                                if(! grep (/^$p$/,@saved_files)){push(@saved_files,$p)};
854
 
855
                        }
856
                        $ipgen->ipgen_set_hdl_files_list(\@saved_files);
857
                        $window->destroy;
858
                        get_hdl_file($ipgen,$soc_state,$info);
859
 
860
                                        #$$entry_ref->set_text($file);
861
 
862
                        #print "file = $file\n";
863
                 }
864
                $dialog->destroy;
865
 
866
 
867
 
868
        } );# # ,\$entry);
869
 
870
 
871
 
872
 
873
 
874
        $ok->signal_connect("clicked"=> sub {
875
 
876
 
877
 
878
                $window->destroy;
879
 
880
                 #my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
881
                 #$ipgen->ipgen_set_hdr($text); 
882
                #print "$text\n";
883
 
884
        });
885
 
886
        $window->add($table);
887
        $window->show_all();
888
 
889
}
890
 
891
 
892
 
893
 
894
##########
895
#
896
#########
897
 
898
sub gen_file_list{
899
        my ($ipgen,$ref,$ok)=@_;
900
        my @files=@{$ref};
901
        my $file_num= scalar @files;
902
 
903
 
904
        my $table=def_table(10,10,TRUE);#       my ($row,$col,$homogeneous)=@_;
905
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
906
        $scrolled_win->set_policy( "automatic", "automatic" );
907
        $scrolled_win->add_with_viewport($table);
908
 
909
 
910
        my $col=0;
911
    my $row=0;
912
        foreach my $p(@files){
913
                my $entry=gen_entry($p);
914
                my $remove=def_image_button("icons/cancel.png");
915
            $table->attach_defaults ($entry, 0, 9 , $row, $row+1);
916
                $table->attach_defaults ($remove, 9,10 , $row, $row+1);
917
                $row++;
918
                $remove->signal_connect("clicked"=> sub {
919
                        my @saved_files=$ipgen->ipgen_get_hdl_files_list();
920
                        @saved_files=remove_scolar_from_array(\@saved_files,$p);
921
                        $ipgen->ipgen_set_hdl_files_list(\@saved_files);
922
                        $entry->destroy;
923
                        $remove->destroy;
924
 
925
                });
926
                $ok->signal_connect("clicked"=> sub {
927
                        if(defined $entry){
928
                                my $n= $entry->get_text();
929
                                if($p ne $n){
930
                                        my @saved_files=$ipgen->ipgen_get_hdl_files_list();
931
                                        @saved_files=replace_in_array(\@saved_files,$p, $n);
932
                                        $ipgen->ipgen_set_hdl_files_list(\@saved_files);
933
                                }
934
 
935
                        }
936
 
937
 
938
 
939
                });
940
 
941
                #my $seph = Gtk2::HSeparator->new;
942
                #$table->attach_defaults ($seph, 0, 10 , $row, $row+1);
943
                #$row++;                
944
        }
945
 
946
 
947
 
948
 
949
#   while( $row<10){
950
        #       my $label=gen_label_in_left(' ');
951
           # $table->attach_defaults ($label, 0, 1 , $row, $row+1);$row++;
952
        #}
953
 
954
 
955
        return $scrolled_win;
956
}
957
 
958
 
959
 
960
sub get_param_info{
961
        my ($ipgen,$saved_info)=@_;
962
        my $table = Gtk2::Table->new (15, 15, TRUE);
963
        my $window=def_popwin_size(500,500,"Add description");
964
        my ($scrwin,$text_view)=create_text();
965
        my $ok=def_image_button("icons/select.png",' Ok ');
966
 
967
        $table->attach_defaults($scrwin,0,15,0,14);
968
        $table->attach_defaults($ok,6,9,14,15);
969
        my $text_buffer = $text_view->get_buffer;
970
        if(defined $$saved_info) {$text_buffer->set_text($$saved_info)};
971
 
972
        $ok->signal_connect("clicked"=> sub {
973
                $window->destroy;
974
 
975
                 $$saved_info = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
976
 
977
 
978
        });
979
 
980
        $window->add($table);
981
        $window->show_all();
982
 
983
 
984
}
985
 
986
 
987
 
988
sub interface_info_box {
989
        my($intfc,$ipgen,$soc_state,$info)=@_;
990
        my $table=def_table(7,7,TRUE);
991
        my @sokets=$ipgen->ipgen_list_sokets;
992
        my @plugs=$ipgen->ipgen_list_plugs;
993
 
994
        my @positions=(0,1,2,4,5,6,7);
995
 
996
 
997
        my $row=0;
998
        my $col=0;
999
        $table->attach_defaults (gen_label_in_center(" Interface name"), $positions[0], $positions[1], $row, $row+1);
1000
        $table->attach_defaults (gen_label_in_center("Type"), $positions[1], $positions[2], $row, $row+1);
1001
        $table->attach_defaults (gen_label_in_left("Interface Num"), $positions[2], $positions[3], $row, $row+1);
1002
 
1003
        $row++;
1004
        my @type_list=('plug','socket');
1005
 
1006
        foreach my $p( @sokets){
1007
                #my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1008
                my ($type,$value,$connection_num)= $ipgen->ipgen_get_socket($p);
1009
                my $label_name=gen_label_in_center($p);
1010
                my $combo_type=gen_combo(\@type_list,1);
1011
                my $remove=     def_image_button('icons/cancel.png','Remove');
1012
                my $name_setting=def_image_button('icons/setting.png');
1013
                $remove->signal_connect ('clicked'=> sub{
1014
                        $ipgen->ipgen_remove_socket($p);
1015
                        set_state($soc_state,'intfc_changed',0);
1016
 
1017
                        }  );
1018
                $name_setting->signal_connect ('clicked'=> sub{
1019
                        get_intfc_setting($ipgen,$soc_state,$p,'socket');
1020
 
1021
 
1022
                });
1023
                $combo_type     ->signal_connect ('changed'=> sub{
1024
                        $ipgen->ipgen_remove_socket($p);
1025
                        add_intfc_to_ip($intfc,$ipgen,$p,'plug',$info,$soc_state);
1026
 
1027
                        }  );
1028
                $table->attach_defaults ($remove, $positions[4], $positions[5], $row, $row+1);
1029
                if ($type eq 'num'){
1030
                        my ($type_box,$type_spin)=gen_spin_help ('Define the number of this interface in module', 1,1024,1);
1031
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1032
                        $type_spin->set_value($value);
1033
                        my $advance_button=def_image_button('icons/advance.png','separate');
1034
                        $table->attach_defaults ($type_box, $positions[2], $positions[3], $row, $row+1);
1035
                        $table->attach_defaults ($advance_button, $positions[3], $positions[4], $row, $row+1);
1036
                        $type_spin->signal_connect("changed"=>sub{
1037
                                my $wiget=shift;
1038
                                my $num=$wiget->get_value_as_int();
1039
                                $ipgen->ipgen_add_soket($p,'num',$num);
1040
                                set_state($soc_state,'intfc_changed',0);
1041
 
1042
                        });
1043
                        $advance_button->signal_connect("clicked"=>sub{
1044
                                $ipgen->ipgen_add_soket($p,'param');
1045
                                set_state($soc_state,'intfc_changed',0);
1046
 
1047
                        });
1048
 
1049
                }
1050
                else {
1051
                        my @parameters=$ipgen->ipgen_get_all_parameters_list();
1052
                        my $pos= get_scolar_pos( $value,@parameters);
1053
                        if(!defined $pos){
1054
                                $pos=0;
1055
                                $ipgen->ipgen_add_soket($p,'param',$parameters[0]);
1056
                        }
1057
                        my ($type_box,$type_combo)=gen_combo_help ('Define the parameter which determine the number of this interface in module',\@parameters,$pos);
1058
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1059
                        my $advance_button=def_image_button('icons/advance.png','concatenate');
1060
                        $table->attach_defaults ($type_box, $positions[2], $positions[3], $row, $row+1);
1061
                        $table->attach_defaults ($advance_button, $positions[3], $positions[4], $row, $row+1);
1062
                        $type_combo->signal_connect("changed"=>sub{
1063
                                my $wiget=shift;
1064
                                my $value=$wiget->get_active_text();
1065
                                $ipgen->ipgen_add_soket($p,'param',$value);
1066
                                set_state($soc_state,'intfc_changed',0);
1067
 
1068
                        });
1069
                        $advance_button->signal_connect("clicked"=>sub{
1070
                                $ipgen->ipgen_add_soket($p,'num',0);
1071
                                set_state($soc_state,'intfc_changed',0);
1072
 
1073
                        });
1074
 
1075
                }
1076
 
1077
 
1078
 
1079
 
1080
 
1081
 
1082
                $table->attach_defaults ($label_name, $positions[0], $positions[1], $row, $row+1);
1083
                $table->attach_defaults ($combo_type, $positions[1], $positions[2], $row, $row+1);
1084
 
1085
 
1086
 
1087
 
1088
                $row++;
1089
        }
1090
        foreach my $q( @plugs){
1091
                #my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1092
                my ($type,$value)= $ipgen->ipgen_get_plug($q);
1093
                my $label_name=gen_label_in_center($q);
1094
                my $combo_type=gen_combo(\@type_list,0);
1095
                my $remove=     def_image_button('icons/cancel.png','Remove');
1096
                my $name_setting=def_image_button('icons/setting.png');
1097
 
1098
                $table->attach_defaults ($remove, $positions[4], $positions[5], $row, $row+1);
1099
                $remove->signal_connect ('clicked'=> sub{
1100
                        $ipgen->ipgen_remove_plug($q);
1101
                        set_state($soc_state,'intfc_changed',0);
1102
 
1103
                        }  );
1104
                $name_setting->signal_connect ('clicked'=> sub{
1105
                        get_intfc_setting($ipgen,$soc_state,$q,'plug');
1106
 
1107
 
1108
                }       );
1109
                $combo_type     ->signal_connect ('changed'=> sub{
1110
                        $ipgen->ipgen_remove_plug($q);
1111
                        add_intfc_to_ip($intfc,$ipgen,$q,'socket',$info,$soc_state);
1112
 
1113
                        }  );
1114
                #my $range_entry=gen_entry($range);
1115
                if ($type eq 'num'){
1116
                        my ($type_box,$type_spin)=gen_spin_help ('Define the number of this interface in module', 1,1024,1);
1117
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1118
                        $type_spin->set_value($value);
1119
                        $table->attach_defaults ($type_box, $positions[2], $positions[3], $row, $row+1);
1120
                        $type_spin->signal_connect("changed"=>sub{
1121
                                my $wiget=shift;
1122
                                my $num=$wiget->get_value_as_int();
1123
                                $ipgen->ipgen_add_plug($q,'num',$num);
1124
                                set_state($soc_state,'intfc_changed',0);
1125
 
1126
                        });
1127
 
1128
                }
1129
                $table->attach_defaults ($label_name, $positions[0], $positions[1], $row, $row+1);
1130
                $table->attach_defaults ($combo_type, $positions[1], $positions[2], $row, $row+1);
1131
                #$table->attach_defaults ($range_entry, 2, 4, $row, $row+1);
1132
 
1133
                #wishbone address seting
1134
                #print "$q eq 'wb_slave'\n";
1135
                if($q eq 'wb_slave'){
1136
                        my ($saved_addr,$saved_width)=$ipgen->ipgen_get_wb_addr($q,0);
1137
                        my $addr;
1138
                        if(!defined $saved_addr){
1139
                                 $addr= def_image_button('icons/warnning.png');
1140
                                 $addr->signal_connect ('clicked'=> sub{
1141
                                     message_dialog("Wishbone slave address range has not been set yet! ");
1142
 
1143
                                }  );
1144
                        }else{
1145
                                 $addr= def_image_button('icons/select.png');
1146
 
1147
                        }
1148
                        $table->attach_defaults ($addr, $positions[5], $positions[6], $row, $row+1);
1149
 
1150
 
1151
                }
1152
 
1153
 
1154
                $row++;
1155
        }
1156
 
1157
 
1158
 
1159
 
1160
 
1161
        return $table;
1162
 
1163
}
1164
 
1165
 
1166
sub get_intfc_setting{
1167
 
1168
        my ($ipgen,$soc_state,$intfc_name, $intfc_type)=@_;
1169
 
1170
 
1171
        my $window =  def_popwin_size(1000,500);
1172
        my $table=def_table(7,6,FALSE);
1173
        my $ok = def_image_button('icons/select.png','OK');
1174
        my $okbox=def_hbox(TRUE,0);
1175
        $okbox->pack_start($ok, FALSE, FALSE,0);
1176
 
1177
 
1178
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
1179
        $scrolled_win->set_policy( "automatic", "automatic" );
1180
        $scrolled_win->add_with_viewport($table);
1181
 
1182
        #title
1183
        my $lable1=gen_label_in_left("interface name");
1184
        $table->attach_defaults( $lable1,0,2,0,1);
1185
 
1186
 
1187
 
1188
 
1189
        my ($type,$value);
1190
        if($intfc_type eq 'plug'){
1191
                 ($type,$value)= $ipgen->ipgen_get_plug($intfc_name);
1192
        }else {
1193
                 ($type,$value)= $ipgen->ipgen_get_socket($intfc_name);
1194
 
1195
        }
1196
        if ($type ne 'num'){ $value=1;}
1197
        my $i=0;
1198
        for ( $i=0; $i < $value; $i++) {
1199
                #intfc name
1200
                my $saved_name;
1201
                my $number=$i;
1202
                if($intfc_type eq 'plug')       {$saved_name= $ipgen->ipgen_get_plug_name($intfc_name,$number);}
1203
                else                                            {$saved_name= $ipgen->ipgen_get_socket_name($intfc_name,$number);}
1204
                my  $entry_name=gen_entry($saved_name);
1205
 
1206
                $table->attach_defaults($entry_name,0,2,$i+1,$i+2);
1207
                $ok->signal_connect('clicked'=>sub{
1208
                                my $new_name=$entry_name->get_text();
1209
                                #print "my new name is: $new_name\n";
1210
                                if($intfc_type eq 'plug'){ $ipgen->ipgen_set_plug_name($intfc_name,$number,$new_name); }
1211
                                else {                                     $ipgen->ipgen_set_socket_name($intfc_name,$number,$new_name);}
1212
 
1213
                        });
1214
 
1215
 
1216
        }
1217
 
1218
 
1219
        #wishbone addr
1220
        if($intfc_name eq 'wb_slave' &&  $intfc_type eq 'plug'){
1221
                my $lable2=gen_label_in_center("address range: (start end name)");
1222
                my $lable3=gen_label_in_center("block address width");
1223
 
1224
                $table->attach_defaults( $lable2,2,5,0,1);
1225
                $table->attach_defaults( $lable3,5,6,0,1);
1226
 
1227
                my $plug=$intfc_name;
1228
                my $wb= wb_addr->wb_addr_new();
1229
                my @ip_names=$wb->wb_list_names();
1230
                my @list;
1231
                foreach my $p(@ip_names){
1232
                        my($start,$end,$cashed,$size)=$wb->wb_get_addr_info($p);
1233
                        push (@list,"$start\t$end\t\t$p");
1234
 
1235
                }
1236
 
1237
                my ($type,$value,$connection_num)=$ipgen->ipgen_get_plug($plug);
1238
                   $i=0;
1239
 
1240
                for ( $i=0; $i < $value; $i++) {
1241
                        my ($saved_addr,$saved_width)=$ipgen->ipgen_get_wb_addr($plug,$i);
1242
                        my $num=$i;
1243
                        my $pos;
1244
                        if(!defined $saved_addr){
1245
                                $pos=0;
1246
                                $saved_width=1;
1247
                                $ipgen->ipgen_save_wb_addr($plug,$num,$list[0],1);
1248
                        }
1249
                        else{
1250
                                $pos= get_scolar_pos($saved_addr,@list);
1251
                        }
1252
 
1253
                        my $name_combo=gen_combo(\@list,$pos);
1254
                        my $sbox=def_hbox(FALSE,0);
1255
                        my $widget=gen_spin(1,31,1);
1256
                        my @l=("Fixed","Parameterizable");
1257
                        $pos=0;
1258
                        my $comb=gen_combo(\@l, $pos);
1259
                        $widget->set_value($saved_width);
1260
                        $sbox->pack_start($comb,FALSE,FALSE,3);
1261
                        $sbox->pack_end($widget,FALSE,FALSE,3);
1262
 
1263
                        $comb->signal_connect('changed'=>sub{
1264
                                my $condition=$comb->get_active_text();
1265
                                $widget->destroy;
1266
                                my @parameters=$ipgen->ipgen_get_all_parameters_list();
1267
                                $widget=($condition eq "Fixed" )? gen_spin(1,31,1):gen_combo(\@parameters, 0);
1268
                                $sbox->pack_end($widget,FALSE,FALSE,3);
1269
                                $sbox->show_all();
1270
                        });
1271
 
1272
 
1273
                        $table->attach_defaults($name_combo,2,5,$i+1,$i+2);
1274
                        $table->attach_defaults($sbox,5,6,$i+1,$i+2);
1275
                        $ok->signal_connect('clicked'=>sub{
1276
                                my $addr=$name_combo->get_active_text();
1277
                                my $in=$comb->get_active_text();
1278
                                my $width=($in eq "Fixed" )? $widget->get_value_as_int(): $widget->get_active_text() ;
1279
                                $ipgen->ipgen_save_wb_addr($plug,$num,$addr,$width);
1280
 
1281
                        });
1282
 
1283
 
1284
                }
1285
 
1286
 
1287
 
1288
        }
1289
 
1290
        while($i<7){
1291
                $i++;
1292
                my $tmp=gen_label_in_left('  ');
1293
                $table->attach_defaults($tmp,5,6,$i,$i+1);
1294
 
1295
        }
1296
 
1297
         $i=($i<7)? 7:$i;
1298
 
1299
 
1300
        my $mtable = def_table(10, 1, TRUE);
1301
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
1302
        $mtable->attach_defaults($okbox,0,1,9,10);
1303
 
1304
        $window->add ($mtable);
1305
        $window->show_all();
1306
 
1307
 
1308
 
1309
 
1310
         $ok->signal_connect('clicked'=>sub{
1311
                        $window->destroy;
1312
                        set_state($soc_state,"interface_selected",1);
1313
 
1314
                 } );
1315
 
1316
 
1317
 
1318
 
1319
}
1320
 
1321
 
1322
 
1323
 
1324
 
1325
 
1326
#############
1327
#  add_intfc_to_ip
1328
##############
1329
 
1330
 
1331
sub add_intfc_to_ip{
1332
        my ($intfc,$ipgen,$infc_name,$infc_type,$info,$soc_state)=@_;
1333
        if($infc_type eq 'socket'){
1334
                my ($connection_num,$connect_to)=$intfc->get_socket($infc_name);
1335
                $ipgen->ipgen_add_soket($infc_name,'num',1,$connection_num);
1336
        }
1337
        else { $ipgen->ipgen_add_plug($infc_name,'num',1);}
1338
        set_state($soc_state,"interface_selected",1);
1339
 
1340
}
1341
 
1342
 
1343
#################
1344
#       get_list_of_all_interfaces
1345
################
1346
 
1347
sub get_list_of_all_interfaces{
1348
        my ($ipgen)=@_;
1349
        my @sockets     =$ipgen->ipgen_list_sokets();
1350
        my @plugs       =$ipgen->ipgen_list_plugs();
1351
        my @interfaces=('IO');
1352
        my @interfaces_name=('IO');
1353
        foreach my $p( @sockets){
1354
                my ($type,$value)=  $ipgen->ipgen_get_socket($p);
1355
                if($type eq 'num'){
1356
                                for(my $i=0; $i<$value; $i++){
1357
                                        push(@interfaces,"socket:$p\[$i\]");
1358
                                        my $socket_name=$ipgen->ipgen_get_socket_name($p,$i);
1359
                                        push(@interfaces_name,"socket:$socket_name");
1360
                                }#for   
1361
 
1362
                }#if
1363
                else {
1364
                        push(@interfaces,"socket:$p\[array\]");
1365
                        my $socket_name=$ipgen->ipgen_get_socket_name($p,0);
1366
                        push(@interfaces_name,"socket:$socket_name");
1367
 
1368
 
1369
                }#else          
1370
 
1371
        }#foreach       
1372
        foreach my $p( @plugs){
1373
                my ($type,$value)=  $ipgen->ipgen_get_plug($p);
1374
                if($type eq 'num'){
1375
                                for(my $i=0; $i<$value; $i++){
1376
                                        push(@interfaces,"plug:$p\[$i\]");
1377
                                        my $plug_name=$ipgen->ipgen_get_plug_name($p,$i);
1378
                                        push(@interfaces_name,"plug:$plug_name");
1379
 
1380
                                }#for   
1381
 
1382
                }#if
1383
                else {
1384
                        my $plug_name=$ipgen->ipgen_get_plug_name($p,0);
1385
                        push(@interfaces,"plug:$p\[array\]");
1386
                        push(@interfaces_name,"plug:$plug_name");
1387
 
1388
 
1389
                }#else          
1390
 
1391
        }#foreach       
1392
        return (\@interfaces_name,\@interfaces);
1393
 
1394
}
1395
 
1396
sub gen_intfc_port_combo{
1397
        my ($intfc,$ipgen,$intfc_name,$porttype,$portname)=@_;
1398
 
1399
        my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
1400
        my @all_ports;
1401
        my @ports;
1402
 
1403
        if($type eq 'socket'){
1404
                @all_ports= $intfc->get_socket_port_list($name);
1405
                foreach my $p(@all_ports){
1406
                        my ($r,$t,$c)=$intfc->get_port_info_of_socket($name,$p);
1407
                        if ($t eq $porttype){ push (@ports,$p);}
1408
                }
1409
 
1410
        }elsif($type eq 'plug'){
1411
                @all_ports= $intfc->get_plug_port_list($name);
1412
 
1413
                foreach my $p(@all_ports){
1414
                        my ($r,$t,$c)=$intfc->get_port_info_of_plug($name,$p);
1415
                        #print "($t eq $porttype)\n";
1416
                        if ($t eq $porttype){ push (@ports,$p);}
1417
                }
1418
 
1419
        }
1420
        else  {
1421
                @ports=('IO');
1422
        }
1423
        my $saved_intfc_port=$ipgen->ipgen_get_port_intfc_port($portname);
1424
        my $pos=(defined $saved_intfc_port ) ? get_scolar_pos( $saved_intfc_port,@ports) : undef;
1425
        if (!defined $pos){
1426
                $pos=find_the_most_similar_position( $portname       ,@ports);
1427
                $ipgen->ipgen_set_port_intfc_port($portname,$ports[$pos]);
1428
                #print "$ports[$pos]\n;"
1429
        }
1430
        my $intfc_port_combo=gen_combo(\@ports,$pos);
1431
        $intfc_port_combo->signal_connect('changed'=> sub {
1432
                my $intfc_port=$intfc_port_combo->get_active_text();
1433
                $ipgen->ipgen_set_port_intfc_port($portname,$intfc_port);
1434
 
1435
        });
1436
 
1437
 
1438
        return  $intfc_port_combo;
1439
}
1440
 
1441
 
1442
 
1443
sub port_info_box {
1444
        my($intfc,$ipgen,$soc_state,$info)=@_;
1445
        my $table=def_table(8,10,TRUE);
1446
        my @ports=$ipgen->ipgen_list_ports;
1447
        my $row=0;
1448
        my ($name_ref,$ref)=get_list_of_all_interfaces($ipgen);
1449
        my @interfaces_name=@{$name_ref};
1450
        my @interfaces=@{$ref};
1451
        #print "@interfaces_name\n";
1452
 
1453
        $table->attach_defaults (gen_label_in_left(" Type "), 0, 1, $row, $row+1);
1454
        $table->attach_defaults (gen_label_in_left(" Port name "), 1, 3, $row, $row+1);
1455
        $table->attach_defaults (gen_label_in_left(" Interface name "), 3, 5, $row, $row+1);
1456
        $table->attach_defaults (gen_label_in_center(" Range "), 5, 7, $row, $row+1);
1457
        $table->attach_defaults (gen_label_in_left(" Interface port "), 7, 9, $row, $row+1);
1458
        $row++;
1459
        #print  @interfaces;
1460
        my @ports_order=$ipgen->ipgen_get_ports_order();
1461
        if(scalar(@ports_order) >1 ){ @ports= @ports_order}
1462
 
1463
 
1464
 
1465
 
1466
        foreach my $p( @ports){
1467
                my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1468
                #my $label_name=gen_label_in_left(" $p ");
1469
                my $name_entry=gen_entry($p);
1470
                my $label_type=gen_label_in_left(" $type ");
1471
                my $range_entry=gen_entry($range);
1472
                my $pos=(defined $intfc_name ) ? get_scolar_pos( $intfc_name,@interfaces) : 0;
1473
                if (!defined $pos){
1474
                        $pos=0;
1475
                        $ipgen->ipgen_set_port_intfc_name($p,'IO');
1476
                };
1477
                my $intfc_name_combo=gen_combo(\@interfaces_name,$pos);
1478
                my $intfc_port_combo=gen_intfc_port_combo($intfc,$ipgen,$intfc_name,$type,$p);
1479
 
1480
 
1481
                $table->attach_defaults ($label_type, 0, 1, $row, $row+1);
1482
                $table->attach_defaults ($name_entry, 1, 3, $row, $row+1);
1483
                $table->attach_defaults ($intfc_name_combo,3, 5, $row, $row+1);
1484
                $table->attach_defaults ($range_entry, 5, 7, $row, $row+1);
1485
                $table->attach_defaults ($intfc_port_combo,7, 9, $row, $row+1);
1486
                $intfc_name_combo->signal_connect('changed'=>sub{
1487
                        my $intfc_name=$intfc_name_combo->get_active_text();
1488
                        my $pos=  get_scolar_pos( $intfc_name,@interfaces_name);
1489
                        #my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
1490
                        #print "$type,$name,$num\n";
1491
                        $ipgen->ipgen_set_port_intfc_name($p,$interfaces[$pos]);
1492
                        set_state($soc_state,"interface_selected",1);
1493
                });
1494
                $range_entry->signal_connect('changed'=>sub{
1495
                        my $new_range=$range_entry->get_text();
1496
                        $ipgen->ipgen_add_port($p,$new_range,$type,$intfc_name,$intfc_port);
1497
                });
1498
 
1499
                $row++;
1500
        }
1501
 
1502
 
1503
 
1504
 
1505
        return $table;
1506
 
1507
 
1508
}
1509
 
1510
 
1511
 
1512
 
1513
 
1514
 
1515
sub generate_ip{
1516
        my $ipgen=shift;
1517
        my $name=$ipgen->ipgen_get_module_name();
1518
        my $category=$ipgen->ipgen_get_category();
1519
        my $ip_name= $ipgen->ipgen_get_ip_name();
1520
        #check if name has been set
1521
        if(defined ($name) && defined ($category)){
1522
                if (!defined $ip_name) {$ip_name= $name}
1523
                #check if any source file has been added for this ip
1524
                my @l=$ipgen->ipgen_get_hdl_files_list();
1525
                if( scalar @l ==0){
1526
                        my $mwindow;
1527
                        my $dialog = Gtk2::MessageDialog->new ($mwindow,
1528
                                      'destroy-with-parent',
1529
                                      'question', # message type
1530
                                      'yes-no', # which set of buttons?
1531
                                      "No hdl library file has been set for this IP. Do you want to generate this IP?");
1532
                        my $response = $dialog->run;
1533
                        if ($response eq 'yes') {
1534
                        # Write
1535
                                open(FILE,  ">lib/ip/$ip_name.IP") || die "Can not open: $!";
1536
                                print FILE Data::Dumper->Dump([\%$ipgen],[$name]);
1537
                                close(FILE) || die "Error closing file: $!";
1538
                                my $message="IP $ip_name has been generated successfully" ;
1539
                                message_dialog($message);
1540
                        }
1541
                        $dialog->destroy;
1542
 
1543
 
1544
                        #$dialog->show_all;
1545
 
1546
                }else{
1547
                        # Write
1548
                        open(FILE,  ">lib/ip/$ip_name.IP") || die "Can not open: $!";
1549
                        print FILE Data::Dumper->Dump([\%$ipgen],[$name]);
1550
                        close(FILE) || die "Error closing file: $!";
1551
                        my $message="IP $ip_name has been generated successfully" ;
1552
                        message_dialog($message);
1553
                }
1554
        }else{
1555
                my $message;
1556
                if(!defined ($name)){ $message="Input file has not been selected yet.\nNothing has been generated!" ;}
1557
                elsif(!defined ($category)){ $message="Category must be defined!" ;}
1558
                message_dialog($message);
1559
 
1560
        }
1561
#$hashref = retrieve('file');
1562
 
1563
 
1564
 
1565
return 1;
1566
}
1567
 
1568
 
1569
 
1570
 
1571
#########
1572
#
1573
########
1574
 
1575
sub load_ip{
1576
        my ($ipgen,$soc_state)=@_;
1577
        my $file;
1578
        my $dialog = Gtk2::FileChooserDialog->new(
1579
                'Select a File', undef,
1580
                'open',
1581
                'gtk-cancel' => 'cancel',
1582
                'gtk-ok'     => 'ok',
1583
                );
1584
 
1585
        my $filter = Gtk2::FileFilter->new();
1586
        $filter->set_name("IP");
1587
        $filter->add_pattern("*.IP");
1588
        $dialog->add_filter ($filter);
1589
        my $dir = Cwd::getcwd();
1590
        $dialog->set_current_folder ("$dir/lib/ip")     ;
1591
 
1592
 
1593
        if ( "ok" eq $dialog->run ) {
1594
                $file = $dialog->get_filename;
1595
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1596
                if($suffix eq '.IP'){
1597
                        $ipgen->ipgen_set_file($file);
1598
                        set_state($soc_state,"load_file",0);
1599
                }
1600
     }
1601
     $dialog->destroy;
1602
 
1603
 
1604
 
1605
}
1606
 
1607
 
1608
 
1609
 
1610
 
1611
 
1612
############
1613
#    main
1614
############
1615
sub ipgen_main{
1616
        my $ipgen=shift;
1617
        my $intfc=interface->interface_new();
1618
        if(!defined $ipgen) { $ipgen=ip_gen->ip_gen_new();}
1619
        #my $ipgen = eval { do 'lib/ip/wishbone_bus.IP' };
1620
        my $soc_state=  def_state("ideal");
1621
        # main window
1622
        #my $window = def_win_size(1000,800,"Top");
1623
        #  The main table containg the lib tree, selected modules and info section 
1624
        my $main_table = def_table (15, 12, TRUE);
1625
 
1626
        # The box which holds the info, warning, error ...  mesages
1627
        my ($infobox,$info)= create_text();
1628
 
1629
 
1630
        my $refresh_dev_win = Gtk2::Button->new_from_stock('ref');
1631
        my $generate = def_image_button('icons/gen.png','Generate');
1632
        my $genbox=def_hbox(TRUE,5);
1633
        $genbox->pack_start($generate,   FALSE, FALSE,3);
1634
 
1635
        # A tree view for holding a library
1636
        my $tree_box = create_interface_tree  ($info,$intfc,$ipgen,$soc_state);
1637
 
1638
 
1639
        my $file_info=show_file_info($ipgen,$soc_state,$info,\$refresh_dev_win);
1640
        my $port_info=show_port_info($intfc,$ipgen,$soc_state,$info,\$refresh_dev_win);
1641
        my $intfc_info=show_interface_info($intfc,$ipgen,$soc_state,$info,\$refresh_dev_win);
1642
 
1643
 
1644
        my $open = def_image_button('icons/browse.png','Load IP');
1645
        my $openbox=def_hbox(TRUE,0);
1646
        $openbox->pack_start($open,   FALSE, FALSE,0);
1647
 
1648
        $main_table->set_row_spacings (4);
1649
        $main_table->set_col_spacings (1);
1650
 
1651
        #my  $device_win=show_active_dev($soc,$lib,$infc,$soc_state,\$refresh_dev_win,$info);
1652
 
1653
 
1654
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
1655
        $main_table->attach_defaults ($tree_box , 0, 2, 0, 13);
1656
        $main_table->attach_defaults ($file_info , 2, 12, 0, 2);
1657
        $main_table->attach_defaults ($intfc_info , 2, 12, 2, 7);
1658
 
1659
        $main_table->attach_defaults ($port_info  , 2, 12, 7,13);
1660
        $main_table->attach_defaults ($infobox  , 0, 12, 13,14);
1661
        $main_table->attach_defaults ($genbox, 6, 8, 14,15);
1662
        $main_table->attach_defaults ($openbox,0, 1, 14,15);
1663
 
1664
        #check soc status every 0.5 second. referesh device table if there is any changes 
1665
Glib::Timeout->add (100, sub{
1666
 
1667
                my ($state,$timeout)= get_state($soc_state);
1668
                if($state eq "load_file"){
1669
                        my $file=$ipgen->ipgen_get_file();
1670
                        my $pp= eval { do $file };
1671
                        clone_obj($ipgen,$pp);
1672
 
1673
 
1674
                        set_state($soc_state,"ref",1);
1675
 
1676
 
1677
                }elsif ($timeout>0){
1678
                        $timeout--;
1679
                        set_state($soc_state,$state,$timeout);
1680
                }
1681
                elsif( $state eq "change_parameter" ){
1682
                        get_parameter_setting($ipgen,$soc_state,$info);
1683
                        set_state($soc_state,"ideal",0);
1684
 
1685
 
1686
 
1687
                }
1688
                elsif( $state ne "ideal" ){
1689
                        $refresh_dev_win->clicked;
1690
                        set_state($soc_state,"ideal",0);
1691
 
1692
 
1693
                }
1694
                return TRUE;
1695
 
1696
                } );
1697
        $open-> signal_connect("clicked" => sub{
1698
                load_ip($ipgen,$soc_state);
1699
 
1700
        });
1701
 
1702
        $generate-> signal_connect("clicked" => sub{
1703
                generate_ip($ipgen);
1704
 
1705
                $refresh_dev_win->clicked;
1706
 
1707
});
1708
 
1709
        #show_selected_dev($info,\@active_dev,\$dev_list_refresh,\$dev_table);
1710
 
1711
 
1712
 
1713
#$box->show;
1714
        #$window->add ($main_table);
1715
        #$window->show_all;
1716
        #return $main_table;
1717
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
1718
                $sc_win->set_policy( "automatic", "automatic" );
1719
                $sc_win->add_with_viewport($main_table);
1720
 
1721
        return $sc_win;
1722
 
1723
 
1724
}
1725
 

powered by: WebSVN 2.1.0

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