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 34

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

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

powered by: WebSVN 2.1.0

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