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 38

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 25 alirezamon
use File::Path qw/make_path/;
14 16 alirezamon
 
15
use Gtk2;
16
 
17
 
18
require "widget.pl";
19 25 alirezamon
require "readme_gen.pl";
20 16 alirezamon
 
21
 
22
 
23
 
24
use constant DISPLY_COLUMN    => 0;
25
use constant CATGR_COLUMN    => 1;
26
use constant INTFC_COLUMN     => 2;
27
use constant ITAL_COLUMN   => 3;
28
use constant NUM_COLUMN     => 4;
29
 
30
################
31
#  check_input_file
32
################
33
 
34
sub check_input_file{
35 25 alirezamon
        my ($file,$ipgen,$info)=@_;
36 16 alirezamon
        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
37
        if($suffix eq '.IP'){
38 24 alirezamon
                $ipgen->ipgen_add("file_name",$file);
39 25 alirezamon
                set_gui_status($ipgen,"load_file",0);
40 16 alirezamon
 
41
 
42
        }else{
43 25 alirezamon
                read_all_module ($file,$ipgen,$info);
44 16 alirezamon
 
45
        }
46
 
47
 
48
}
49
 
50
 
51
sub read_all_module{
52 25 alirezamon
        my ($file,$ipgen,$info)=@_;
53 16 alirezamon
 
54
        if (!defined $file) {return; }
55
        if (-e $file) {
56 34 alirezamon
                my $vdb =  read_verilog_file($file);
57 16 alirezamon
                my @modules=sort $vdb->get_modules($file);
58
                #foreach my $p(@module_list) {print "$p\n"}
59 24 alirezamon
                $ipgen->ipgen_add("file_name",$file);
60
 
61
 
62
 
63
                $ipgen->ipgen_add("module_name",$modules[0]);
64 16 alirezamon
                $ipgen->ipgen_set_module_list(@modules);
65 38 alirezamon
                load_default_setting($ipgen,$modules[0]);
66 16 alirezamon
 
67
 
68 25 alirezamon
                set_gui_status($ipgen,"file_selected",1);
69 16 alirezamon
                show_info(\$info,"Select the module which contain the interface ports\n ");
70
 
71
        }
72
        else {
73
                show_info(\$info,"File $file doese not exsit!\n ");
74
 
75
        }
76
}
77
 
78
 
79
##############
80
#       create_interface_tree 
81
##############
82
sub create_interface_tree {
83 25 alirezamon
   my ($info,$intfc,$ipgen)=@_;
84 16 alirezamon
   my $model = Gtk2::TreeStore->new ('Glib::String', 'Glib::String', 'Glib::Scalar', 'Glib::Boolean');
85
   my $tree_view = Gtk2::TreeView->new;
86
   $tree_view->set_model ($model);
87
   my $selection = $tree_view->get_selection;
88
 
89
   $selection->set_mode ('browse');
90 25 alirezamon
  # $tree_view->set_size_request (200, -1);
91 16 alirezamon
 
92
 
93
  # my @interface= $intfc->get_interfaces();
94
        my @categories= $intfc->get_categories();
95
 
96
 
97
 
98
   foreach my $p (@categories)
99
   {
100
        my @intfc_names=  $intfc->get_intfcs_of_category($p);
101
        #my @dev_entry=  @{$tree_entry{$p}};    
102
        my $iter = $model->append (undef);
103
        $model->set ($iter,
104
                   DISPLY_COLUMN,    $p,
105
                   CATGR_COLUMN, $p || '',
106
                   INTFC_COLUMN,     0     || '',
107
                   ITAL_COLUMN,   FALSE);
108
 
109
        next unless  @intfc_names;
110
 
111
        foreach my $v ( @intfc_names){
112
                 my $child_iter = $model->append ($iter);
113
                 my $entry= '';
114
 
115
                $model->set ($child_iter,
116
                                        DISPLY_COLUMN,    $v,
117
                        CATGR_COLUMN, $p|| '',
118
                        INTFC_COLUMN,     $v     || '',
119
                        ITAL_COLUMN,   FALSE);
120
        }
121
 
122
 
123
 
124
   }
125
 
126
   my $cell = Gtk2::CellRendererText->new;
127
   $cell->set ('style' => 'italic');
128
   my $column = Gtk2::TreeViewColumn->new_with_attributes
129 25 alirezamon
                                        ("Interfaces list",
130 16 alirezamon
                                        $cell,
131
                                        'text' => DISPLY_COLUMN,
132
                                        'style_set' => ITAL_COLUMN);
133
 
134
  $tree_view->append_column ($column);
135
  my @ll=($model,\$info);
136
#row selected
137
 
138
  $selection->signal_connect (changed =>sub {
139
        my ($selection, $ref) = @_;
140
        my ($model,$info)=@{$ref};
141
        my $iter = $selection->get_selected;
142
        return unless defined $iter;
143
 
144
        my ($category) = $model->get ($iter, CATGR_COLUMN);
145
        my ($name) = $model->get ($iter,INTFC_COLUMN );
146
        my $describ=$intfc->get_description($category,$name);
147
 
148
        if($describ){
149
                #print "$entry description is: $describ \n";
150
                show_info($info,$describ);
151
 
152
        }
153
 
154
 
155
}, \@ll);
156
 
157
#  row_activated 
158
  $tree_view->signal_connect (row_activated => sub{
159
 
160
        my ($tree_view, $path, $column) = @_;
161
        my $model = $tree_view->get_model;
162
        my $iter = $model->get_iter ($path);
163
        my ($category) = $model->get ($iter, CATGR_COLUMN);
164
        my ($name) = $model->get ($iter,INTFC_COLUMN );
165
 
166
 
167
 
168
        if($name){
169
                #print "$infc_name-$infc_type  is selected via row activaton!\n";
170 25 alirezamon
                add_intfc_to_ip($intfc,$ipgen,$name,'plug',\$info);
171 16 alirezamon
 
172
        }
173
 
174
}, \@ll);
175
 
176
  #$tree_view->expand_all;
177
 
178
  my $scrolled_window = Gtk2::ScrolledWindow->new;
179
  $scrolled_window->set_policy ('automatic', 'automatic');
180
  $scrolled_window->set_shadow_type ('in');
181
  $scrolled_window->add($tree_view);
182
 
183 25 alirezamon
  my $hbox = Gtk2::HBox->new (FALSE, 0);
184 16 alirezamon
  $hbox->pack_start ( $scrolled_window, TRUE, TRUE, 0);
185
 
186
 
187
 
188
  return $hbox;
189
}
190
 
191
 
192
 
193
sub save_ports_all{
194
        my ($ipgen,$vdb,$top_module)=@_;
195
 
196
        foreach my $sig (sort $vdb->get_modules_signals($top_module)) {
197
        my ($line,$a_line,$i_line,$type,$file,$posedge,$negedge,
198
         $type2,$s_file,$s_line,$range,$a_file,$i_file,$dims) =
199
           $vdb->get_module_signal($top_module,$sig);
200
 
201
                if($type eq "input" or $type eq "inout" or $type eq "output" ){
202
                        $ipgen->ipgen_add_port($sig,$range,$type,'IO','IO');
203
                        #print "$sig,$range,$type,'IO','IO'\n";
204
 
205
                }
206
 
207
 
208
        }
209
 
210
}
211
 
212
 
213
############
214
#       file_info
215
#############
216
 
217
sub ip_file_box {
218 25 alirezamon
        my ($ipgen,$info,$table,$row)=@_;
219 16 alirezamon
        my $label = gen_label_in_left(" Select file:");
220
        my $entry = Gtk2::Entry->new;
221
        #my $open= def_image_button("icons/select.png","Open");
222
        my $browse= def_image_button("icons/browse.png","Browse");
223 24 alirezamon
        my $file= $ipgen->ipgen_get("file_name");
224 16 alirezamon
        if(defined $file){$entry->set_text($file);}
225 25 alirezamon
 
226
 
227
 
228
        my $entry2=labele_widget_info(" IP name:",gen_entry_object($ipgen,'ip_name',undef,undef,undef,undef));
229
 
230
 
231
 
232 16 alirezamon
        show_info(\$info,"Please select the verilog file containig the ip module\n");
233
        $browse->signal_connect("clicked"=> sub{
234
                my $entry_ref=$_[1];
235
                my $file;
236
        my $dialog = Gtk2::FileChooserDialog->new(
237
                'Select a File', undef,
238
                'open',
239
                'gtk-cancel' => 'cancel',
240
                'gtk-ok'     => 'ok',
241
                );
242
 
243
                my $filter = Gtk2::FileFilter->new();
244
                        $filter->set_name("Verilog");
245
                        $filter->add_pattern("*.v");
246
                        my $filter2 = Gtk2::FileFilter->new();
247
                        $filter2->set_name("IP");
248
                        $filter2->add_pattern("*.IP");
249
                        $dialog->add_filter ($filter);
250
                        $dialog->add_filter ($filter2);
251
 
252
                if ( "ok" eq $dialog->run ) {
253
                        $file = $dialog->get_filename;
254
                                        $$entry_ref->set_text($file);
255 25 alirezamon
                                        check_input_file($file,$ipgen,$info);
256 16 alirezamon
                        #print "file = $file\n";
257
                 }
258
                $dialog->destroy;
259
 
260
 
261
 
262
        } , \$entry);
263
 
264
 
265
 
266 25 alirezamon
 
267 16 alirezamon
        $entry->signal_connect("activate"=>sub{
268
                my $file_name=$entry->get_text();
269 25 alirezamon
                check_input_file($file_name,$ipgen,$info);
270 16 alirezamon
        });
271
 
272
        $entry->signal_connect("changed"=>sub{
273
                show_info(\$info,"Please select the verilog file containig the interface\n");
274
        });
275 25 alirezamon
 
276 16 alirezamon
        $table->attach_defaults ($label, 0, 1 , $row, $row+1);
277
        $table->attach_defaults ($entry, 1, 8 , $row, $row+1);
278 25 alirezamon
        $table->attach ($browse, 8, 9, $row, $row+1,,'expand','shrink',2,2);
279
        $table->attach_defaults ($entry2,  9, 11, $row, $row+1);
280 16 alirezamon
 
281
 
282 25 alirezamon
 
283 16 alirezamon
}
284
 
285
 
286
 
287
 
288
sub select_module{
289 25 alirezamon
        my ($ipgen,$info,$table,$row)=@_;
290
 
291
 
292 16 alirezamon
        my @modules= $ipgen->ipgen_get_module_list();
293 24 alirezamon
        my $saved_module=$ipgen->ipgen_get("module_name");
294 16 alirezamon
        my $pos=(defined $saved_module ) ? get_scolar_pos( $saved_module,@modules) : 0;
295
        my $combo = gen_combo(\@modules, $pos);
296 25 alirezamon
        my $top_module=labele_widget_info("  Select\n module:",$combo);
297
 
298
 
299
 
300
 
301 16 alirezamon
        my $param= def_image_button("icons/setting.png","Parameter\n   setting");
302 17 alirezamon
        my $def= def_image_button("icons/setting.png","Definition\n file setting");
303 25 alirezamon
 
304
 
305
 
306
        #Category       
307
        my $ip = ip->lib_new ();
308
        my @categories= $ip->ip_get_categories();
309
        $ip =undef;
310 24 alirezamon
        my $saved_category=$ipgen->ipgen_get("category");
311 25 alirezamon
        if(defined $saved_category ){   push(@categories,$saved_category) if(!( grep /^$saved_category$/, @categories ));}
312
        my $content=join( ',', @categories);
313
        my $combentry=gen_comboentry_object ($ipgen,'category',undef,$content,$saved_category,undef,undef);
314
        my $category=labele_widget_info("  Select\n Category:",$combentry,"Select the IP category form the given list or you can add a new category.");
315
 
316
 
317
 
318
        my $ipinfo= def_image_button("icons/add_info.png","    IP\n Description");
319 17 alirezamon
        my $header_h= def_image_button("icons/h_file.png","Add Software\n      files");
320
        my $lib_hdl= def_image_button("icons/add-notes.png","Add HDL\n     files");
321 16 alirezamon
 
322 25 alirezamon
 
323
        #$table->attach_defaults ($top_module, 0, 1 , $row, $row+1);
324
        $table->attach ($top_module, 0, 4 , $row,$row+1,'fill','shrink',2,2);
325
        $table->attach ($param, 4, 6 , $row, $row+1,'expand','shrink',2,2);
326
 
327
        $table->attach ($category, 6, 8 , $row, $row+1,'expand','shrink',2,2);
328
        $table->attach ($ipinfo, 8, 9 , $row, $row+1,'expand','shrink',2,2);
329
        $table->attach ($header_h, 9, 10 , $row, $row+1,'expand','shrink',2,2);
330
        $table->attach ($lib_hdl, 10, 11 , $row, $row+1,'expand','shrink',2,2);
331 16 alirezamon
 
332
 
333
        $combo->signal_connect("changed"=> sub{
334
 
335
                my $module= $combo->get_active_text();
336 38 alirezamon
                load_default_setting($ipgen,$module);
337 25 alirezamon
                set_gui_status($ipgen,'intfc_changed',0);
338 16 alirezamon
 
339
 
340
        });
341
 
342
        $param->signal_connect("clicked"=> sub{
343 25 alirezamon
                get_parameter_setting($ipgen,$info);
344 16 alirezamon
 
345
 
346
        });
347 17 alirezamon
 
348
        $def->signal_connect("clicked"=> sub{
349 25 alirezamon
                get_def_setting($ipgen,$info);
350 17 alirezamon
 
351
 
352
        });
353 25 alirezamon
 
354 16 alirezamon
        $ipinfo->signal_connect("clicked"=> sub{
355 25 alirezamon
                get_Description($ipgen,$info);
356 16 alirezamon
 
357
        });
358
        $header_h->signal_connect("clicked"=> sub{
359 24 alirezamon
                my %page_info;
360
                my $help1="The files and folder that selected here will be copied in genertated processing tile SW folder.";
361 38 alirezamon
                my $help2="The file listed here can contain some variable with \${var_name} format. The file genertor will replace them with their values during file generation. The variable can be selected from above listed global vairables";
362 24 alirezamon
                my $help3='Define the header file for this peripheral device. You can use global vriables listed at the top.
363
 
364
header file example
365
 
366
 #define ${IP}_REG_0   (*((volatile unsigned int *) ($BASE)))
367
 #define ${IP}_REG_1   (*((volatile unsigned int *) ($BASE+4)))
368
 
369
 
370
 #define ${IP}_WRITE_REG1(value)  ${IP}_REG_1=value
371
 #define ${IP}_READ_REG1()      ${IP}_REG_1
372
  ';
373
 
374
                $page_info{0}{page_name} = "_Add exsiting file/folder";
375
                $page_info{0}{filed_name}= "sw_files";
376
                $page_info{0}{filed_type}= "exsiting_file/folder";
377
                $page_info{0}{rename_file}=undef;
378
                $page_info{0}{folder_en}=1;
379
                $page_info{0}{help}=$help1;
380
 
381 38 alirezamon
                $page_info{1}{page_name} = "_Add files contain variables";
382 24 alirezamon
                $page_info{1}{filed_name}= "gen_sw_files";
383 38 alirezamon
                $page_info{1}{filed_type}= "file_with_variables";
384 24 alirezamon
                $page_info{1}{rename_file}=1;
385
                $page_info{1}{folder_en}=0;
386
                $page_info{1}{help}=$help2;
387
 
388 38 alirezamon
                $page_info{2}{page_name} = "_Add to tile.h";
389 24 alirezamon
                $page_info{2}{filed_name}= "system_h";
390
                $page_info{2}{filed_type}= "file_content";
391
                $page_info{2}{rename_file}=undef;
392
                $page_info{2}{folder_en}=0;
393
                $page_info{2}{help}=$help3;
394
 
395
 
396 25 alirezamon
                get_source_file($ipgen,$info,0,"Add software file(s)","SW",\%page_info);
397
                #get_software_file($ipgen,$info,0);             
398 16 alirezamon
 
399
        });
400
        $lib_hdl->signal_connect("clicked"=> sub{
401 24 alirezamon
                my $help1="The files and folder that selected here will be copied in genertated processing tile RTL  folder.";
402 38 alirezamon
                my $help2="The file listed here can contain some variable with \${var_name} format. The file genertor will replace them with their values during file generation. The variable can be selected from above listed global vairables";
403 24 alirezamon
                my %page_info;
404
                $page_info{0}{page_name} = "_Add exsiting HDL file/folder";
405
                $page_info{0}{filed_name}= "hdl_files";
406
                $page_info{0}{filed_type}= "exsiting_file/folder";
407
                $page_info{0}{rename_file}=undef;
408
                $page_info{0}{folder_en}=1;
409
                $page_info{0}{help}=$help1;
410
 
411 38 alirezamon
                $page_info{1}{page_name} = "_Add files contain variables";
412
                $page_info{1}{filed_name}= "gen_hw_files";
413
                $page_info{1}{filed_type}= "file_with_variables";
414
                $page_info{1}{rename_file}=1;
415
                $page_info{1}{folder_en}=0;
416
                $page_info{1}{help}=$help2;
417
 
418 25 alirezamon
                get_source_file($ipgen,$info,0,"Add HDL file(s)", "hw",\%page_info);
419 24 alirezamon
 
420 25 alirezamon
                #get_hdl_file($ipgen,$info);
421 24 alirezamon
 
422 16 alirezamon
 
423
        });
424
}
425
 
426 38 alirezamon
sub load_default_setting{
427 16 alirezamon
        my ($ipgen,$module)=@_;
428 24 alirezamon
        my $file= $ipgen->ipgen_get("file_name");
429
        $ipgen->ipgen_add("module_name",$module);
430 34 alirezamon
        my $vdb =read_verilog_file($file);
431 16 alirezamon
        my %parameters = $vdb->get_modules_parameters_not_local($module);
432
        my @parameters_order= $vdb->get_modules_parameters_not_local_order($module);
433
        my @ports_order=$vdb->get_module_ports_order($module);
434
        #print "@port_order\n";
435
 
436 38 alirezamon
        #add default parameter setting
437 16 alirezamon
        $ipgen->ipgen_remove_all_parameters();
438
        foreach my $p (keys %parameters){
439
                        #print "$p\n";
440
                        my $v = $parameters{$p};
441
                        $v =~s/[\n]//gs;
442 25 alirezamon
                        $ipgen->ipgen_add_parameter($p,$v,'Fixed','','Parameter',1);
443 16 alirezamon
 
444
        }
445
        #add parameter order. 
446 24 alirezamon
        $ipgen->ipgen_add("parameters_order",\@parameters_order);
447 16 alirezamon
        #add port order.
448
        $ipgen->ipgen_add_ports_order(@ports_order);
449
        #add ports 
450
        $ipgen->ipgen_remove_all_ports();
451
        save_ports_all($ipgen,$vdb,$module);
452
 
453
 
454
 
455
}
456
 
457
sub file_info_box {
458 25 alirezamon
        my($ipgen,$info)=@_;
459 16 alirezamon
        my $table=def_table(2,11,FALSE);
460 17 alirezamon
        my $table1=def_table(1,11,FALSE);
461
        my $table2=def_table(1,11,FALSE);
462 25 alirezamon
        ip_file_box ($ipgen,$info,$table1,0);
463
        select_module($ipgen,$info,$table2,0);
464 17 alirezamon
        $table->attach_defaults($table1,0,11,0,1);
465
        $table->attach_defaults($table2,0,11,1,2);
466 16 alirezamon
        return $table;
467
 
468
 
469
}
470
 
471
 
472
 
473
 
474
sub show_file_info{
475 25 alirezamon
        my($ipgen,$info,$refresh_ref)=@_;
476
        my $table = file_info_box($ipgen,$info,$info);
477 16 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
478
        $scrolled_win->set_policy( "automatic", "never" );
479
        $scrolled_win->add_with_viewport($table);
480
 
481
 
482
 
483
        $$refresh_ref-> signal_connect("clicked" => sub{
484
                $table->destroy;
485 25 alirezamon
                $table = file_info_box($ipgen,$info,$info);
486 16 alirezamon
 
487
                $scrolled_win->add_with_viewport($table);
488
                $table->show;
489
                $scrolled_win->show_all;
490 24 alirezamon
 
491 16 alirezamon
 
492
 
493
        });
494
 
495
        return $scrolled_win;
496
 
497
 
498
 
499
}
500
 
501
 
502
sub show_port_info{
503 25 alirezamon
        my($intfc,$ipgen,$info,$refresh_ref)=@_;
504
        my $table = port_info_box($intfc,$ipgen,$info,$info);
505 16 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
506
        $scrolled_win->set_policy( "automatic", "automatic" );
507
        $scrolled_win->add_with_viewport($table);
508
 
509
 
510
 
511
        $$refresh_ref-> signal_connect("clicked" => sub{
512
                $table->destroy;
513 25 alirezamon
                $table = port_info_box($intfc,$ipgen,$info,$info);
514 16 alirezamon
 
515
                $scrolled_win->add_with_viewport($table);
516
                $table->show;
517
                $scrolled_win->show_all;
518
 
519
 
520
 
521
 
522
        });
523
 
524
        return $scrolled_win;
525
 
526
}
527
 
528
 
529
sub show_interface_info{
530 25 alirezamon
        my($intfc,$ipgen,$info,$refresh_ref)=@_;
531
        my $table = interface_info_box($intfc,$ipgen,$info,$info);
532 16 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
533
        $scrolled_win->set_policy( "automatic", "automatic" );
534
        $scrolled_win->add_with_viewport($table);
535
 
536
 
537
 
538
        $$refresh_ref-> signal_connect("clicked" => sub{
539
                $table->destroy;
540 22 alirezamon
                select(undef, undef, undef, 0.1); #wait 10 ms
541 25 alirezamon
                $table = interface_info_box($intfc,$ipgen,$info,$info);
542 16 alirezamon
 
543
                $scrolled_win->add_with_viewport($table);
544
                $table->show;
545
                $scrolled_win->show_all;
546
 
547
 
548
        });
549
 
550
        return $scrolled_win;
551
 
552
 
553
 
554
}
555
 
556
 
557
 
558
 
559
 
560
 
561
 
562
 
563
############
564
#  get_parameter_setting
565
##########
566
sub get_parameter_setting {
567 25 alirezamon
        my ($ipgen,$info)=@_;
568 16 alirezamon
 
569 25 alirezamon
 
570 24 alirezamon
        my $file= $ipgen->ipgen_get("file_name");
571 16 alirezamon
        if (!defined $file) {
572
                        message_dialog("The input verilog file is empty");
573
                        return;
574
 
575
        }
576 25 alirezamon
        my $module = $ipgen->ipgen_get("module_name");
577 16 alirezamon
 
578
 
579 34 alirezamon
        my $window =  def_popwin_size(85,50,"Define parameters detail",'percent');
580 16 alirezamon
 
581
 
582
 
583 34 alirezamon
 
584 16 alirezamon
        my @widget_type_list=("Fixed","Entry","Combo-box","Spin-button");
585 25 alirezamon
        my @param_type_list=("Parameter","Localparam","Don't include");
586 16 alirezamon
        my $type_info="Define the parameter type:
587 17 alirezamon
 
588
Fixed: The parameter is fixed and get the default value. Users can not see or change the parameter value.
589
 
590
Entry: The parameter value is received via entry. The user can type anything.
591
 
592
Combo-box: The parameter value can be selected from a list of predefined value.
593
 
594
Spin-button: The parameter is numeric and will be obtained using spin button.";
595 16 alirezamon
        my $content_info='
596
For Fixed and Entry leave it empty.
597
For Combo box define the parameters which must be shown in combo box as: "PAEAMETER1","PARAMETER2"...,"PARAMETERn".
598
For Spin button define it as "minimum, maximum, step" e.g 0,10,1.';
599 25 alirezamon
        my $param_info='Define how parameter is included in the top module containig this IP core.';
600 16 alirezamon
 
601
        my $redefine_info='
602
        If checked, the defined parameter/localparam in SoC will be passed to the IP core';
603
 
604
        #TABLE
605
        my $table = Gtk2::Table->new (12, 8, FALSE);
606
        my @positions=(0,1,2,3,4,5,6,7,8);
607
        my $col=0;
608
        #title
609
        my @title;
610
        $title[0]=gen_label_in_center("Parameter name");
611 38 alirezamon
        $title[1]=gen_label_in_center("Default value");
612 16 alirezamon
        $title[2]=gen_label_help($type_info,"Widget type");
613
        $title[3]=gen_label_help($content_info,"Widget content");
614 38 alirezamon
        $title[4]=gen_label_help($param_info,"Type");
615
        $title[5]=gen_label_help($redefine_info,"");
616 16 alirezamon
        $title[6]=gen_label_help("You can add aditional information about this parameter.","info");
617
        $title[7]=gen_label_in_center("add/remove");
618
 
619
 
620
        foreach my $t (@title){
621 25 alirezamon
                $table->attach ($title[$col], $positions[$col], $positions[$col+1], 0, 1,'expand','shrink',2,2); $col++;
622 16 alirezamon
 
623
        }
624
 
625
 
626
 
627
 
628
 
629
 
630 25 alirezamon
 
631 16 alirezamon
 
632
        my @parameters=$ipgen->ipgen_get_all_parameters_list();
633 24 alirezamon
        my @params_order= $ipgen->ipgen_get_list("parameters_order");
634 16 alirezamon
        if((@params_order)) {@parameters=@params_order;}
635
 
636
        my $ok = def_image_button('icons/select.png','OK');
637 25 alirezamon
 
638 16 alirezamon
 
639
        my ($b,$new_param)= def_h_labeled_entry("Add new parameter name:");
640
        my $add = def_image_button('icons/plus.png','Add parameter');
641
        my $addbox=def_hbox(FALSE,0);
642
        $addbox->pack_start($b,FALSE, FALSE,0);
643
        $addbox->pack_start($add,   FALSE, FALSE,0);
644
 
645
        my @allowed;
646
 
647
        my $row=1;
648 34 alirezamon
        my $error;
649 16 alirezamon
        push(@parameters,"#new#");
650
        foreach my $p (@parameters) {
651 38 alirezamon
                my ($saved_default,$saved_widget_type,$saved_content,$saved_info,$vfile_param_type,$redefine_param)=  $ipgen->ipgen_get_parameter_detail($p);
652
                #print  "($saved_default,$saved_type,$saved_content)\n";
653 16 alirezamon
                my $parameter_box = def_hbox(TRUE,5);
654
                my $param_name;
655
                my $add_remove;
656
                if($p ne "#new#"){
657
                        $param_name= def_label($p);
658
                        $add_remove=def_image_button("icons/cancel.png","remove");
659
                } else {
660
                        $param_name= gen_entry();
661
                        $add_remove=def_image_button("icons/plus.png","add");
662
                }
663
 
664 38 alirezamon
                my $default_entry= gen_entry($saved_default);
665 16 alirezamon
                my $pos=(defined $saved_widget_type ) ? get_scolar_pos( $saved_widget_type,@widget_type_list) : 0;
666
                my $widget_type_combo=gen_combo(\@widget_type_list, $pos);
667
                my $content_entry= gen_entry($saved_content);
668 25 alirezamon
 
669
 
670
 
671
                $vfile_param_type= "Don't include" if (!defined $vfile_param_type );
672
                $vfile_param_type= "Parameter"  if ($vfile_param_type eq 1);
673
                $vfile_param_type= "Localparam" if ($vfile_param_type eq 0);
674
                $pos=get_scolar_pos($vfile_param_type,@param_type_list);
675
                my $check_param= gen_combo(\@param_type_list, $pos);
676
 
677
 
678
                #$check_param->set_active($vfile_param_type) if(defined $vfile_param_type );
679 16 alirezamon
                my $check_redefine= Gtk2::CheckButton->new('Redefine');
680
                $check_redefine->set_active(1) ;
681
                $check_redefine->set_active($redefine_param) if(defined $redefine_param );
682
 
683
 
684
 
685
 
686
 
687
                #my $check= Gtk2::CheckButton->new;
688 25 alirezamon
                #$check->set_active($vfile_param_type) if(defined $vfile_param_type );
689 16 alirezamon
 
690
 
691 25 alirezamon
                my $info=def_image_button("icons/add_info.png");
692
                #print "\$vfile_param_type =$vfile_param_type\n";
693 16 alirezamon
 
694
                $col=0;
695 38 alirezamon
                my @all_widget=($param_name,$default_entry,$widget_type_combo,$content_entry,$check_param,$check_redefine,$info,$add_remove);
696 16 alirezamon
                foreach my $t (@all_widget){
697 25 alirezamon
                        $table->attach ($t, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
698 16 alirezamon
 
699
                }
700
 
701
 
702
                $info->signal_connect (clicked => sub{
703
 
704
                        get_param_info($ipgen,\$saved_info);
705
                });
706
 
707
 
708
                $ok->signal_connect (clicked => sub{
709
                        if($p ne "#new#"){
710 38 alirezamon
                                my $default=$default_entry->get_text();
711 16 alirezamon
                                my $type= $widget_type_combo->get_active_text();
712
                                my $content=$content_entry->get_text();
713 25 alirezamon
                                my $vfile_param_type=$check_param->get_active_text();
714
                                my $check_result=$check_redefine->get_active();
715 16 alirezamon
                                my $redefine_param=($check_result eq 1)? 1:0;
716 38 alirezamon
                                $ipgen->ipgen_add_parameter($p,$default,$type,$content,$saved_info,$vfile_param_type,$redefine_param);
717 34 alirezamon
 
718
                                if      ($type eq "Spin-button"){
719
                                        my @d=split(",",$content);
720
                                         if( scalar @d != 3){
721
                                                $error=$error."wrong content setting for parameter $p\n" ;
722
                                                print "$error";
723
                                        }
724
                                }
725
 
726
 
727 16 alirezamon
                        }
728
                });
729
                $add_remove->signal_connect (clicked => sub{
730
                        if($p eq "#new#"){ #add new parameter
731
                                my $param= $param_name->get_text();
732 18 alirezamon
                                $param=remove_all_white_spaces($param);
733 16 alirezamon
 
734
                                if( length($param) ){
735 38 alirezamon
                                        my $default=$default_entry->get_text();
736 16 alirezamon
                                        my $type=$widget_type_combo->get_active_text();
737
                                        my $content=$content_entry->get_text();
738 25 alirezamon
                                        my $vfile_param_type=$check_param->get_active_text();
739
                                        my $check_result=$check_redefine->get_active();
740 16 alirezamon
                                        my $redefine_param=($check_result eq 1)? 1:0;
741 38 alirezamon
                                        $ipgen->ipgen_add_parameter($param,$default,$type,$content,$saved_info,$vfile_param_type,$redefine_param);
742 16 alirezamon
                                        $ipgen->ipgen_push_parameters_order($param);
743 25 alirezamon
                                        set_gui_status($ipgen,"change_parameter",0);
744 16 alirezamon
                                        $ok->clicked;
745
                                        #$window->destroy();
746
                                }
747
 
748
                        } else { #remove the parameter
749
                                $ipgen->ipgen_remove_parameter($p);
750
                                $ipgen->ipgen_remove_parameters_order($p);
751 34 alirezamon
                                $p = "#new#";
752 25 alirezamon
                                set_gui_status($ipgen,"change_parameter",0);
753 16 alirezamon
                                $ok->clicked;
754
                                        #$window->destroy();
755
 
756
                        }
757
                        #my $param_name=$new_param->get_text();
758
                        #       if( length($param_name) ){
759
                        #               print "$param_name\n";
760
                        #               $ipgen->ipgen_add_parameter($param_name,undef);
761 25 alirezamon
                        #               set_gui_status($ipgen,"change_parameter",0);
762 16 alirezamon
                        #               $window->destroy();
763
 
764
                });
765
 
766
 
767
 
768
        $row++;
769
        }
770 25 alirezamon
 
771 16 alirezamon
 
772 25 alirezamon
 
773
 
774 16 alirezamon
 
775 25 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
776
        $scrolled_win->set_policy( "automatic", "automatic" );
777
        $scrolled_win->add_with_viewport($table);
778 16 alirezamon
 
779 25 alirezamon
 
780
 
781
 
782
 
783
 
784
 
785
 
786 16 alirezamon
        $add->signal_connect (clicked => sub{
787
                my $param_name=$new_param->get_text();
788
                if( length($param_name) ){
789
                        #print "$param_name\n";
790
                        $ipgen->ipgen_add_parameter($param_name,undef);
791 25 alirezamon
                        set_gui_status($ipgen,"change_parameter",0);
792 16 alirezamon
                        $window->destroy();
793
                }
794
 
795
#/*******************************************************************************************************************************/
796
 
797
        });
798
 
799
        $ok->signal_connect (clicked => sub{
800 34 alirezamon
 
801
 
802
 
803
 
804 16 alirezamon
 
805 34 alirezamon
 
806
                if (defined $error){
807
                        message_dialog("$error");
808
                        $error=undef;
809
                }else {
810
                        $window->destroy();
811
                }
812 16 alirezamon
 
813
        });
814
 
815 25 alirezamon
        my $mtable = def_table(10, 1, FALSE);
816
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
817
        $mtable->attach($ok,0,1,9,10,'expand','shrink',2,2);
818 16 alirezamon
 
819 25 alirezamon
        $window->add ($mtable);
820
        $window->show_all();
821 16 alirezamon
 
822
 
823 25 alirezamon
 
824 16 alirezamon
}
825
 
826 17 alirezamon
 
827
 
828
 
829
############
830
#  get_def_setting
831
##########
832
sub get_def_setting {
833 25 alirezamon
        my ($ipgen,$info)=@_;
834 17 alirezamon
        my $table = Gtk2::Table->new (15, 15, TRUE);
835
        my $table2 = Gtk2::Table->new (15, 15, TRUE);
836 34 alirezamon
        my $window =  def_popwin_size(70,70,"Add definition file",'percent');
837 17 alirezamon
        my $ok=def_image_button("icons/select.png",' Ok ');
838
        my $scrwin=  new Gtk2::ScrolledWindow (undef, undef);
839
        $scrwin->set_policy( "automatic", "automatic" );
840
        $scrwin->add_with_viewport($table2);
841
 
842
        my $label=gen_label_help("You ","Selecet the Verilog file containig the definitions.");
843
        my $brows=def_image_button("icons/browse.png",' Browse');
844
        $table->attach_defaults($label,0,10,0,1);
845 25 alirezamon
        $table->attach($brows,10,12,1,2,'expand','shrink',2,2);
846 17 alirezamon
        $table->attach_defaults($scrwin,0,15,2,14);
847 25 alirezamon
        $table->attach($ok,6,9,14,15,'expand','shrink',2,2);
848 17 alirezamon
 
849
        $window->add($table);
850
        $window->show_all;
851
 
852
 
853
}
854
 
855
 
856 16 alirezamon
###########
857
#       get description
858
#########
859
 
860
sub get_Description{
861 25 alirezamon
        my ($ipgen,$info)=@_;
862 24 alirezamon
        my $description = $ipgen->ipgen_get("description");
863 25 alirezamon
        my $table = Gtk2::Table->new (15, 15, FALSE);
864 34 alirezamon
        my $window =  def_popwin_size(40,40, "Add description",'percent');
865 16 alirezamon
        my ($scrwin,$text_view)=create_text();
866
        #my $buffer = $textbox->get_buffer();
867
        my $ok=def_image_button("icons/select.png",' Ok ');
868 34 alirezamon
        $table->attach_defaults(gen_label_help("User can open the PDF file when oppening IP parameter setting","IP Documentation file in PDF"),0,7,0,1);
869
        $table->attach_defaults(gen_label_help("Description will be shown on IP generator text view when selecting this IP","Short Description"),5,10,1,2);
870
        $table->attach_defaults(get_file_name_object ( $ipgen, 'description_pdf',undef,"pdf",undef),7,15,0,1);
871
        $table->attach_defaults($scrwin,0,15,2,14);
872 25 alirezamon
        $table->attach($ok,6,9,14,15,'expand','shrink',2,2);
873 16 alirezamon
        my $text_buffer = $text_view->get_buffer;
874
        if(defined $description) {$text_buffer->set_text($description)};
875
 
876
        $ok->signal_connect("clicked"=> sub {
877
                $window->destroy;
878
 
879
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
880 24 alirezamon
                 $ipgen->ipgen_add("description",$text);
881 16 alirezamon
                #print "$text\n";
882
 
883
        });
884
 
885
        $window->add($table);
886
        $window->show_all();
887
 
888
}
889
 
890
 
891
 
892
 
893
 
894
 
895
##########
896 24 alirezamon
#       gen_file_list
897 16 alirezamon
#########
898
 
899
sub gen_file_list{
900 24 alirezamon
        my ($ipgen,$list_name,$window,$rename_file_en)=@_;
901 16 alirezamon
 
902
 
903 25 alirezamon
        my $table=def_table(10,10,FALSE);#      my ($row,$col,$homogeneous)=@_;
904 16 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
905 24 alirezamon
        my $ok=def_image_button("icons/select.png",' Ok ');
906
 
907 16 alirezamon
        $scrolled_win->set_policy( "automatic", "automatic" );
908
        $scrolled_win->add_with_viewport($table);
909 25 alirezamon
        $table->attach  (gen_label_in_center("File path"), 0, 5 , 0, 1,'expand','shrink',2,2);
910
        $table->attach (gen_label_help("The target name can contain any of Global variables e.g \$IP\$.h","Copy as"), 5, 9 , 0, 1,'expand','shrink',2,2) if(defined $rename_file_en);
911 16 alirezamon
        my $col=0;
912 24 alirezamon
        my $row=1;
913
        my @files=  $ipgen->ipgen_get_list($list_name); #@{$ref};
914
        my $file_num= scalar @files;
915 16 alirezamon
        foreach my $p(@files){
916 24 alirezamon
                        my ($path,$rename)=split('frename_sep_t',$p);
917
                        my $entry=gen_entry($path);
918
                        my $entry2=gen_entry($rename) ;
919
                        my $remove=def_image_button("icons/cancel.png");
920 25 alirezamon
                        $table->attach  ($entry, 0, 5 , $row, $row+1,'fill','shrink',2,2);
921
                        $table->attach  ($entry2, 5, 9 , $row, $row+1,'fill','shrink',2,2) if(defined $rename_file_en);
922
                        $table->attach ($remove, 9,10 , $row, $row+1,'expand','shrink',2,2);
923 24 alirezamon
                        $row++;
924
                        $remove->signal_connect("clicked"=> sub {
925
                                my @saved_files=$ipgen->ipgen_get_list($list_name);
926
                                @saved_files=remove_scolar_from_array(\@saved_files,$p);
927
                                $ipgen->ipgen_add($list_name,\@saved_files);
928
                                $entry->destroy;
929
                                $entry2->destroy if(defined $rename_file_en);
930
                                $remove->destroy;
931 16 alirezamon
 
932 24 alirezamon
                        });
933
                        $ok->signal_connect("clicked"=> sub {
934
                                if(defined $entry){
935
                                        my $n= $entry->get_text();
936
                                           if(defined $rename_file_en){
937
                                                $n= $n.'frename_sep_t'.$entry2->get_text() ;
938
                                           }
939
                                        if($p ne $n){
940
                                                my @saved_files=$ipgen->ipgen_get_list($list_name);
941
                                                @saved_files=replace_in_array(\@saved_files,$p, $n);
942
                                                $ipgen->ipgen_add($list_name,\@saved_files);
943
                                        }
944
 
945 16 alirezamon
                                }
946
 
947
 
948
 
949 24 alirezamon
                        });
950 16 alirezamon
 
951 24 alirezamon
                        #my $seph = Gtk2::HSeparator->new;
952
                        #$table->attach_defaults ($seph, 0, 10 , $row, $row+1);
953
                        #$row++;                
954
 
955 16 alirezamon
        }
956
 
957
 
958
 
959 24 alirezamon
        $ok->signal_connect("clicked"=> sub {
960
                $window->destroy;
961
        });
962
 
963 16 alirezamon
#   while( $row<10){
964
        #       my $label=gen_label_in_left(' ');
965
           # $table->attach_defaults ($label, 0, 1 , $row, $row+1);$row++;
966
        #}
967
 
968 24 alirezamon
 
969
        return ($scrolled_win,$ok);
970 16 alirezamon
}
971
 
972
 
973
 
974
sub get_param_info{
975
        my ($ipgen,$saved_info)=@_;
976 25 alirezamon
        my $table = Gtk2::Table->new (15, 15, FALSE);
977 34 alirezamon
        my $window =  def_popwin_size(50,50,"Add description",'percent');
978 16 alirezamon
        my ($scrwin,$text_view)=create_text();
979
        my $ok=def_image_button("icons/select.png",' Ok ');
980
 
981
        $table->attach_defaults($scrwin,0,15,0,14);
982 25 alirezamon
        $table->attach($ok,6,9,14,15,'expand','shrink',2,2);
983 16 alirezamon
        my $text_buffer = $text_view->get_buffer;
984
        if(defined $$saved_info) {$text_buffer->set_text($$saved_info)};
985
 
986
        $ok->signal_connect("clicked"=> sub {
987
                $window->destroy;
988
 
989
                 $$saved_info = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
990
 
991
 
992
        });
993
 
994
        $window->add($table);
995
        $window->show_all();
996
 
997
 
998
}
999
 
1000
 
1001
 
1002
sub interface_info_box {
1003 25 alirezamon
        my($intfc,$ipgen,$info)=@_;
1004
        my $table=def_table(7,7,FALSE);
1005 16 alirezamon
        my @sokets=$ipgen->ipgen_list_sokets;
1006
        my @plugs=$ipgen->ipgen_list_plugs;
1007
 
1008
        my @positions=(0,1,2,4,5,6,7);
1009
 
1010
 
1011
        my $row=0;
1012
        my $col=0;
1013 25 alirezamon
        $table->attach (gen_label_in_center(" Interface name"), $positions[0], $positions[1], $row, $row+1,'expand','shrink',2,2);
1014
        $table->attach (gen_label_in_center("Type"), $positions[1], $positions[2], $row, $row+1,'expand','shrink',2,2);
1015
        $table->attach (gen_label_in_left("Interface Num"), $positions[2], $positions[3], $row, $row+1,'expand','shrink',2,2);
1016 16 alirezamon
 
1017
        $row++;
1018
        my @type_list=('plug','socket');
1019
 
1020
        foreach my $p( @sokets){
1021
                #my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1022
                my ($type,$value,$connection_num)= $ipgen->ipgen_get_socket($p);
1023
                my $label_name=gen_label_in_center($p);
1024
                my $combo_type=gen_combo(\@type_list,1);
1025
                my $remove=     def_image_button('icons/cancel.png','Remove');
1026
                my $name_setting=def_image_button('icons/setting.png');
1027
                $remove->signal_connect ('clicked'=> sub{
1028
                        $ipgen->ipgen_remove_socket($p);
1029 25 alirezamon
                        set_gui_status($ipgen,'intfc_changed',0);
1030 16 alirezamon
 
1031
                        }  );
1032
                $name_setting->signal_connect ('clicked'=> sub{
1033 25 alirezamon
                        get_intfc_setting($ipgen,$p,'socket');
1034 16 alirezamon
 
1035
 
1036
                });
1037
                $combo_type     ->signal_connect ('changed'=> sub{
1038
                        $ipgen->ipgen_remove_socket($p);
1039 25 alirezamon
                        add_intfc_to_ip($intfc,$ipgen,$p,'plug',$info);
1040 16 alirezamon
 
1041
                        }  );
1042 25 alirezamon
                $table->attach ($remove, $positions[4], $positions[5], $row, $row+1,'expand','shrink',2,2);
1043
 
1044
 
1045 16 alirezamon
                if ($type eq 'num'){
1046
                        my ($type_box,$type_spin)=gen_spin_help ('Define the number of this interface in module', 1,1024,1);
1047
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1048
                        $type_spin->set_value($value);
1049
                        my $advance_button=def_image_button('icons/advance.png','separate');
1050 25 alirezamon
                        $table->attach ($type_box, $positions[2], $positions[3], $row, $row+1,'expand','shrink',2,2);
1051
                        $table->attach ($advance_button, $positions[3], $positions[4], $row, $row+1,'expand','shrink',2,2);
1052 24 alirezamon
                        $type_spin->signal_connect("value_changed"=>sub{
1053 16 alirezamon
                                my $wiget=shift;
1054
                                my $num=$wiget->get_value_as_int();
1055
                                $ipgen->ipgen_add_soket($p,'num',$num);
1056 25 alirezamon
                                set_gui_status($ipgen,'intfc_changed',0);
1057 16 alirezamon
 
1058
                        });
1059
                        $advance_button->signal_connect("clicked"=>sub{
1060
                                $ipgen->ipgen_add_soket($p,'param');
1061 25 alirezamon
                                set_gui_status($ipgen,'intfc_changed',0);
1062 16 alirezamon
 
1063
                        });
1064
 
1065
                }
1066
                else {
1067
                        my @parameters=$ipgen->ipgen_get_all_parameters_list();
1068
                        my $pos= get_scolar_pos( $value,@parameters);
1069
                        if(!defined $pos){
1070
                                $pos=0;
1071
                                $ipgen->ipgen_add_soket($p,'param',$parameters[0]);
1072
                        }
1073
                        my ($type_box,$type_combo)=gen_combo_help ('Define the parameter which determine the number of this interface in module',\@parameters,$pos);
1074
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1075
                        my $advance_button=def_image_button('icons/advance.png','concatenate');
1076 25 alirezamon
                        $table->attach ($type_box, $positions[2], $positions[3], $row, $row+1,'expand','shrink',2,2);
1077
                        $table->attach ($advance_button, $positions[3], $positions[4], $row, $row+1,'expand','shrink',2,2);
1078 16 alirezamon
                        $type_combo->signal_connect("changed"=>sub{
1079
                                my $wiget=shift;
1080
                                my $value=$wiget->get_active_text();
1081
                                $ipgen->ipgen_add_soket($p,'param',$value);
1082 25 alirezamon
                                set_gui_status($ipgen,'intfc_changed',0);
1083 16 alirezamon
 
1084
                        });
1085
                        $advance_button->signal_connect("clicked"=>sub{
1086
                                $ipgen->ipgen_add_soket($p,'num',0);
1087 25 alirezamon
                                set_gui_status($ipgen,'intfc_changed',0);
1088 16 alirezamon
 
1089
                        });
1090
 
1091
                }
1092
 
1093
 
1094
 
1095
 
1096
 
1097
 
1098 25 alirezamon
                $table->attach ($label_name, $positions[0], $positions[1], $row, $row+1,'expand','shrink',2,2);
1099
                $table->attach ($combo_type, $positions[1], $positions[2], $row, $row+1,'expand','shrink',2,2);
1100 16 alirezamon
 
1101
 
1102
 
1103
 
1104
                $row++;
1105
        }
1106
        foreach my $q( @plugs){
1107
                #my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1108
                my ($type,$value)= $ipgen->ipgen_get_plug($q);
1109
                my $label_name=gen_label_in_center($q);
1110
                my $combo_type=gen_combo(\@type_list,0);
1111
                my $remove=     def_image_button('icons/cancel.png','Remove');
1112
                my $name_setting=def_image_button('icons/setting.png');
1113
 
1114 25 alirezamon
                $table->attach ($remove, $positions[4], $positions[5], $row, $row+1,'expand','shrink',2,2);
1115 16 alirezamon
                $remove->signal_connect ('clicked'=> sub{
1116
                        $ipgen->ipgen_remove_plug($q);
1117 25 alirezamon
                        set_gui_status($ipgen,'intfc_changed',0);
1118 16 alirezamon
 
1119
                        }  );
1120
                $name_setting->signal_connect ('clicked'=> sub{
1121 25 alirezamon
                        get_intfc_setting($ipgen,$q,'plug');
1122 16 alirezamon
 
1123
 
1124
                }       );
1125
                $combo_type     ->signal_connect ('changed'=> sub{
1126
                        $ipgen->ipgen_remove_plug($q);
1127 25 alirezamon
                        add_intfc_to_ip($intfc,$ipgen,$q,'socket',$info);
1128 16 alirezamon
 
1129
                        }  );
1130
                #my $range_entry=gen_entry($range);
1131
                if ($type eq 'num'){
1132
                        my ($type_box,$type_spin)=gen_spin_help ('Define the number of this interface in module', 1,1024,1);
1133
                        $type_box->pack_start($name_setting,FALSE,FALSE,0);
1134
                        $type_spin->set_value($value);
1135 25 alirezamon
                        $table->attach ($type_box, $positions[2], $positions[3], $row, $row+1,'expand','shrink',2,2);
1136 24 alirezamon
                        $type_spin->signal_connect("value_changed"=>sub{
1137 16 alirezamon
                                my $wiget=shift;
1138
                                my $num=$wiget->get_value_as_int();
1139
                                $ipgen->ipgen_add_plug($q,'num',$num);
1140 25 alirezamon
                                set_gui_status($ipgen,'intfc_changed',0);
1141 16 alirezamon
 
1142
                        });
1143
 
1144
                }
1145 25 alirezamon
                $table->attach ($label_name, $positions[0], $positions[1], $row, $row+1,'expand','shrink',2,2);
1146
                $table->attach ($combo_type, $positions[1], $positions[2], $row, $row+1,'expand','shrink',2,2);
1147 16 alirezamon
                #$table->attach_defaults ($range_entry, 2, 4, $row, $row+1);
1148
 
1149
                #wishbone address seting
1150
                #print "$q eq 'wb_slave'\n";
1151
                if($q eq 'wb_slave'){
1152
                        my ($saved_addr,$saved_width)=$ipgen->ipgen_get_wb_addr($q,0);
1153
                        my $addr;
1154
                        if(!defined $saved_addr){
1155
                                 $addr= def_image_button('icons/warnning.png');
1156
                                 $addr->signal_connect ('clicked'=> sub{
1157
                                     message_dialog("Wishbone slave address range has not been set yet! ");
1158
 
1159
                                }  );
1160
                        }else{
1161
                                 $addr= def_image_button('icons/select.png');
1162
 
1163
                        }
1164 25 alirezamon
                        $table->attach ($addr, $positions[5], $positions[6], $row, $row+1,'expand','shrink',2,2);
1165 16 alirezamon
 
1166
 
1167
                }
1168
 
1169
 
1170
                $row++;
1171
        }
1172
 
1173
 
1174
 
1175
 
1176
 
1177
        return $table;
1178
 
1179
}
1180 24 alirezamon
########
1181
#       get_intfc_setting
1182
########
1183 16 alirezamon
 
1184
sub get_intfc_setting{
1185
 
1186 25 alirezamon
        my ($ipgen,$intfc_name, $intfc_type)=@_;
1187 34 alirezamon
        my $window =  def_popwin_size(70,70,"Interface parameter setting",'percent');
1188 16 alirezamon
        my $table=def_table(7,6,FALSE);
1189
        my $ok = def_image_button('icons/select.png','OK');
1190
 
1191
 
1192 25 alirezamon
 
1193 16 alirezamon
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
1194
        $scrolled_win->set_policy( "automatic", "automatic" );
1195
        $scrolled_win->add_with_viewport($table);
1196
 
1197
        #title
1198
        my $lable1=gen_label_in_left("interface name");
1199 25 alirezamon
        $table->attach ( $lable1,0,2,0,1,'expand','shrink',2,2);
1200 16 alirezamon
 
1201
 
1202
 
1203
 
1204
        my ($type,$value);
1205
        if($intfc_type eq 'plug'){
1206
                 ($type,$value)= $ipgen->ipgen_get_plug($intfc_name);
1207
        }else {
1208
                 ($type,$value)= $ipgen->ipgen_get_socket($intfc_name);
1209
 
1210
        }
1211
        if ($type ne 'num'){ $value=1;}
1212
        my $i=0;
1213
        for ( $i=0; $i < $value; $i++) {
1214
                #intfc name
1215
                my $saved_name;
1216
                my $number=$i;
1217
                if($intfc_type eq 'plug')       {$saved_name= $ipgen->ipgen_get_plug_name($intfc_name,$number);}
1218
                else                                            {$saved_name= $ipgen->ipgen_get_socket_name($intfc_name,$number);}
1219
                my  $entry_name=gen_entry($saved_name);
1220
 
1221 25 alirezamon
                $table->attach($entry_name,0,2,$i+1,$i+2,'expand','shrink',2,2);
1222 16 alirezamon
                $ok->signal_connect('clicked'=>sub{
1223
                                my $new_name=$entry_name->get_text();
1224
                                #print "my new name is: $new_name\n";
1225
                                if($intfc_type eq 'plug'){ $ipgen->ipgen_set_plug_name($intfc_name,$number,$new_name); }
1226
                                else {                                     $ipgen->ipgen_set_socket_name($intfc_name,$number,$new_name);}
1227
 
1228
                        });
1229
 
1230
 
1231
        }
1232
 
1233
 
1234
        #wishbone addr
1235
        if($intfc_name eq 'wb_slave' &&  $intfc_type eq 'plug'){
1236
                my $lable2=gen_label_in_center("address range: (start end name)");
1237 25 alirezamon
                my $lable3=gen_label_help("This field defines the total memory_map address  which is required by this module in byte. ( =2 ^ block_address_width).
1238
You can define a fixed value or assign it to any of module parameter","block address width");
1239 16 alirezamon
 
1240 25 alirezamon
                $table->attach ( $lable2,2,5,0,1,'expand','shrink',2,2);
1241
                $table->attach ( $lable3,5,6,0,1,'expand','shrink',2,2);
1242 16 alirezamon
 
1243
                my $plug=$intfc_name;
1244
                my $wb= wb_addr->wb_addr_new();
1245
                my @ip_names=$wb->wb_list_names();
1246
                my @list;
1247
                foreach my $p(@ip_names){
1248
                        my($start,$end,$cashed,$size)=$wb->wb_get_addr_info($p);
1249
                        push (@list,"$start\t$end\t\t$p");
1250
 
1251
                }
1252
 
1253
                my ($type,$value,$connection_num)=$ipgen->ipgen_get_plug($plug);
1254
                   $i=0;
1255
 
1256
                for ( $i=0; $i < $value; $i++) {
1257
                        my ($saved_addr,$saved_width)=$ipgen->ipgen_get_wb_addr($plug,$i);
1258
                        my $num=$i;
1259
                        my $pos;
1260
                        if(!defined $saved_addr){
1261
                                $pos=0;
1262
                                $saved_width=1;
1263
                                $ipgen->ipgen_save_wb_addr($plug,$num,$list[0],1);
1264
                        }
1265
                        else{
1266
                                $pos= get_scolar_pos($saved_addr,@list);
1267
                        }
1268
 
1269
                        my $name_combo=gen_combo(\@list,$pos);
1270
                        my $sbox=def_hbox(FALSE,0);
1271 17 alirezamon
                        my $widget;
1272 24 alirezamon
                        my $size_lab;
1273 16 alirezamon
                        my @l=("Fixed","Parameterizable");
1274 17 alirezamon
 
1275
                        if(!defined $saved_width){
1276
                                $pos=0;
1277
                                $saved_width=1;
1278
 
1279
                        }
1280
                        else{
1281
                                if(is_integer($saved_width)){
1282
                                         $pos= 0;
1283
                                         $widget=gen_spin(1,31,1);
1284
                                         $widget->set_value($saved_width);
1285 24 alirezamon
                                         my $d=2**$saved_width;
1286
                                         $size_lab=gen_label_in_left(metric_conversion($d). " Bytes");
1287 17 alirezamon
                                } else{
1288
                                        $pos= 1;
1289
                                        my @parameters=$ipgen->ipgen_get_all_parameters_list();
1290
                                        my $p=get_scolar_pos($saved_width,@parameters);
1291
 
1292
                                        $widget=gen_combo(\@parameters, $p);
1293 24 alirezamon
                                        $size_lab=gen_label_in_left(" ");
1294 17 alirezamon
 
1295
                                }
1296
 
1297
 
1298
                        }
1299
 
1300
 
1301
 
1302 16 alirezamon
                        my $comb=gen_combo(\@l, $pos);
1303 17 alirezamon
                        #$widget->set_value($saved_width);
1304 16 alirezamon
                        $sbox->pack_start($comb,FALSE,FALSE,3);
1305
                        $sbox->pack_end($widget,FALSE,FALSE,3);
1306 24 alirezamon
                        $sbox->pack_end($size_lab,FALSE,FALSE,3);
1307 16 alirezamon
                        $comb->signal_connect('changed'=>sub{
1308
                                my $condition=$comb->get_active_text();
1309
                                $widget->destroy;
1310 24 alirezamon
                                $size_lab->destroy;
1311 16 alirezamon
                                my @parameters=$ipgen->ipgen_get_all_parameters_list();
1312
                                $widget=($condition eq "Fixed" )? gen_spin(1,31,1):gen_combo(\@parameters, 0);
1313 24 alirezamon
                                $size_lab=($condition eq "Fixed" )? gen_label_in_left("2 Bytes"):  gen_label_in_left(" ");
1314 16 alirezamon
                                $sbox->pack_end($widget,FALSE,FALSE,3);
1315 24 alirezamon
                                $sbox->pack_end($size_lab,FALSE,FALSE,3);
1316 16 alirezamon
                                $sbox->show_all();
1317 24 alirezamon
                                $widget->signal_connect('changed'=>sub{
1318
                                        $size_lab->destroy;
1319
                                        my $in=$comb->get_active_text();
1320
                                        my $width=($in eq "Fixed" )? $widget->get_value_as_int(): $widget->get_active_text() ;
1321
                                        my $d=($in eq "Fixed" )? 2**$width:0;
1322
 
1323
                                        $size_lab=($in eq "Fixed" )? gen_label_in_left( metric_conversion($d). " Bytes"):gen_label_in_left(" ");
1324
                                        $sbox->pack_end($size_lab,FALSE,FALSE,3);
1325
                                        $sbox->show_all();
1326
                                });
1327 16 alirezamon
                        });
1328 24 alirezamon
                        $widget->signal_connect('changed'=>sub{
1329
                                $size_lab->destroy;
1330
                                my $in=$comb->get_active_text();
1331
                                my $width=($in eq "Fixed" )? $widget->get_value_as_int(): $widget->get_active_text() ;
1332
                                my $d=($in eq "Fixed" )? 2**$width:0;
1333
 
1334
                                $size_lab=($in eq "Fixed" )? gen_label_in_left(metric_conversion($d). " Bytes"):gen_label_in_left(" ");
1335
                                $sbox->pack_end($size_lab,FALSE,FALSE,3);
1336
                                $sbox->show_all();
1337
                        });
1338 16 alirezamon
 
1339 25 alirezamon
                        $table->attach ($name_combo,2,5,$i+1,$i+2 ,'expand','shrink',2,2);
1340
                        $table->attach ($sbox,5,6,$i+1,$i+2,'expand','shrink',2,2);
1341 16 alirezamon
                        $ok->signal_connect('clicked'=>sub{
1342
                                my $addr=$name_combo->get_active_text();
1343
                                my $in=$comb->get_active_text();
1344
                                my $width=($in eq "Fixed" )? $widget->get_value_as_int(): $widget->get_active_text() ;
1345
                                $ipgen->ipgen_save_wb_addr($plug,$num,$addr,$width);
1346
 
1347
                        });
1348
 
1349
 
1350
                }
1351
 
1352
 
1353
 
1354
        }
1355
 
1356 25 alirezamon
 
1357 16 alirezamon
 
1358
 
1359
 
1360 25 alirezamon
        my $mtable = def_table(10, 1, FALSE);
1361 16 alirezamon
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
1362 25 alirezamon
        $mtable->attach($ok,0,1,9,10,'expand','shrink',2,2);
1363 16 alirezamon
 
1364
        $window->add ($mtable);
1365
        $window->show_all();
1366
 
1367
 
1368
 
1369
 
1370
         $ok->signal_connect('clicked'=>sub{
1371
                        $window->destroy;
1372 25 alirezamon
                        set_gui_status($ipgen,"interface_selected",1);
1373 16 alirezamon
 
1374
                 } );
1375
 
1376
 
1377
 
1378
 
1379
}
1380
 
1381
 
1382
 
1383 17 alirezamon
sub is_integer {
1384
   defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
1385
}
1386 16 alirezamon
 
1387
 
1388
#############
1389
#  add_intfc_to_ip
1390
##############
1391
 
1392
 
1393
sub add_intfc_to_ip{
1394 25 alirezamon
        my ($intfc,$ipgen,$infc_name,$infc_type,$info)=@_;
1395 16 alirezamon
        if($infc_type eq 'socket'){
1396
                my ($connection_num,$connect_to)=$intfc->get_socket($infc_name);
1397
                $ipgen->ipgen_add_soket($infc_name,'num',1,$connection_num);
1398
        }
1399
        else { $ipgen->ipgen_add_plug($infc_name,'num',1);}
1400 25 alirezamon
        set_gui_status($ipgen,"interface_selected",1);
1401 16 alirezamon
 
1402
}
1403
 
1404
 
1405
#################
1406
#       get_list_of_all_interfaces
1407
################
1408
 
1409
sub get_list_of_all_interfaces{
1410
        my ($ipgen)=@_;
1411
        my @sockets     =$ipgen->ipgen_list_sokets();
1412
        my @plugs       =$ipgen->ipgen_list_plugs();
1413
        my @interfaces=('IO');
1414
        my @interfaces_name=('IO');
1415
        foreach my $p( @sockets){
1416
                my ($type,$value)=  $ipgen->ipgen_get_socket($p);
1417
                if($type eq 'num'){
1418
                                for(my $i=0; $i<$value; $i++){
1419
                                        push(@interfaces,"socket:$p\[$i\]");
1420
                                        my $socket_name=$ipgen->ipgen_get_socket_name($p,$i);
1421
                                        push(@interfaces_name,"socket:$socket_name");
1422
                                }#for   
1423
 
1424
                }#if
1425
                else {
1426
                        push(@interfaces,"socket:$p\[array\]");
1427
                        my $socket_name=$ipgen->ipgen_get_socket_name($p,0);
1428
                        push(@interfaces_name,"socket:$socket_name");
1429
 
1430
 
1431
                }#else          
1432
 
1433
        }#foreach       
1434
        foreach my $p( @plugs){
1435
                my ($type,$value)=  $ipgen->ipgen_get_plug($p);
1436
                if($type eq 'num'){
1437
                                for(my $i=0; $i<$value; $i++){
1438
                                        push(@interfaces,"plug:$p\[$i\]");
1439
                                        my $plug_name=$ipgen->ipgen_get_plug_name($p,$i);
1440
                                        push(@interfaces_name,"plug:$plug_name");
1441
 
1442
                                }#for   
1443
 
1444
                }#if
1445
                else {
1446
                        my $plug_name=$ipgen->ipgen_get_plug_name($p,0);
1447
                        push(@interfaces,"plug:$p\[array\]");
1448
                        push(@interfaces_name,"plug:$plug_name");
1449
 
1450
 
1451
                }#else          
1452
 
1453
        }#foreach       
1454
        return (\@interfaces_name,\@interfaces);
1455
 
1456
}
1457
 
1458
sub gen_intfc_port_combo{
1459
        my ($intfc,$ipgen,$intfc_name,$porttype,$portname)=@_;
1460
 
1461
        my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
1462
        my @all_ports;
1463
        my @ports;
1464
 
1465
        if($type eq 'socket'){
1466
                @all_ports= $intfc->get_socket_port_list($name);
1467
                foreach my $p(@all_ports){
1468
                        my ($r,$t,$c)=$intfc->get_port_info_of_socket($name,$p);
1469
                        if ($t eq $porttype){ push (@ports,$p);}
1470
                }
1471
 
1472
        }elsif($type eq 'plug'){
1473
                @all_ports= $intfc->get_plug_port_list($name);
1474
 
1475
                foreach my $p(@all_ports){
1476
                        my ($r,$t,$c)=$intfc->get_port_info_of_plug($name,$p);
1477
                        #print "($t eq $porttype)\n";
1478
                        if ($t eq $porttype){ push (@ports,$p);}
1479
                }
1480
 
1481
        }
1482
        else  {
1483 25 alirezamon
                @ports=('IO','NC');
1484 16 alirezamon
        }
1485
        my $saved_intfc_port=$ipgen->ipgen_get_port_intfc_port($portname);
1486
        my $pos=(defined $saved_intfc_port ) ? get_scolar_pos( $saved_intfc_port,@ports) : undef;
1487
        if (!defined $pos){
1488
                $pos=find_the_most_similar_position( $portname       ,@ports);
1489
                $ipgen->ipgen_set_port_intfc_port($portname,$ports[$pos]);
1490
                #print "$ports[$pos]\n;"
1491
        }
1492
        my $intfc_port_combo=gen_combo(\@ports,$pos);
1493
        $intfc_port_combo->signal_connect('changed'=> sub {
1494
                my $intfc_port=$intfc_port_combo->get_active_text();
1495
                $ipgen->ipgen_set_port_intfc_port($portname,$intfc_port);
1496
 
1497
        });
1498
 
1499
 
1500
        return  $intfc_port_combo;
1501
}
1502
 
1503
 
1504
 
1505
sub port_info_box {
1506 25 alirezamon
        my($intfc,$ipgen,$info)=@_;
1507
        my $table=def_table(8,10,FALSE);
1508 16 alirezamon
        my @ports=$ipgen->ipgen_list_ports;
1509
        my $row=0;
1510
        my ($name_ref,$ref)=get_list_of_all_interfaces($ipgen);
1511
        my @interfaces_name=@{$name_ref};
1512
        my @interfaces=@{$ref};
1513
        #print "@interfaces_name\n";
1514
 
1515 25 alirezamon
        $table->attach  (gen_label_in_left(" Type "), 0, 1, $row, $row+1,'expand','shrink',2,2);
1516
        $table->attach  (gen_label_in_left(" Port name "), 1, 3, $row, $row+1,'expand','shrink',2,2);
1517
        $table->attach  (gen_label_in_left(" Interface name "), 3, 5, $row, $row+1,'expand','shrink',2,2);
1518
        $table->attach  (gen_label_in_center(" Interface port  "), 5, 7, $row, $row+1,'fill','shrink',2,2);
1519
        $table->attach  (gen_label_in_left("  Port Range "), 7, 9, $row, $row+1,'expand','shrink',2,2);
1520 16 alirezamon
        $row++;
1521
        #print  @interfaces;
1522
        my @ports_order=$ipgen->ipgen_get_ports_order();
1523
        if(scalar(@ports_order) >1 ){ @ports= @ports_order}
1524
 
1525
 
1526
 
1527
 
1528
        foreach my $p( @ports){
1529
                my ($range,$type,$intfc_name,$intfc_port)=$ipgen->ipgen_get_port($p);
1530
                #my $label_name=gen_label_in_left(" $p ");
1531 25 alirezamon
                my $name_entry=gen_label_in_left($p);
1532 16 alirezamon
                my $label_type=gen_label_in_left(" $type ");
1533
                my $range_entry=gen_entry($range);
1534
                my $pos=(defined $intfc_name ) ? get_scolar_pos( $intfc_name,@interfaces) : 0;
1535
                if (!defined $pos){
1536
                        $pos=0;
1537
                        $ipgen->ipgen_set_port_intfc_name($p,'IO');
1538
                };
1539
                my $intfc_name_combo=gen_combo(\@interfaces_name,$pos);
1540
                my $intfc_port_combo=gen_intfc_port_combo($intfc,$ipgen,$intfc_name,$type,$p);
1541
 
1542
 
1543 25 alirezamon
                $table->attach ($label_type, 0, 1, $row, $row+1,'expand','shrink',2,2);
1544
                $table->attach ($name_entry, 1, 3, $row, $row+1,'expand','shrink',2,2);
1545
                $table->attach ($intfc_name_combo,3, 5, $row, $row+1,'expand','shrink',2,2);
1546
                $table->attach ($intfc_port_combo, 5, 7, $row, $row+1,'fill','shrink',2,2);
1547
                $table->attach ($range_entry ,7, 9, $row, $row+1,'fill','shrink',2,2);
1548
 
1549 16 alirezamon
                $intfc_name_combo->signal_connect('changed'=>sub{
1550
                        my $intfc_name=$intfc_name_combo->get_active_text();
1551
                        my $pos=  get_scolar_pos( $intfc_name,@interfaces_name);
1552
                        #my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
1553
                        #print "$type,$name,$num\n";
1554
                        $ipgen->ipgen_set_port_intfc_name($p,$interfaces[$pos]);
1555 25 alirezamon
                        set_gui_status($ipgen,"interface_selected",1);
1556 16 alirezamon
                });
1557
                $range_entry->signal_connect('changed'=>sub{
1558
                        my $new_range=$range_entry->get_text();
1559
                        $ipgen->ipgen_add_port($p,$new_range,$type,$intfc_name,$intfc_port);
1560
                });
1561
 
1562
                $row++;
1563
        }
1564
 
1565
 
1566
 
1567
 
1568
        return $table;
1569
 
1570
 
1571
}
1572
 
1573
 
1574 34 alirezamon
sub write_ip{
1575
        my $ipgen=shift;
1576
        my $name=$ipgen->ipgen_get("module_name");
1577
        my $category=$ipgen->ipgen_get("category");
1578
        my $ip_name= $ipgen->ipgen_get("ip_name");
1579
        my $dir = Cwd::getcwd();
1580 16 alirezamon
 
1581 34 alirezamon
        #Increase IP version
1582
        my $v=$ipgen->object_get_attribute("version",undef);
1583
        $v = 0 if(!defined $v);
1584
        $v++;
1585
        $ipgen->object_add_attribute("version",undef,$v);
1586
        #print "$v\n";
1587 16 alirezamon
 
1588 34 alirezamon
        # Write
1589
        mkpath("$dir/lib/ip/$category/",1,01777);
1590
        open(FILE,  ">lib/ip/$category/$ip_name.IP") || die "Can not open: $!";
1591
        print FILE perl_file_header("$ip_name.IP");
1592 38 alirezamon
        print FILE Data::Dumper->Dump([\%$ipgen],["ipgen"]);
1593 34 alirezamon
        close(FILE) || die "Error closing file: $!";
1594
        my $message="IP $ip_name has been generated successfully. In order to see the generated IP in processing tile generator you need to reset the ProNoC. Do you want to reset the ProNoC now?" ;
1595
 
1596
        my $dialog = Gtk2::MessageDialog->new (my $window,
1597
                     'destroy-with-parent',
1598
                     'question', # message type
1599
                     'yes-no', # which set of buttons?
1600
                     "$message");
1601
        my $response = $dialog->run;
1602
        if ($response eq 'yes') {
1603
                exec($^X, $0, @ARGV);# reset ProNoC to apply changes    
1604
        }
1605
        $dialog->destroy;
1606 16 alirezamon
 
1607 34 alirezamon
}
1608 16 alirezamon
 
1609 34 alirezamon
 
1610
 
1611 16 alirezamon
sub generate_ip{
1612
        my $ipgen=shift;
1613 24 alirezamon
        my $name=$ipgen->ipgen_get("module_name");
1614
        my $category=$ipgen->ipgen_get("category");
1615
        my $ip_name= $ipgen->ipgen_get("ip_name");
1616 25 alirezamon
        my $dir = Cwd::getcwd();
1617
 
1618 34 alirezamon
 
1619 25 alirezamon
 
1620 16 alirezamon
        #check if name has been set
1621
        if(defined ($name) && defined ($category)){
1622
                if (!defined $ip_name) {$ip_name= $name}
1623 34 alirezamon
                my $error = check_verilog_identifier_syntax($ip_name);
1624
                if ( defined $error ){
1625
                        message_dialog("The IP name \"$ip_name\" is given with an unacceptable formatting. This name will be used as a verilog module name so it must follow Verilog identifier declaration formatting:\n $error");
1626
                        return ;
1627
                }
1628
 
1629
 
1630
 
1631 16 alirezamon
                #check if any source file has been added for this ip
1632 24 alirezamon
                my @l=$ipgen->ipgen_get_list("hdl_files");
1633 16 alirezamon
                if( scalar @l ==0){
1634
                        my $mwindow;
1635
                        my $dialog = Gtk2::MessageDialog->new ($mwindow,
1636
                                      'destroy-with-parent',
1637
                                      'question', # message type
1638
                                      'yes-no', # which set of buttons?
1639
                                      "No hdl library file has been set for this IP. Do you want to generate this IP?");
1640
                        my $response = $dialog->run;
1641
                        if ($response eq 'yes') {
1642 34 alirezamon
                                write_ip($ipgen);
1643
 
1644
 
1645 16 alirezamon
                        }
1646
                        $dialog->destroy;
1647
 
1648
 
1649
                        #$dialog->show_all;
1650
 
1651
                }else{
1652 34 alirezamon
 
1653
                        write_ip($ipgen);
1654 16 alirezamon
                }
1655
        }else{
1656
                my $message;
1657
                if(!defined ($name)){ $message="Input file has not been selected yet.\nNothing has been generated!" ;}
1658
                elsif(!defined ($category)){ $message="Category must be defined!" ;}
1659
                message_dialog($message);
1660
 
1661
        }
1662
#$hashref = retrieve('file');
1663
 
1664
 
1665
 
1666
return 1;
1667
}
1668
 
1669
 
1670
 
1671
 
1672
#########
1673 17 alirezamon
#       load_ip
1674 16 alirezamon
########
1675
 
1676
sub load_ip{
1677 25 alirezamon
        my ($ipgen)=@_;
1678 16 alirezamon
        my $file;
1679
        my $dialog = Gtk2::FileChooserDialog->new(
1680
                'Select a File', undef,
1681
                'open',
1682
                'gtk-cancel' => 'cancel',
1683
                'gtk-ok'     => 'ok',
1684
                );
1685
 
1686
        my $filter = Gtk2::FileFilter->new();
1687
        $filter->set_name("IP");
1688
        $filter->add_pattern("*.IP");
1689
        $dialog->add_filter ($filter);
1690
        my $dir = Cwd::getcwd();
1691
        $dialog->set_current_folder ("$dir/lib/ip")     ;
1692
 
1693
 
1694
        if ( "ok" eq $dialog->run ) {
1695
                $file = $dialog->get_filename;
1696
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1697
                if($suffix eq '.IP'){
1698 24 alirezamon
                        $ipgen->ipgen_add("file_name",$file);
1699 25 alirezamon
                        set_gui_status($ipgen,"load_file",0);
1700 16 alirezamon
                }
1701
     }
1702
     $dialog->destroy;
1703
 
1704
 
1705
 
1706
}
1707
 
1708
 
1709
 
1710 24 alirezamon
 
1711
 
1712
 
1713
############
1714
#       get_source_file
1715 17 alirezamon
###########
1716 16 alirezamon
 
1717 24 alirezamon
 
1718
 
1719
sub get_source_file{
1720 25 alirezamon
        my($ipgen,$info,$page,$title,$dest,$page_info_ref)=@_;
1721 24 alirezamon
 
1722
 
1723 25 alirezamon
        my $var_list='${parameter_name}: Verilog module parameter values.
1724
 
1725
${CORE_ID} Each wishbone bus based SoC will have a unique CORE_ID that represents its location in NoC topology. CORE_ID=((y * number_of_nodes_in_x_ dimension) + x) where (x,y) are the node location in x and y axises. If the generated tile is used as top level module CORE_ID will take the default value of zero.
1726 24 alirezamon
 
1727
${IP}: is the peripheral device instance name.
1728
 
1729 25 alirezamon
${CORE}: is the peripheral device module name.
1730
 
1731
${BASE}: is the wishbone base addresse(s) and will be added during soc generation to system.h. If more than one slave wishbone bus are used  define them as ${BASE0}, ${BASE1}... .
1732
'
1733
;
1734 24 alirezamon
        my $var_help=gen_button_message($var_list,"icons/info.png","Global variables");
1735 17 alirezamon
 
1736
 
1737 34 alirezamon
        my $window = def_popwin_size(75,75,$title,'percent');
1738
 
1739 25 alirezamon
        my $notebook=source_notebook($ipgen,$info,$window,$page,$dest,$page_info_ref);
1740
        my $table=def_table (15, 15, FALSE);
1741 17 alirezamon
 
1742 24 alirezamon
 
1743 25 alirezamon
        $table->attach ($var_help, 5, 7, 0, 1,'expand','shrink',2,2);
1744 24 alirezamon
        $table->attach_defaults ($notebook , 0, 15, 1, 15);
1745
 
1746
        $window->add($table);
1747
        $window->show_all;
1748
        return $window;
1749 17 alirezamon
 
1750 24 alirezamon
}
1751
 
1752
##########
1753
# source_notebook
1754
##########
1755
 
1756
sub source_notebook{
1757 25 alirezamon
        my($ipgen,$info,$window,$page,$dest,$page_info_ref)=@_;
1758 24 alirezamon
        my $notebook = Gtk2::Notebook->new;
1759
        my %page_info=%{$page_info_ref};
1760
        foreach my $p (sort keys %page_info){
1761
                my $page_ref;
1762 25 alirezamon
                $page_ref=get_file_folder($ipgen,$info,$window,$p,$page_info_ref) if($page_info{$p}{filed_type} eq "exsiting_file/folder");
1763 38 alirezamon
                $page_ref=get_file_folder($ipgen,$info,$window,$p,$page_info_ref) if($page_info{$p}{filed_type} eq "file_with_variables");
1764 25 alirezamon
                $page_ref=get_file_content($ipgen,$info,$window,$page_info{$p},$page_info_ref) if($page_info{$p}{filed_type} eq "file_content");
1765 24 alirezamon
                $notebook->append_page ($page_ref,Gtk2::Label->new_with_mnemonic ($page_info{$p}{page_name}));
1766
 
1767
        }
1768
        $notebook->show_all;
1769
        $notebook->set_current_page($page) if(defined $page);
1770
        return $notebook;
1771
 
1772
}
1773
 
1774
##########
1775
#  get_file_folder
1776
#########
1777
 
1778
sub get_file_folder{
1779 25 alirezamon
        my ($ipgen,$info,$window,$page,$page_info_ref)=@_;
1780 24 alirezamon
        my %page_info=%{$page_info_ref};
1781
        my @sw_dir = $ipgen->ipgen_get_list($page_info{$page}{filed_name});
1782 25 alirezamon
        my $table = Gtk2::Table->new (15, 15, FALSE);
1783 24 alirezamon
        my $help=gen_label_help($page_info{$page}{help});
1784 25 alirezamon
        $table->attach ($help,0,2,0,1,'expand','shrink',2,2);
1785 24 alirezamon
        my ($scrwin,$ok)=gen_file_list($ipgen,$page_info{$page}{filed_name},$window,$page_info{$page}{rename_file});
1786 17 alirezamon
 
1787
        my $label=gen_label_in_left("Selecet file(s):");
1788
        my $brows=def_image_button("icons/browse.png",' Browse');
1789 25 alirezamon
        $table->attach ($label,2,4,0,1,'expand','shrink',2,2);
1790
        $table->attach($brows,4,6,0,1,'expand','shrink',2,2);
1791 17 alirezamon
 
1792
        my $dir = Cwd::getcwd();
1793
        my $project_dir   = abs_path("$dir/../../"); #mpsoc directory address
1794
 
1795
 
1796
        $brows->signal_connect("clicked"=> sub {
1797
                my @files;
1798
        my $dialog = Gtk2::FileChooserDialog->new(
1799
                'Select a File',
1800
                 undef,
1801
                 'open',
1802
                'gtk-cancel' => 'cancel',
1803
                'gtk-ok'     => 'ok',
1804
                );
1805
 
1806
                my $filter = Gtk2::FileFilter->new();
1807
                        my $dir = Cwd::getcwd();
1808
                        $dialog->set_current_folder ("$dir/..") ;
1809
                        $dialog->set_select_multiple(TRUE);
1810 16 alirezamon
 
1811 17 alirezamon
                if ( "ok" eq $dialog->run ) {
1812 24 alirezamon
                        @files = $dialog->get_filenames;
1813
                        @sw_dir=$ipgen->ipgen_get_list($page_info{$page}{filed_name});
1814 17 alirezamon
                        foreach my $p (@files){
1815
                                #remove $project_dir form beginig of each file
1816 24 alirezamon
                                $p =~ s/$project_dir//;
1817
                                my ($name,$path,$suffix) = fileparse("$p",qr"\..[^.]*$");
1818
                                $p=$p.'frename_sep_t'.$name.$suffix if (defined $page_info{$page}{rename_file});
1819 17 alirezamon
                                if(! grep (/^$p$/,@sw_dir)){push(@sw_dir,$p)};
1820
 
1821 24 alirezamon
                        }
1822
                        $ipgen->ipgen_add($page_info{$page}{filed_name},\@sw_dir);
1823 25 alirezamon
                        get_source_file($ipgen,$info,$page,"Add software file(s)","SW",$page_info_ref);
1824 17 alirezamon
                        $window->destroy;
1825
 
1826
                 }
1827
                $dialog->destroy;
1828
        } );# # ,\$entry);
1829
 
1830 24 alirezamon
        if($page_info{$page}{folder_en} eq 1){
1831
                my $label2=gen_label_in_left("Selecet folder(s):");
1832
                my $brows2=def_image_button("icons/browse.png",' Browse');
1833 25 alirezamon
                $table->attach($label2,7,9,0,1,'expand','shrink',2,2);
1834
                $table->attach($brows2,9,11,0,1,'expand','shrink',2,2);
1835 24 alirezamon
 
1836
                $brows2->signal_connect("clicked"=> sub {
1837
                        my @files;
1838 17 alirezamon
 
1839 24 alirezamon
                         my $dialog = Gtk2::FileChooserDialog->new(
1840
                        'Select Folder(s)',
1841
                        undef,
1842
                                        'select-folder',
1843
                        'gtk-cancel' => 'cancel',
1844
                        'gtk-ok'     => 'ok',
1845
                        );
1846
 
1847
                        my $filter = Gtk2::FileFilter->new();
1848
                                my $dir = Cwd::getcwd();
1849
                                $dialog->set_current_folder ("$dir/..") ;
1850
                                $dialog->set_select_multiple(TRUE);
1851 17 alirezamon
 
1852 24 alirezamon
                        if ( "ok" eq $dialog->run ) {
1853
                                @files = $dialog->get_filenames;
1854
 
1855
                                @sw_dir=$ipgen->ipgen_get_list($page_info{$page}{filed_name});
1856
                                foreach my $p (@files){
1857
                                        #remove $project_dir form beginig of each file
1858
                                        $p =~ s/$project_dir//;
1859
                                        if(! grep (/^$p$/,@sw_dir)){push(@sw_dir,$p)};
1860
 
1861
                                }
1862
 
1863
                                $ipgen->ipgen_add($page_info{$page}{filed_name},\@sw_dir);
1864 25 alirezamon
                                get_source_file($ipgen,$info,$page,"Add software file(s)","SW",$page_info_ref);
1865 24 alirezamon
                                $window->destroy;
1866
 
1867
 
1868
                                                #$$entry_ref->set_text($file);
1869 17 alirezamon
 
1870 24 alirezamon
                                #print "file = $file\n";
1871
                         }
1872
                        $dialog->destroy;
1873
 
1874 17 alirezamon
 
1875
 
1876 24 alirezamon
                } );# # ,\$entry);
1877
        }
1878 17 alirezamon
 
1879
 
1880
 
1881 24 alirezamon
        $table->attach_defaults($scrwin,0,15,1,14);
1882 25 alirezamon
        $table->attach($ok,6,9,14,15,'expand','shrink',2,2);
1883 17 alirezamon
 
1884 24 alirezamon
        return ($table)
1885
 
1886 17 alirezamon
 
1887
}
1888
 
1889
 
1890
 
1891 24 alirezamon
###########
1892
#       get_file_content
1893
#########
1894 17 alirezamon
 
1895 24 alirezamon
sub get_file_content{
1896 25 alirezamon
        my ($ipgen,$info,$window,$page_info_ref)=@_;
1897 24 alirezamon
        my %page_info=%{$page_info_ref};
1898
        #my $hdr = $ipgen->ipgen_get_hdr();
1899
        my  $hdr = $ipgen-> ipgen_get($page_info{filed_name});
1900 25 alirezamon
        my $table = Gtk2::Table->new (14, 15, FALSE);
1901 24 alirezamon
        my ($scrwin,$text_view)=create_text();
1902 17 alirezamon
 
1903 24 alirezamon
        my $help=gen_label_help($page_info{help});
1904 25 alirezamon
        $table->attach ($help,0,8,0,1,'expand','shrink',2,2);
1905 24 alirezamon
        $table->attach_defaults($scrwin,0,15,1,14);
1906
        my $text_buffer = $text_view->get_buffer;
1907
        if(defined $hdr) {$text_buffer->set_text($hdr)};
1908
 
1909
        my $ok=def_image_button("icons/select.png",' Save ');
1910
        $ok->signal_connect("clicked"=> sub {#            
1911
                 my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
1912
                 $ipgen->ipgen_add($page_info{filed_name},$text);
1913
                 $window->destroy;
1914
 
1915
        });
1916 17 alirezamon
 
1917 25 alirezamon
        $table->attach($ok,6,7,14,15,'expand','shrink',2,2);
1918 24 alirezamon
        return ($table);
1919
 
1920
}
1921 17 alirezamon
 
1922
 
1923
 
1924
 
1925
 
1926
 
1927
 
1928
 
1929
 
1930
 
1931
 
1932
 
1933
 
1934 24 alirezamon
 
1935
 
1936
 
1937 16 alirezamon
############
1938 17 alirezamon
#       get_unused_intfc_ports_list
1939
###########
1940
 
1941
sub get_unused_intfc_ports_list {
1942 25 alirezamon
        my($intfc,$ipgen,$info)=@_;
1943 17 alirezamon
        my @ports=$ipgen->ipgen_list_ports;
1944
        my ($name_ref,$ref)=get_list_of_all_interfaces($ipgen);
1945
        my @interfaces_name=@{$name_ref};
1946
        my @interfaces=@{$ref};
1947 24 alirezamon
        $ipgen->ipgen_remove("unused");
1948 17 alirezamon
        foreach my $intfc_name (@interfaces)
1949
        {
1950
                #print "$intfc_name\n";
1951
                my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
1952
                my @all_ports;
1953
                if($type eq 'socket'){
1954
                        @all_ports= $intfc->get_socket_port_list($name);
1955
 
1956
                }elsif($type eq 'plug'){
1957
                        @all_ports= $intfc->get_plug_port_list($name);
1958
                }
1959
                foreach my $p(@all_ports){
1960 25 alirezamon
                                my $r= check_intfc_port_exits($intfc,$ipgen,$info,$intfc_name,$p);
1961 17 alirezamon
                                if ($r eq "0"){
1962
                                        $ipgen->ipgen_add_unused_intfc_port( $intfc_name,$p );
1963
                                }
1964
 
1965
                }
1966
 
1967
        }
1968
}
1969
 
1970
sub check_intfc_port_exits{
1971 25 alirezamon
        my($intfc,$ipgen,$info,$intfc_name,$intfc_port)=@_;
1972 17 alirezamon
        my @ports=$ipgen->ipgen_list_ports;
1973
 
1974
 
1975
        my $result="0";
1976
        foreach my $p( @ports){
1977
                my ($range,$type,$assigned_intfc_name,$assigned_intfc_port)=$ipgen->ipgen_get_port($p);
1978
                #print "if($intfc_name eq $assigned_intfc_name && $intfc_port eq $assigned_intfc_port);\n";
1979
 
1980
                if($intfc_name eq $assigned_intfc_name && $intfc_port eq $assigned_intfc_port){
1981
                        if($result eq "1"){# one interface port has been connected to multiple IP port
1982
 
1983
                        }
1984
                        $result = "1";
1985
 
1986
                }
1987
        }
1988
        return $result;
1989
 
1990
}
1991
 
1992
 
1993 24 alirezamon
 
1994
 
1995
 
1996
 
1997
 
1998
 
1999
 
2000
 
2001
 
2002
 
2003
 
2004
 
2005
 
2006
 
2007
 
2008 17 alirezamon
############
2009 16 alirezamon
#    main
2010
############
2011
sub ipgen_main{
2012
        my $ipgen=shift;
2013
        my $intfc=interface->interface_new();
2014
        if(!defined $ipgen) { $ipgen=ip_gen->ip_gen_new();}
2015 25 alirezamon
        set_gui_status($ipgen,"ideal",0);
2016
 
2017 16 alirezamon
        #  The main table containg the lib tree, selected modules and info section 
2018 17 alirezamon
        my $main_table = def_table (15, 12, FALSE);
2019 34 alirezamon
 
2020
 
2021
 
2022
 
2023 16 alirezamon
 
2024 34 alirezamon
        #my $vpaned = Gtk2::VPaned -> new;
2025
        #$table->attach_defaults ($vpaned,0, 10, 0,1);
2026
        #my $make = def_image_button('icons/run.png','Compile');
2027
        #$table->attach ($make,9, 10, 1,2,'shrink','shrink',0,0);
2028
        #$make -> signal_connect("clicked" => sub{
2029
                #$self->do_save();
2030
                #run_make_file($sw,$tview);     
2031
 
2032
        #});
2033
 
2034
        #$window -> add ( $table);
2035
 
2036
        #my($width,$hight)=max_win_size();
2037
 
2038
        #my $scwin_dirs = Gtk2::ScrolledWindow -> new;
2039
        #$scwin_dirs -> set_policy ('automatic', 'automatic');
2040
 
2041
 
2042
 
2043
 
2044
 
2045
 
2046 16 alirezamon
        # The box which holds the info, warning, error ...  mesages
2047
        my ($infobox,$info)= create_text();
2048
 
2049
 
2050
        my $refresh_dev_win = Gtk2::Button->new_from_stock('ref');
2051
        my $generate = def_image_button('icons/gen.png','Generate');
2052
 
2053 25 alirezamon
 
2054 16 alirezamon
        # A tree view for holding a library
2055 25 alirezamon
        my $tree_box = create_interface_tree  ($info,$intfc,$ipgen);
2056 16 alirezamon
 
2057
 
2058 25 alirezamon
        my $file_info=show_file_info($ipgen,$info,\$refresh_dev_win);
2059
        my $port_info=show_port_info($intfc,$ipgen,$info,\$refresh_dev_win);
2060
        my $intfc_info=show_interface_info($intfc,$ipgen,$info,\$refresh_dev_win);
2061 16 alirezamon
 
2062
 
2063
        my $open = def_image_button('icons/browse.png','Load IP');
2064 25 alirezamon
 
2065 16 alirezamon
 
2066
        $main_table->set_row_spacings (4);
2067
        $main_table->set_col_spacings (1);
2068
 
2069 25 alirezamon
        #my  $device_win=show_active_dev($soc,$lib,$infc,\$refresh_dev_win,$info);
2070 16 alirezamon
 
2071
 
2072
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
2073 34 alirezamon
 
2074
        my $v1=gen_vpaned($file_info,.2,$intfc_info);
2075
        my $v2=gen_vpaned($v1,.4,$port_info);
2076
        my $h1=gen_hpaned($tree_box,.15,$v2);
2077
        my $v3=gen_vpaned($h1,.6,$infobox);
2078
 
2079
 
2080
        #$main_table->attach_defaults ($tree_box , 0, 2, 0, 13);
2081
        #$main_table->attach_defaults ($file_info , 2, 12, 0, 2);
2082
        #$main_table->attach_defaults ($intfc_info , 2, 12, 2, 6);
2083 16 alirezamon
 
2084 34 alirezamon
        #$main_table->attach_defaults ($port_info  , 2, 12, 6,13);
2085
        #$main_table->attach_defaults ($infobox  , 0, 12, 13,14);
2086
        $main_table->attach_defaults  ($v3, 0, 12, 0,14);
2087 25 alirezamon
        $main_table->attach ($generate, 6, 8, 14,15,'expand','shrink',2,2);
2088
        $main_table->attach ($open,0, 1, 14,15,'expand','shrink',2,2);
2089 16 alirezamon
 
2090
        #check soc status every 0.5 second. referesh device table if there is any changes 
2091
Glib::Timeout->add (100, sub{
2092
 
2093 25 alirezamon
                my ($state,$timeout)= get_gui_status($ipgen);
2094 16 alirezamon
                if($state eq "load_file"){
2095 24 alirezamon
                        my $file=$ipgen->ipgen_get("file_name");
2096 16 alirezamon
                        my $pp= eval { do $file };
2097
                        clone_obj($ipgen,$pp);
2098
 
2099
 
2100 25 alirezamon
                        set_gui_status($ipgen,"ref",1);
2101 16 alirezamon
 
2102
 
2103
                }elsif ($timeout>0){
2104
                        $timeout--;
2105 25 alirezamon
                        set_gui_status($ipgen,$state,$timeout);
2106 16 alirezamon
                }
2107
                elsif( $state eq "change_parameter" ){
2108 25 alirezamon
                        get_parameter_setting($ipgen,$info);
2109
                        set_gui_status($ipgen,"ideal",0);
2110 16 alirezamon
 
2111
 
2112
 
2113
                }
2114
                elsif( $state ne "ideal" ){
2115
                        $refresh_dev_win->clicked;
2116 25 alirezamon
                        set_gui_status($ipgen,"ideal",0);
2117 16 alirezamon
 
2118
 
2119
                }
2120
                return TRUE;
2121
 
2122
                } );
2123
        $open-> signal_connect("clicked" => sub{
2124 25 alirezamon
                load_ip($ipgen);
2125 16 alirezamon
 
2126
        });
2127
 
2128
        $generate-> signal_connect("clicked" => sub{
2129 25 alirezamon
                get_unused_intfc_ports_list ($intfc,$ipgen,$info);
2130 16 alirezamon
                generate_ip($ipgen);
2131
 
2132
                $refresh_dev_win->clicked;
2133
 
2134
});
2135
 
2136
        #show_selected_dev($info,\@active_dev,\$dev_list_refresh,\$dev_table);
2137
 
2138
 
2139
 
2140
#$box->show;
2141
        #$window->add ($main_table);
2142
        #$window->show_all;
2143
        #return $main_table;
2144
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
2145
                $sc_win->set_policy( "automatic", "automatic" );
2146
                $sc_win->add_with_viewport($main_table);
2147
 
2148
        return $sc_win;
2149
 
2150
 
2151
}
2152
 
2153 17 alirezamon
 
2154
 

powered by: WebSVN 2.1.0

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