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 48

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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