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 43

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

powered by: WebSVN 2.1.0

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