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

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
 
6
use mpsoc;
7
use soc;
8
use ip;
9
use interface;
10
 
11
use POSIX 'strtol';
12
 
13
use File::Path;
14
use File::Find;
15
use File::Copy;
16
 
17
use Cwd 'abs_path';
18
 
19
 
20
use Gtk2;
21
use Gtk2::Pango;
22
 
23
 
24
 
25
 
26
require "widget.pl";
27
require "mpsoc_verilog_gen.pl";
28 17 alirezamon
require "hdr_file_gen.pl";
29 16 alirezamon
 
30
 
31 22 alirezamon
sub get_pos{
32
                my ($item,@list)=@_;
33
                my $pos=0;
34
                foreach my $p (@list){
35
                                #print "$p eq $item\n";
36
                                if ($p eq $item){return $pos;}
37
                                $pos++;
38
                }
39
                return undef;
40
 
41
}
42 16 alirezamon
 
43 22 alirezamon
 
44 16 alirezamon
sub noc_param_widget{
45
         my ($mpsoc,$name,$param, $default,$type,$content,$info, $state,$table,$row,$show)=@_;
46
         my $label =gen_label_in_left(" $name");
47
         my $widget;
48
         my $value=$mpsoc->mpsoc_get_param($param);
49
         if(! defined $value) {
50
                        $mpsoc->mpsoc_add_param($param,$default);
51
                        $mpsoc->mpsoc_add_param_order($param);
52
                        $value=$default;
53
         }
54
         if ($type eq "Entry"){
55
                $widget=gen_entry($value);
56
                $widget-> signal_connect("changed" => sub{
57
                        my $new_param_value=$widget->get_text();
58
                        $mpsoc->mpsoc_add_param($param,$new_param_value);
59
                        set_state($state,"ref",10);
60
 
61
                });
62
 
63
 
64
         }
65
         elsif ($type eq "Combo-box"){
66
                 my @combo_list=split(",",$content);
67 22 alirezamon
                 my $pos=get_pos($value, @combo_list);
68
                 if(!defined $pos){
69
                        $mpsoc->mpsoc_add_param($param,$default);
70
                        $pos=get_item_pos($default, @combo_list);
71
 
72
                 }
73 16 alirezamon
                #print " my $pos=get_item_pos($value, @combo_list);\n";
74
                 $widget=gen_combo(\@combo_list, $pos);
75
                 $widget-> signal_connect("changed" => sub{
76
                 my $new_param_value=$widget->get_active_text();
77
                 $mpsoc->mpsoc_add_param($param,$new_param_value);
78
                 set_state($state,"ref",1);
79
 
80
 
81
                 });
82
 
83
         }
84
         elsif  ($type eq "Spin-button"){
85
                  my ($min,$max,$step)=split(",",$content);
86
                  $value=~ s/\D//g;
87
                  $min=~ s/\D//g;
88
                  $max=~ s/\D//g;
89
                  $step=~ s/\D//g;
90
                  $widget=gen_spin($min,$max,$step);
91
                  $widget->set_value($value);
92 24 alirezamon
                  $widget-> signal_connect("value_changed" => sub{
93 16 alirezamon
                  my $new_param_value=$widget->get_value_as_int();
94
                  $mpsoc->mpsoc_add_param($param,$new_param_value);
95
                  set_state($state,"ref",1);
96
 
97
                  });
98
 
99
                 # $box=def_label_spin_help_box ($param,$info, $value,$min,$max,$step, 2);
100
         }
101
 
102
        elsif ( $type eq "Check-box"){
103
                $widget = def_hbox(FALSE,0);
104
                my @check;
105
                for (my $i=0;$i<$content;$i++){
106
                        $check[$i]= Gtk2::CheckButton->new;
107
                }
108
                for (my $i=0;$i<$content;$i++){
109
                        $widget->pack_end(  $check[$i], FALSE, FALSE, 0);
110
 
111
                        my @chars = split("",$value);
112
                        #check if saved value match the size of check box
113
                        if($chars[0] ne $content ) {
114
                                $mpsoc->mpsoc_add_param($param,$default);
115
                                $value=$default;
116
                                @chars = split("",$value);
117
                        }
118
                        #set initial value
119
 
120
                        #print "\@chars=@chars\n";
121
                        for (my $i=0;$i<$content;$i++){
122
                                my $loc= (scalar @chars) -($i+1);
123
                                        if( $chars[$loc] eq '1') {$check[$i]->set_active(TRUE);}
124
                                        else {$check[$i]->set_active(FALSE);}
125
                        }
126
 
127
 
128
                        #get new value
129
                        $check[$i]-> signal_connect("toggled" => sub{
130
                                my $new_val="$content\'b";
131
 
132
                                for (my $i=$content-1; $i >= 0; $i--){
133
                                        if($check[$i]->get_active()) {$new_val="${new_val}1" ;}
134
                                        else {$new_val="${new_val}0" ;}
135
                                }
136
                                $mpsoc->mpsoc_add_param($param,$new_val);
137
                                #print "\$new_val=$new_val\n";
138
                                set_state($state,"ref",1);
139
                        });
140
                }
141
 
142
 
143
 
144
 
145
        }
146
        else {
147
                 $widget =gen_label_in_left("unsuported widget type!");
148
        }
149
 
150
        my $inf_bt= gen_button_message ($info,"icons/help.png");
151
        if($show==1){
152
                my $tmp=gen_label_in_left(" ");
153
                $table->attach_defaults ($label , 0, 4,  $row,$row+1);
154
                $table->attach_defaults ($inf_bt , 4, 5, $row,$row+1);
155
                $table->attach_defaults ($widget , 5, 9, $row,$row+1);
156
                $table->attach_defaults ($tmp , 9, 10, $row,$row+1);
157
                $row++;
158
        }
159
    return $row;
160
}
161
 
162
 
163
sub initial_default_param{
164
        my $mpsoc=shift;
165
        my @socs=$mpsoc->mpsoc_get_soc_list();
166
        foreach my $soc_name (@socs){
167
                my %param_value;
168
                my $top=$mpsoc->mpsoc_get_soc($soc_name);
169
                my @insts=$top->top_get_all_instances();
170
                my @exceptions=('ni0');
171
                @insts=get_diff_array(\@insts,\@exceptions);
172
                foreach my $inst (@insts){
173
                        my @params=$top->top_get_parameter_list($inst);
174
                        foreach my $p (@params){
175
                                my  ($default,$type,$content,$info,$global_param,$redefine)=$top->top_get_parameter($inst,$p);
176
                                $param_value{$p}=$default;
177
                        }
178
                }
179
                $top->top_add_default_soc_param(\%param_value);
180
        }
181
 
182
}
183
 
184
#############
185
#       get_soc_lists
186
############
187
 
188
sub get_soc_list {
189
        my $mpsoc=shift;
190
 
191
        my $path=$mpsoc->mpsoc_get_setting('soc_path');
192 18 alirezamon
        $path =~ s/ /\\ /g;
193
        my @socs;
194 16 alirezamon
        my @files = glob "$path/*.SOC";
195
        for my $p (@files){
196
 
197
                # Read
198
                my  $soc = eval { do $p };
199
                my $top=$soc->soc_get_top();
200
                if (defined $top){
201
                        my @instance_list=$top->top_get_all_instances();
202
                        #check if the soc has ni port
203
                        foreach my $instanc(@instance_list){
204
                                my $module=$top->top_get_def_of_instance($instanc,'module');
205
                                if($module eq 'ni')
206
                                {
207
                                        my $name=$soc->soc_get_soc_name();
208
                                        $mpsoc->mpsoc_add_soc($name,$top);
209
                                        #print" $name\n";
210
                                }
211
                        }
212
 
213
                }
214
 
215
 
216
 
217
 
218
 
219
                #my @instance_list=$soc->soc_get_all_instances();
220
                #my $i=0;
221
 
222
                #check if the soc has ni port
223
                #foreach my $instanc(@instance_list){
224
                #       my $module=$soc->soc_get_module($instanc);
225
                #       if($module eq 'ni') 
226
                #       {
227
                #               my $name=$soc->soc_get_soc_name();                      
228
                #               $mpsoc->mpsoc_add_soc($name,$soc);
229
                #               #print" $name\n";
230
                #       } 
231
                #}      
232
 
233
 
234
        }#files
235
 
236
        # initial  default soc parameter
237
        initial_default_param($mpsoc);
238
 
239
 
240
 
241
        return $mpsoc->mpsoc_get_soc_list;
242
 
243
 
244
 
245
}
246
####################
247
# get_conflict_decision
248
###########################
249
sub b_box{
250
# create a new button
251
        my @label=@_;
252
        my $button = Gtk2::Button->new_from_stock(@label);
253
        my $box=def_vbox(FALSE,5);
254
        $box->pack_start($button,   FALSE, FALSE,0);
255
 
256
        return ($box,$button);
257
 
258
}
259
 
260
sub get_conflict_decision{
261
        my ($mpsoc,$name,$inserted,$conflicts,$msg,$state)=@_;
262 17 alirezamon
        $msg="\tThe inserted tile number(s) have been mapped previously to \n\t\t\"$msg\".\n\tDo you want to remove the conflicted tiles number(s) in newly \n\tinsterd range or remove them from the previous ones? ";
263 16 alirezamon
 
264
        my $wind=def_popwin_size(100,300,"warning");
265
        my $label= gen_label_in_left($msg);
266
        my $table=def_table(2,6,FALSE);
267
        $table->attach_defaults ($label , 0, 6, 0,1);
268
        $wind->add($table);
269
 
270
        my ($box1,$b1)= b_box("Remove Previous");
271
        my ($box2,$b2)= b_box("Remove Current");
272
        my ($box3,$b3)= b_box("Cancel");
273
 
274
        $table->attach_defaults ($box1 , 0, 1, 1,2);
275
        $table->attach_defaults ($box2 , 3, 4, 1,2);
276
        $table->attach_defaults ($box3 , 5, 6, 1,2);
277
 
278
        $wind->show_all();
279
 
280
        $b1->signal_connect( "clicked"=> sub{ #Remove Previous
281
                my @socs=$mpsoc->mpsoc_get_soc_list();
282
                foreach my $p (@socs){
283
                        if($p ne $name){
284
                                my @taken_tiles=$mpsoc->mpsoc_get_soc_tiles_num($p);
285
                                my @diff=get_diff_array(\@taken_tiles,$inserted);
286
                                $mpsoc->mpsoc_add_soc_tiles_num($p,\@diff) if(scalar @diff  );
287
                                $mpsoc->mpsoc_add_soc_tiles_num($p,undef) if(scalar @diff ==0 );
288
                        }
289
                }
290
                $mpsoc->mpsoc_add_soc_tiles_num($name,$inserted) if(defined $inserted  );
291
                set_state($state,"ref",1);
292
                $wind->destroy();
293
 
294
        });
295
 
296
        $b2->signal_connect( "clicked"=> sub{#Remove Current
297
                my @new= get_diff_array($inserted,$conflicts);
298
                $mpsoc->mpsoc_add_soc_tiles_num($name,\@new) if(scalar @new  );
299
                $mpsoc->mpsoc_add_soc_tiles_num($name,undef) if(scalar @new ==0 );
300
                set_state($state,"ref",1);
301
                $wind->destroy();
302
 
303
        });
304
 
305
        $b3->signal_connect( "clicked"=> sub{
306
                $wind->destroy();
307
 
308
        });
309
 
310
}
311
 
312
 
313
 
314
#############
315
#       check_inserted_ip_nums
316
##########
317
 
318
 
319
sub check_inserted_ip_nums{
320
        my  ($mpsoc,$name,$str,$state)=@_;
321
        my @all_num=();
322
        $str= remove_all_white_spaces ($str);
323
 
324
        if($str !~ /^[0-9.:,]+$/){ message_dialog ("The Ip numbers contains invalid character" ); return; }
325
        my @chunks=split(',',$str);
326
        foreach my $p (@chunks){
327
                my @range=split(':',$p);
328
                my $size= scalar @range;
329
                if($size==1){ # its a number
330
                        if ( grep( /^$range[0]$/, @all_num ) ) { message_dialog ("Multiple definition for Ip number $range[0]" ); return; }
331
                        push(@all_num,$range[0]);
332
                }elsif($size ==2){# its a range
333
                        my($min,$max)=@range;
334
                        if($min>$max) {message_dialog ("invalid range: [$p]" ); return;}
335
                        for (my $i=$min; $i<=$max; $i++){
336
                                if ( grep( /^$i$/, @all_num ) ) { message_dialog ("Multiple definition for Ip number $i in $p" ); return; }
337
                                push(@all_num,$i);
338
 
339
                        }
340
 
341
                }else{message_dialog ("invalid range: [$p]" ); return; }
342
 
343
        }
344
        #check if range does not exceed the tile numbers
345
        my $nx= $mpsoc->mpsoc_get_param("NX");
346
        my $ny= $mpsoc->mpsoc_get_param("NY");
347
 
348
        my $max_tile_num=$nx*$ny;
349
        my @f=sort { $a <=> $b }  @all_num;
350
        my @l;
351
        foreach my $num (@f){
352
                push(@l,$num) if($num<$max_tile_num);
353
 
354
        }
355
        @all_num=@l;
356
 
357
        #check if any ip number exists in the rest
358
        my $conflicts_msg;
359
        my @conflicts;
360
 
361
 
362
        my @socs=$mpsoc->mpsoc_get_soc_list();
363
        foreach my $p (@socs){
364
                if($p ne $name){
365
                        my @taken_tiles=$mpsoc->mpsoc_get_soc_tiles_num($p);
366
                        my @c=get_common_array(\@all_num,\@taken_tiles);
367
                        if (scalar @c) {
368
                                my $str=join(',', @c);
369 17 alirezamon
                                $conflicts_msg = (defined $conflicts_msg)? "$conflicts_msg\n\t\t $str->$p" : "$str->$p";
370 16 alirezamon
                                @conflicts= (defined $conflicts_msg)? (@conflicts,@c): @c;
371
                        }
372
                }#if
373
        }
374
        if (defined $conflicts_msg) {
375
                get_conflict_decision($mpsoc,$name,\@all_num,\@conflicts,$conflicts_msg,$state);
376
 
377
        }else {
378
                #save the entered ips
379
                if( scalar @all_num>0){ $mpsoc->mpsoc_add_soc_tiles_num($name,\@all_num);}
380
                else {$mpsoc->mpsoc_add_soc_tiles_num($name,undef);}
381
                set_state($state,"ref",1);
382
        }
383
 
384
 
385
 
386
}
387
 
388
 
389
 
390
 
391
#################
392
# get_soc_parameter_setting
393
################
394
 
395
sub get_soc_parameter_setting{
396
        my ($mpsoc,$soc_name,$state,$tile)=@_;
397
 
398
        my $window = (defined $tile)? def_popwin_size(600,400,"Parameter setting for $soc_name located in tile($tile) "):def_popwin_size(600,400,"Default Parameter setting for $soc_name ");
399
        my $table = def_table(10, 7, TRUE);
400
 
401
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
402
        $scrolled_win->set_policy( "automatic", "automatic" );
403
        $scrolled_win->add_with_viewport($table);
404
        my $row=0;
405
 
406
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
407
 
408
        #read soc parameters
409
        my %param_value=(defined $tile) ? $top->top_get_custom_soc_param($tile)  : $top->top_get_default_soc_param();
410
 
411
 
412
 
413
        my @insts=$top->top_get_all_instances();
414
        my @exceptions=('ni0');
415
        @insts=get_diff_array(\@insts,\@exceptions);
416
        foreach my $inst (@insts){
417
                my @params=$top->top_get_parameter_list($inst);
418
                foreach my $p (@params){
419
                        my  ($default,$type,$content,$info,$global_param,$redefine)=$top->top_get_parameter($inst,$p);
420
 
421
                        if ($type eq "Entry"){
422
                                my $entry=gen_entry($param_value{$p});
423
                                $table->attach_defaults ($entry, 3, 6, $row, $row+1);
424
                                $entry-> signal_connect("changed" => sub{$param_value{$p}=$entry->get_text();});
425
                        }
426
                        elsif ($type eq "Combo-box"){
427
                                my @combo_list=split(",",$content);
428
                                my $pos=get_item_pos($param_value{$p}, @combo_list);
429
                                my $combo=gen_combo(\@combo_list, $pos);
430
                                $table->attach_defaults ($combo, 3, 6, $row, $row+1);
431
                                $combo-> signal_connect("changed" => sub{$param_value{$p}=$combo->get_active_text();});
432
 
433
                        }
434
                        elsif   ($type eq "Spin-button"){
435
                                my ($min,$max,$step)=split(",",$content);
436
                                $param_value{$p}=~ s/\D//g;
437
                                $min=~ s/\D//g;
438
                                $max=~ s/\D//g;
439
                                $step=~ s/\D//g;
440
                                my $spin=gen_spin($min,$max,$step);
441
                                $spin->set_value($param_value{$p});
442
                                $table->attach_defaults ($spin, 3, 4, $row, $row+1);
443 24 alirezamon
                                $spin-> signal_connect("value_changed" => sub{$param_value{$p}=$spin->get_value_as_int();});
444 16 alirezamon
 
445
                 # $box=def_label_spin_help_box ($param,$info, $value,$min,$max,$step, 2);
446
                        }
447
                        my $label =gen_label_in_center($p);
448
                        $table->attach_defaults ($label, 0, 3, $row, $row+1);
449
                        if (defined $info){
450
                        my $info_button=def_image_button('icons/help.png');
451
                        $table->attach_defaults ($info_button, 6, 7, $row, $row+1);
452
                        $info_button->signal_connect('clicked'=>sub{
453
                                message_dialog($info);
454
 
455
                        });
456
 
457
                }
458
 
459
                        $row++;
460
 
461
 
462
                }
463
        }
464
        #my @parameters=$ip->ip_get_module_parameters($category,$module);
465
 
466
 
467
 
468
 
469
 
470
 
471
 
472
 
473
 
474
 
475
 
476
 
477
 
478
 
479
 
480
 
481
 
482
 
483
 
484
 
485
 
486
        my $ok = def_image_button('icons/select.png','OK');
487
        my $okbox=def_hbox(TRUE,0);
488
        $okbox->pack_start($ok, FALSE, FALSE,0);
489
 
490
 
491
        my $mtable = def_table(10, 1, TRUE);
492
 
493
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
494
        $mtable->attach_defaults($okbox,0,1,9,10);
495
 
496
        $window->add ($mtable);
497
        $window->show_all();
498
 
499
        $ok-> signal_connect("clicked" => sub{
500
                $window->destroy;
501
                #save new values 
502
                if(!defined $tile ) {
503
                        $top->top_add_default_soc_param(\%param_value);
504
                }
505
                else {
506
                        $top->top_add_custom_soc_param(\%param_value,$tile);
507
 
508
                }
509
                #set_state($soc_state,"refresh_soc",1);
510
                #$$refresh_soc->clicked;
511
 
512
                });
513
 
514
 
515
 
516
}
517
 
518
 
519
 
520
 
521
 
522
 
523
 
524
################
525
#       tile_set_widget
526
################
527
 
528
sub tile_set_widget{
529
        my ($mpsoc,$soc_name,$num,$table,$state,$show,$row)=@_;
530
        #my $lable=gen_label_in_left($soc);
531
        my @all_num= $mpsoc->mpsoc_get_soc_tiles_num($soc_name);
532
        my $init=compress_nums(@all_num);
533
        my $entry;
534
        if (defined $init){$entry=gen_entry($init) ;}
535
        else                      {$entry=gen_entry();}
536
        my $set= def_image_button('icons/right.png');
537
        my $remove= def_image_button('icons/cancel.png');
538
        #my $setting= def_image_button('icons/setting.png','setting');
539
 
540
 
541
        my $button = def_colored_button($soc_name,$num);
542
        $button->signal_connect("clicked"=> sub{
543
                get_soc_parameter_setting($mpsoc,$soc_name,$state,undef);
544
 
545
        });
546
 
547
 
548
        $set->signal_connect("clicked"=> sub{
549
                my $data=$entry->get_text();
550
                check_inserted_ip_nums($mpsoc,$soc_name,$data,$state);
551
 
552
 
553
 
554
        });
555
        $remove->signal_connect("clicked"=> sub{
556
                $mpsoc->mpsoc_remove_soc($soc_name);
557
                set_state($state,"ref",1);
558
 
559
        });
560
 
561
 
562
if($show){
563
        $table->attach_defaults ( $button, 0, 4, $row,$row+1);
564
        $table->attach_defaults ( $remove, 4, 5, $row,$row+1);
565
        $table->attach_defaults ( $entry , 5, 9, $row,$row+1);
566
        $table->attach_defaults ( $set, 9, 10, $row,$row+1);
567
 
568
 
569
 
570
        $row++;
571
}
572
 
573
        return $row;
574
 
575
 
576
}
577
 
578
 
579
 
580
 
581
 
582
##################
583
#       defualt_tilles_setting
584
###################
585
 
586
sub defualt_tilles_setting {
587
        my ($mpsoc,$state,$table,$show,$row)=@_;
588
 
589
        #title  
590
        my $separator1 = Gtk2::HSeparator->new;
591
        my $separator2 = Gtk2::HSeparator->new;
592
        my $title2=gen_label_in_center("Tile Configuration");
593
        my $box1=def_vbox(FALSE, 1);
594
        $box1->pack_start( $separator1, FALSE, FALSE, 3);
595
        $box1->pack_start( $title2, FALSE, FALSE, 3);
596
        $box1->pack_start( $separator2, FALSE, FALSE, 3);
597
        if($show){$table->attach_defaults ($box1 ,0,10, $row,$row+1);$row++;}
598
 
599
 
600
 
601
 
602
        my $label = gen_label_in_left("Tiles path:");
603
        my $entry = Gtk2::Entry->new;
604
        my $browse= def_image_button("icons/browse.png");
605
        my $file= $mpsoc->mpsoc_get_setting('soc_path');
606
        if(defined $file){$entry->set_text($file);}
607
 
608
 
609
        $browse->signal_connect("clicked"=> sub{
610
                my $entry_ref=$_[1];
611
                my $file;
612
 
613
 
614
 
615
 
616
 
617
        my $dialog = Gtk2::FileChooserDialog->new(
618
                'Select tile directory', undef,
619
                #               'open',
620
                'select-folder',
621
                'gtk-cancel' => 'cancel',
622
                'gtk-ok'     => 'ok',
623
                );
624
 
625
 
626
                if ( "ok" eq $dialog->run ) {
627
                        $file = $dialog->get_filename;
628
                        $$entry_ref->set_text($file);
629
                        $mpsoc->mpsoc_set_setting('soc_path',$file);
630
                        $mpsoc->mpsoc_remove_all_soc();
631
                        set_state($state,"ref",1);
632
                        #check_input_file($file,$socgen,$soc_state,$info);
633
                        #print "file = $file\n";
634
                 }
635
                $dialog->destroy;
636
 
637
 
638
 
639
        } , \$entry);
640
 
641
 
642
 
643
 
644
        $entry->signal_connect("activate"=>sub{
645
                my $file_name=$entry->get_text();
646
                $mpsoc->mpsoc_set_setting('soc_path',$file_name);
647
                $mpsoc->mpsoc_remove_all_soc();
648
                set_state($state,"ref",1);
649
                #check_input_file($file_name,$socgen,$soc_state,$info);
650
        });
651
 
652
 
653
 
654
        if($show){
655
                my $tmp=gen_label_in_left(" ");
656
                $table->attach_defaults ($label, 0, 4 , $row,$row+1);
657
                $table->attach_defaults ($tmp, 4, 5 , $row,$row+1);
658
                $table->attach_defaults ($entry, 5, 9 , $row,$row+1);
659
                $table->attach_defaults ($browse, 9, 10, $row,$row+1);
660
                $row++;
661
        }
662
 
663
 
664
 
665
        my @socs=$mpsoc->mpsoc_get_soc_list();
666
        if( scalar @socs == 0){
667
                @socs=get_soc_list($mpsoc);
668
 
669
        }
670
        @socs=$mpsoc->mpsoc_get_soc_list();
671
 
672
 
673
 
674
        my $lab1=gen_label_in_center(' Tile name');
675
 
676
        my $lab2=gen_label_help('Define the tile numbers that each IP is mapped to.
677
you can add individual numbers or ranges as follow
678
        eg: 0,2,5:10
679
        ', ' Tile numbers ');
680
        if($show){
681
                $table->attach_defaults ($lab1 ,0,3, $row,$row+1);
682
                $table->attach_defaults ($lab2 ,5,10, $row,$row+1);$row++;
683
        }
684
 
685
 
686
 
687
        my $soc_num=0;
688
        foreach my $soc_name (@socs){
689
                $row=tile_set_widget ($mpsoc,$soc_name,$soc_num,$table,$state,$show,$row);
690
                $soc_num++;
691
 
692
 
693
 
694
 
695
        }
696
 
697
 
698
 
699
 
700
 
701
        return $row;
702
 
703
 
704
}
705
 
706
 
707
 
708
 
709
 
710
 
711
 
712
 
713
#######################
714
#   noc_config
715
######################
716
 
717
sub noc_config{
718
        my ($mpsoc,$state)=@_;
719
        my $table=def_table(20,10,FALSE);#      my ($row,$col,$homogeneous)=@_;
720
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
721
        $scrolled_win->set_policy( "automatic", "automatic" );
722
        $scrolled_win->add_with_viewport($table);
723
 
724
 
725
        #title  
726
        my $title=gen_label_in_center("NoC Configuration");
727
        my $box=def_vbox(FALSE, 1);
728
        $box->pack_start( $title, FALSE, FALSE, 3);
729
        my $separator = Gtk2::HSeparator->new;
730
        $box->pack_start( $separator, FALSE, FALSE, 3);
731
        $table->attach_defaults ($box , 0, 10, 0,1);
732
 
733
        my $label;
734
        my $param;
735
        my $default;
736
        my $type;
737
        my $content;
738
        my $info;
739
        my $row=1;
740
 
741
        #parameter start
742
        my $b1;
743
        my $show_noc=$mpsoc->mpsoc_get_setting('show_noc_setting');
744
        if($show_noc == 0){
745
                $b1= def_image_button("icons/down.png","NoC Parameters");
746
                $label=gen_label_in_center(' ');
747
                $table->attach_defaults ( $label , 2, 10, $row,$row+1);
748
                $table->attach_defaults ( $b1 , 0, 4, $row,$row+1);$row++;
749
        }
750
 
751 22 alirezamon
 
752
        #Router type
753
        $label='Router Type';
754
        $param='ROUTER_TYPE';
755
        $default='"VC_BASED"';
756
        $content='"INPUT_QUEUED","VC_BASED"';
757
        $type='Combo-box';
758
    $info="    Input-queued: simple router with low performance and does not support fully adaptive routing.
759
    VC-based routers offer higher performance, fully adaptive routing  and traffic isolation for different packet classes.";
760
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
761
        my $router_type=$mpsoc->mpsoc_get_param("ROUTER_TYPE");
762
 
763
 
764 16 alirezamon
        #P port number 
765
        $label= 'Port Number';
766
        $param= 'P';
767
    $default=' 5';
768
        $content='3,12,1';
769
    $info= 'Number of NoC router port';
770
    $type= 'Spin-button';
771
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
772
 
773 22 alirezamon
 
774 16 alirezamon
 
775
        #Routers per row
776
        $label= 'Routers per row';
777
        $param= 'NX';
778
    $default=' 2';
779
        $content='2,16,1';
780
    $info= 'Number of NoC routers in row (X dimention)';
781
    $type= 'Spin-button';
782
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
783
 
784
 
785
 
786
        #Routers per column
787
        $label= 'Routers per column';
788
        $param= 'NY';
789
    $default=' 2';
790
        $content='2,16,1';
791
    $info= 'Number of NoC routers in column (Y dimention)';
792
    $type= 'Spin-button';
793
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
794
 
795 22 alirezamon
        if($router_type eq '"VC_BASED"'){
796
                #VC number per port
797
                my $v=$mpsoc->mpsoc_get_param('V');
798 23 alirezamon
                if(defined $v){ $mpsoc->mpsoc_add_param('V',2) if($v eq 1);}
799 22 alirezamon
                $label='VC number per port';
800
                $param='V';
801
                $default='2';
802
                $type='Spin-button';
803
                $content='2,16,1';
804
                $info='Number of Virtual Channel per each router port';
805
                $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
806
        } else {
807
                $mpsoc->mpsoc_add_param('V',1);
808
                $mpsoc->mpsoc_add_param('C',0);
809
 
810
 
811
        }
812
 
813 16 alirezamon
        #buffer width per VC
814 22 alirezamon
        $label=($router_type eq '"VC_BASED"')? 'Buffer flits per VC': "Buffer flits";
815 16 alirezamon
        $param='B';
816
    $default='4';
817
    $content='2,256,1';
818
    $type='Spin-button';
819 22 alirezamon
        $info=($router_type eq '"VC_BASED"')?  'Buffer queue size per VC in flits' : 'Buffer queue size in flits';
820 16 alirezamon
    $row= noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
821
 
822
        #packet payload width
823
        $label='payload width';
824
        $param='Fpay';
825
        $default='32';
826
        $content='32,256,32';
827
        $type='Spin-button';
828
    $info="The packet payload width in bits";
829
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
830
 
831
        #topology
832
        $label='Topology';
833
        $param='TOPOLOGY';
834
        $default='"MESH"';
835
        $content='"MESH","TORUS"';
836
        $type='Combo-box';
837
    $info="NoC topology";
838
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
839
 
840
        #routing algorithm
841
        my $topology=$mpsoc->mpsoc_get_param('TOPOLOGY');
842
        $label='Routing Algorithm';
843
        $param="ROUTE_NAME";
844
        $type="Combo-box";
845 22 alirezamon
        if($router_type eq '"VC_BASED"'){
846
                $content=($topology eq '"MESH"')?  '"XY","WEST_FIRST","NORTH_LAST","NEGETIVE_FIRST","DUATO"' :
847
                                                    '"TRANC_XY","TRANC_WEST_FIRST","TRANC_NORTH_LAST","TRANC_NEGETIVE_FIRST","TRANC_DUATO"';
848
 
849
        }else{
850
                $content=($topology eq '"MESH"')?  '"XY","WEST_FIRST","NORTH_LAST","NEGETIVE_FIRST"' :
851
                                                    '"TRANC_XY","TRANC_WEST_FIRST","TRANC_NORTH_LAST","TRANC_NEGETIVE_FIRST"';
852
 
853
 
854
        }
855 16 alirezamon
        $default=($topology eq '"MESH"')?  '"XY"':'"TRANC_XY"';
856
        $info="Select the routing algorithm: XY(DoR) , partially adaptive (Turn models). Fully adaptive (Duato) ";
857
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$show_noc);
858
 
859
 
860
        if($show_noc == 1){
861
                $b1= def_image_button("icons/up.png","NoC Parameters");
862
                $table->attach_defaults ( $b1 , 0, 2, $row,$row+1);$row++;
863
        }
864
        $b1->signal_connect("clicked" => sub{
865
                $show_noc=($show_noc==1)?0:1;
866
                $mpsoc->mpsoc_set_setting('show_noc_setting',$show_noc);
867
                set_state($state,"ref",1);
868
 
869
        });
870
 
871
        #advance parameter start
872
        my $advc;
873
        my $adv_set=$mpsoc->mpsoc_get_setting('show_adv_setting');
874
        if($adv_set == 0){
875
                $advc= def_image_button("icons/down.png","Advance Parameters");
876
                $table->attach_defaults ( $advc , 0, 4, $row,$row+1);$row++;
877
 
878
        }
879
 
880
 
881
 
882
        #Fully and partially adaptive routing setting
883
                my $route=$mpsoc->mpsoc_get_param("ROUTE_NAME");
884
                if($route ne '"XY"' and $route ne '"TRANC_XY"' ){
885
                        $label="Congestion index";
886
                        $param="CONGESTION_INDEX";
887
                        $type="Spin-button";
888
                        $content="0,12,1";
889
                        $info="Congestion index determines how congestion information is collected from neighboring routers. Please refer to the usere manual for more information";
890 22 alirezamon
                    $default=3;
891 16 alirezamon
                        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
892
 
893
                }
894 22 alirezamon
                #Fully adaptive routing setting
895
                if( $route eq '"TRANC_DUATO"' or $route eq '"DUATO"'  ){
896
                         my $v=$mpsoc->mpsoc_get_param("V");
897
                         $label="Select Escap VC";
898
                         $param="ESCAP_VC_MASK";
899
                         $type="Check-box";
900
                         $content=$v;
901
                         $default="$v\'b";
902
                         for (my $i=1; $i<=$v-1; $i++){$default=  "${default}0";}
903
                         $default=  "${default}1";
904
 
905 16 alirezamon
 
906 22 alirezamon
                         $info="Select the escap VC for fully adaptive routing.";
907
                         $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set,$adv_set);
908
 
909
                 }
910
 
911 16 alirezamon
        # VC reallocation type
912 22 alirezamon
                $label=($router_type eq '"VC_BASED"')? 'VC reallocation type': 'Queue reallocation type';
913 16 alirezamon
                $param='VC_REALLOCATION_TYPE';
914 22 alirezamon
                $info="VC reallocation type: If set as atomic only empty VCs can be allocated for new packets. Whereas, in non-atomic a non-empty VC which has received the last packet tail flit can accept a new  packet";
915 16 alirezamon
                $default='"NONATOMIC"';
916
                $content='"ATOMIC","NONATOMIC"';
917
                $type='Combo-box';
918
                $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
919
 
920
 
921
 
922
 
923 22 alirezamon
        if ($router_type eq '"VC_BASED"'){
924 16 alirezamon
        #vc/sw allocator type
925
                $label = 'VC/SW combination type';
926
                $param='COMBINATION_TYPE';
927 22 alirezamon
                $default='"COMB_NONSPEC"';
928 16 alirezamon
                $content='"BASELINE","COMB_SPEC1","COMB_SPEC2","COMB_NONSPEC"';
929
                $type='Combo-box';
930
                $info="The joint VC/ switch allocator type. using canonical combination is not recommanded";
931
                $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
932
 
933 22 alirezamon
        }
934
 
935 16 alirezamon
        # Crossbar mux type 
936
                $label='Crossbar mux type';
937
                $param='MUX_TYPE';
938
                $default='"BINARY"';
939
                $content='"ONE_HOT","BINARY"';
940
                $type='Combo-box';
941
                $info="Crossbar multiplexer type";
942
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
943
 
944 22 alirezamon
        if($router_type eq '"VC_BASED"'){
945 16 alirezamon
        #class
946
                $label='class number';
947
                $param='C';
948
                $default= 0;
949
                $info='Number of message classes. Each specific class can use different set of VC';
950
                $content='0,16,1';
951
            $type='Spin-button';
952
            $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
953
 
954
 
955
                my $class=$mpsoc->mpsoc_get_param("C");
956
                my $v=$mpsoc->mpsoc_get_param("V");
957
                $default= "$v\'b";
958
                for (my $i=1; $i<=$v; $i++){
959
                        $default=  "${default}1";
960
                }
961
                #print "\$default=$default\n";
962
                for (my $i=0; $i<=$class-1; $i++){
963
 
964
                         $label="Class $i Permitted VCs";
965
                         $param="Cn_$i";
966
                         $type="Check-box";
967
                         $content=$v;
968
                         $info="Select the permitted VCs which the message class $i can be sent via them.";
969
                         $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
970
 
971
 
972
                }
973
 
974
 
975 22 alirezamon
 
976
        }#($router_type eq '"VC_BASED"')
977 16 alirezamon
 
978 22 alirezamon
 
979 16 alirezamon
 
980
         #simulation debuge enable     
981
                $label='Debug enable';
982
                $param='DEBUG_EN';
983
                $info= "Add extra verilog code for debuging NoC for simulation";
984
                $default='0';
985
                $content='0,1';
986
                $type='Combo-box';
987
                $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,$adv_set);
988
 
989
 
990
 
991
 
992
 
993
        $label="Add pipeline reg after crossbar";
994
        $param="ADD_PIPREG_AFTER_CROSSBAR";
995
        $type="Check-box";
996
        $content=1;
997
        $default="1\'b0";
998
        $info="If ebabled it adds a pipline register at the output port of the router.";
999 22 alirezamon
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1000 16 alirezamon
 
1001
 
1002
        $label="Add pipeline reg befor crossbar";
1003
        $param="ADD_PIPREG_BEFORE_CROSSBAR";
1004
        $type="Check-box";
1005
        $content=1;
1006
        $default="1\'b0";
1007
        $info="If ebabled it adds a pipline register after the input memory sd ram.";
1008 22 alirezamon
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1009 16 alirezamon
 
1010
 
1011
 
1012
        if($adv_set == 1){
1013
                $advc= def_image_button("icons/up.png","Advance Parameters");
1014
                $table->attach_defaults ( $advc , 0, 4, $row,$row+1);$row++;
1015
        }
1016
        $advc->signal_connect("clicked" => sub{
1017
                $adv_set=($adv_set==1)?0:1;
1018
                $mpsoc->mpsoc_set_setting('show_adv_setting',$adv_set);
1019
                set_state($state,"ref",1);
1020
 
1021
 
1022
        });
1023
 
1024
 
1025
        #other fixed parameters       
1026
 
1027
 
1028
        #FIRST_ARBITER_EXT_P_EN
1029
        $label='FIRST_ARBITER_EXT_P_EN';
1030
        $param='FIRST_ARBITER_EXT_P_EN';
1031
        $default= 0;
1032
        $info='FIRST_ARBITER_EXT_P_EN';
1033
        $content='0,1';
1034
        $type="Combo-box";
1035
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1036
 
1037
        #ROUTE_TYPE
1038
        $param='ROUTE_TYPE';
1039
        $default='(ROUTE_NAME == "XY" || ROUTE_NAME == "TRANC_XY" )?    "DETERMINISTIC" :
1040
                         (ROUTE_NAME == "DUATO" || ROUTE_NAME == "TRANC_DUATO" )?   "FULL_ADAPTIVE": "PAR_ADAPTIVE"';
1041
        $info='ROUTE_TYPE';
1042
        $type="Entry";
1043
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1044
 
1045
        # AVC_ATOMIC_EN
1046
        $label='AVC_ATOMIC_EN';
1047
        $param='AVC_ATOMIC_EN';
1048
        $default= 0;
1049
        $info='AVC_ATOMIC_EN';
1050
        $content='0,1';
1051
        $type="Combo-box";
1052
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1053
 
1054
 
1055
        #ROUTE_SUBFUNC
1056
        $label='ROUTE_SUBFUNC';
1057
        $param='ROUTE_SUBFUNC';
1058
        $default= '"XY"';
1059
        $info='ROUTE_SUBFUNC';
1060
        $content='"XY"';
1061
        $type="Combo-box";
1062
        $row=noc_param_widget ($mpsoc,$label,$param, $default,$type,$content,$info, $state,$table,$row,0);
1063
 
1064
        #tile setting 
1065
        my $tile_set;
1066
        my $show=$mpsoc->mpsoc_get_setting('show_tile_setting');
1067
        if($show == 0){
1068
                $tile_set= def_image_button("icons/down.png","Tiles setting");
1069
                $table->attach_defaults ( $tile_set , 0, 4, $row,$row+1);$row++;
1070
 
1071
        }
1072
 
1073
 
1074
 
1075
 
1076
 
1077
        $row=defualt_tilles_setting($mpsoc,$state,$table,$show,$row);
1078
 
1079
 
1080
 
1081
 
1082
 
1083
 
1084
 
1085
 
1086
        #end tile setting
1087
        if($show == 1){
1088
                $tile_set= def_image_button("icons/up.png","Tiles setting");
1089
                $table->attach_defaults ( $tile_set , 0, 1, $row,$row+1);$row++;
1090
        }
1091
        $tile_set->signal_connect("clicked" => sub{
1092
                $show=($show==1)?0:1;
1093
                $mpsoc->mpsoc_set_setting('show_tile_setting',$show);
1094
                set_state($state,"ref",1);
1095
 
1096
 
1097
        });
1098
 
1099
 
1100
 
1101
 
1102
        for(my $i=$row; $i<25; $i++){
1103
                my $empty_col=gen_label_in_left(' ');
1104
                $table->attach_defaults ($empty_col , 0, 1, $i,$i+1);
1105
 
1106
        }
1107
 
1108
 
1109
 
1110
 
1111
 
1112
 
1113
return  $scrolled_win;
1114
 
1115
}
1116
 
1117
 
1118
#############
1119
#
1120
###########
1121
 
1122
sub gen_socs {
1123
        my ($mpsoc,$info)=@_;
1124
 
1125
        my $path=$mpsoc->mpsoc_get_setting('soc_path');
1126 18 alirezamon
        $path=~ s/ /\\ /g;
1127
        my @socs;
1128 16 alirezamon
        my @files = glob "$path/*.SOC";
1129
        my @soc_list=$mpsoc-> mpsoc_get_soc_list();
1130
        my @used_socs;
1131
        foreach my $soc_name (@soc_list){
1132
                my @n=$mpsoc->mpsoc_get_soc_tiles_num($soc_name);
1133
                if(scalar @n){
1134 24 alirezamon
                        #generate the verilog files of it
1135 16 alirezamon
                        push(@used_socs,$soc_name);
1136
                }
1137
        }
1138
 
1139
        for my $p (@files){
1140
                # Read
1141
                my  $soc = eval { do $p };
1142
                my  $name=$soc->soc_get_soc_name();
1143
                if( grep (/^$name$/,@used_socs)){
1144
                #generate the soc
1145
                generate_soc_files($mpsoc,$soc,$info);
1146
 
1147
 
1148
 
1149
 
1150
                };
1151
 
1152
 
1153
        }
1154
 
1155
 
1156
}
1157
 
1158
################
1159
#       generate_soc
1160
#################
1161
 
1162
sub generate_soc_files{
1163
        my ($mpsoc,$soc,$info)=@_;
1164
        my $mpsoc_name=$mpsoc->mpsoc_get_mpsoc_name();
1165
        my $soc_name=$soc->soc_get_soc_name();
1166
        my $file_v=soc_generate_verilog($soc);
1167
 
1168
        # Write object file
1169
        open(FILE,  ">lib/soc/$soc_name.SOC") || die "Can not open: $!";
1170
        print FILE Data::Dumper->Dump([\%$soc],[$soc_name]);
1171
        close(FILE) || die "Error closing file: $!";
1172
 
1173
        # Write verilog file
1174
        open(FILE,  ">lib/verilog/$soc_name.v") || die "Can not open: $!";
1175
        print FILE $file_v;
1176
        close(FILE) || die "Error closing file: $!";
1177
 
1178
 
1179
 
1180
 
1181
        # copy all files in project work directory
1182
        my $dir = Cwd::getcwd();
1183
        #make target dir
1184
        my $project_dir   = abs_path("$dir/../../");
1185
        my $target_dir  = "$project_dir/mpsoc_work/MPSOC/$mpsoc_name";
1186
        mkpath("$target_dir/src_verilog/lib/",1,0755);
1187
        mkpath("$target_dir/src_verilog/tiles/",1,0755);
1188
        mkpath("$target_dir/sw",1,0755);
1189
 
1190
    #copy hdl codes in src_verilog
1191
 
1192 18 alirezamon
    my ($hdl_ref,$warnings)= get_all_files_list($soc,"hdl_files");
1193 16 alirezamon
    foreach my $f(@{$hdl_ref}){
1194 18 alirezamon
 
1195 16 alirezamon
        my $n="$project_dir$f";
1196
         if (-f "$n") {
1197
                        copy ("$n","$target_dir/src_verilog/lib");
1198
         }elsif(-f "$f" ){
1199
                        copy ("$f","$target_dir/src_verilog/lib");
1200
 
1201
         }
1202
 
1203
 
1204
    }
1205
                        show_info(\$info,$warnings)                     if(defined $warnings);
1206
 
1207
 
1208
                #my @pathes=("$dir/../src_peripheral","$dir/../src_noc","$dir/../src_processor");
1209
                #foreach my $p(@pathes){
1210
                #       find(
1211
                #               sub {
1212
                #                       return unless ( -f $_ );
1213
                #                       $_ =~ /\.v$/ && copy( $File::Find::name, "$target_dir/src_verilog/lib/" );
1214
                #               },
1215
                #       $p
1216
                        #       );
1217
                #}
1218
 
1219
 
1220 18 alirezamon
                move ("$dir/lib/verilog/$soc_name.v","$target_dir/src_verilog/tiles/");
1221 16 alirezamon
                copy_noc_files($project_dir,"$target_dir/src_verilog/lib");
1222
 
1223
 
1224
                # Write header file
1225 24 alirezamon
                        generate_header_file($soc,$project_dir,$target_dir,$dir);
1226 16 alirezamon
 
1227
 
1228
 
1229
 
1230 24 alirezamon
 
1231 18 alirezamon
                        #use File::Copy::Recursive qw(dircopy);
1232
                        #dircopy("$dir/../src_processor/aeMB/compiler","$target_dir/sw/") or die("$!\n");
1233 16 alirezamon
 
1234
 
1235
                        my $msg="SoC \"$soc_name\" has been created successfully at $target_dir/ ";
1236
 
1237
 
1238
 
1239
 
1240
return $msg;
1241
}
1242
 
1243
 
1244
################
1245
#       generate_mpsoc
1246
#################
1247
 
1248
sub generate_mpsoc{
1249
        my ($mpsoc,$info)=@_;
1250
        my $name=$mpsoc->mpsoc_get_mpsoc_name();
1251
                my $size= (defined $name)? length($name) :0;
1252
                if ($size >0){
1253
                        my $file_v=mpsoc_generate_verilog($mpsoc);
1254
 
1255
                        # Write object file
1256
                        open(FILE,  ">lib/mpsoc/$name.MPSOC") || die "Can not open: $!";
1257
                        print FILE Data::Dumper->Dump([\%$mpsoc],[$name]);
1258
                        close(FILE) || die "Error closing file: $!";
1259
 
1260
                        # Write verilog file
1261
                        open(FILE,  ">lib/verilog/$name.v") || die "Can not open: $!";
1262
                        print FILE $file_v;
1263
                        close(FILE) || die "Error closing file: $!";
1264
 
1265
 
1266
 
1267
 
1268
                        # copy all files in project work directory
1269
                        my $dir = Cwd::getcwd();
1270
                        #make target dir
1271
                        my $project_dir   = abs_path("$dir/../../");
1272
                        my $target_dir  = "$project_dir/mpsoc_work/MPSOC/$name";
1273
                        mkpath("$target_dir/src_verilog/lib/",1,0755);
1274
                        mkpath("$target_dir/sw",1,0755);
1275
 
1276
                gen_socs($mpsoc,$info);
1277
 
1278 18 alirezamon
                move ("$dir/lib/verilog/$name.v","$target_dir/src_verilog/");
1279 16 alirezamon
 
1280
 
1281
 
1282
 
1283
 
1284
 
1285
 
1286
 
1287
                        message_dialog("SoC \"$name\" has been created successfully at $target_dir/ " );
1288
 
1289
                }else {
1290
                        message_dialog("Please define the MPSoC name!");
1291
 
1292
                }
1293
 
1294
return 1;
1295
}
1296
 
1297
 
1298
 
1299
 
1300
sub get_tile_LIST{
1301
        my ($mpsoc,$state,$x,$y,$soc_num,$row,$table)=@_;
1302
        my $instance_name=$mpsoc->mpsoc_get_instance_info($soc_num);
1303
        if(!defined $instance_name){
1304
                $mpsoc->mpsoc_set_default_ip($soc_num);
1305
                $instance_name=$mpsoc->mpsoc_get_instance_info($soc_num);
1306
 
1307
        }
1308
 
1309
        #ipname
1310
        my $col=0;
1311
        my $label=gen_label_in_left("IP_$soc_num($x,$y)");
1312
        $table->attach_defaults ( $label, $col, $col+1 , $row, $row+1);$col+=2;
1313
        #instance name
1314
        my $entry=gen_entry($instance_name);
1315
        $table->attach_defaults ( $entry, $col, $col+1 , $row, $row+1);$col+=2;
1316
        $entry->signal_connect( 'changed'=> sub{
1317
                my $new_instance=$entry->get_text();
1318
                $mpsoc->mpsoc_set_ip_inst_name($soc_num,$new_instance);
1319
                set_state($state,"ref",20);
1320
                print "changed to  $new_instance\n ";
1321
 
1322
        });
1323
 
1324
 
1325
        #combo box
1326
        my @list=('A','B');
1327
        my $combo=gen_combo(\@list,0);
1328
        $table->attach_defaults ( $combo, $col, $col+1 , $row, $row+1);$col+=2;
1329
        #setting
1330
        my $setting= def_image_button("icons/setting.png","Browse");
1331
        $table->attach_defaults ( $setting, $col, $col+1 , $row, $row+1);$col+=2;
1332
 
1333
 
1334
}
1335
 
1336
 
1337
 
1338
 
1339
##########
1340
#
1341
#########
1342
 
1343
sub gen_tiles_LIST{
1344
        my ($mpsoc,$soc_state)=@_;
1345
 
1346
        my $nx= $mpsoc->mpsoc_get_param("NX");
1347
        my $ny= $mpsoc->mpsoc_get_param("NY");
1348
 
1349
        # print "($nx,$ny);\n";
1350
        my $table=def_table($nx*$ny,4,FALSE);#  my ($row,$col,$homogeneous)=@_;
1351
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
1352
        $scrolled_win->set_policy( "automatic", "automatic" );
1353
        $scrolled_win->add_with_viewport($table);
1354
 
1355
 
1356
    my @titles=("IP_num(x,y)","Instance name","IP module name","setting");
1357
        my $col=0;
1358
    my $row=0;
1359
        foreach my$p(@titles){
1360
                my $label=gen_label_in_left($p);
1361
            $table->attach_defaults ($label, $col, $col+1 , $row, $row+1);$col++;
1362
                my $sepv = Gtk2::VSeparator->new;
1363
                $table->attach_defaults ($sepv, $col , $col+1 ,0 , 2*($nx*$ny)+2 );$col++;
1364
 
1365
        }$row+=2;
1366
 
1367
 
1368
        $col=0;
1369
        for (my $y=0;$y<$ny;$y++){
1370
 
1371
 
1372
 
1373
                for (my $x=0; $x<$nx;$x++){
1374
                        my $soc_num= $y*$nx+$x;
1375
                        my $seph = Gtk2::HSeparator->new;
1376
                        $table->attach_defaults ($seph, 0, 8 , $row, $row+1);$row++;
1377
                        get_tile($mpsoc,$soc_state,$x,$y,$soc_num,$row,$table);$row++;
1378
 
1379
 
1380
 
1381
 
1382
        }}
1383
        my $seph = Gtk2::HSeparator->new;
1384
        $table->attach_defaults ($seph, 0, 8 , $row, $row+1);$row++;
1385
 
1386
   while( $row<30){
1387
                my $label=gen_label_in_left(' ');
1388
            $table->attach_defaults ($label, $col, $col+1 , $row, $row+1);$row++;
1389
 
1390
 
1391
 
1392
        }
1393
 
1394
 
1395
        return $scrolled_win;
1396
}
1397
 
1398
 
1399
 
1400
 
1401
 
1402
 
1403
 
1404
 
1405
 
1406
sub get_tile{
1407
        my ($mpsoc,$state,$tile,$x,$y)=@_;
1408
 
1409
 
1410
        my ($soc_name,$num)= $mpsoc->mpsoc_get_tile_soc_name($tile);
1411
 
1412
        my $button;
1413
        if( defined $soc_name){
1414
                my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile);
1415
                $button=($setting eq 'Custom')? def_colored_button("Tile $tile ($x,$y)*\n$soc_name",$num) :     def_colored_button("Tile $tile ($x,$y)\n$soc_name",$num) ;
1416
        }else {
1417
                $button =def_colored_button("Tile $tile ($x,$y)\n",50) if(! defined $soc_name);
1418
        }
1419
 
1420
        $button->signal_connect("clicked" => sub{
1421
                my $window = def_popwin_size(400,400,"Parameter setting for Tile $tile ");
1422
                my $table = def_table(6, 2, TRUE);
1423
 
1424
                my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
1425
                $scrolled_win->set_policy( "automatic", "automatic" );
1426
                $scrolled_win->add_with_viewport($table);
1427
                my $row=0;
1428
                my ($soc_name,$g,$t)=$mpsoc->mpsoc_get_tile_soc_name($tile);
1429
 
1430
 
1431
                my @socs=$mpsoc->mpsoc_get_soc_list();
1432
                my @list=(' ',@socs);
1433
                my $pos=(defined $soc_name)? get_scolar_pos($soc_name,@list): 0;
1434
                my $combo=gen_combo(\@list, $pos);
1435
                my $lable=gen_label_in_left("  SoC name:");
1436
                $table->attach_defaults($lable,0,3,$row,$row+1);
1437
                $table->attach_defaults($combo,3,7,$row,$row+1);$row++;
1438
                my $separator1 = Gtk2::HSeparator->new;
1439
                $table->attach_defaults($separator1,0,7,$row,$row+1);$row++;
1440
 
1441
                my $ok = def_image_button('icons/select.png','OK');
1442
                my $okbox=def_hbox(TRUE,0);
1443
                $okbox->pack_start($ok, FALSE, FALSE,0);
1444
 
1445
 
1446
 
1447
                my $param_setting=$mpsoc->mpsoc_get_tile_param_setting($tile);
1448
                @list=('Default','Custom');
1449
                $pos=(defined $param_setting)? get_scolar_pos($param_setting,@list): 0;
1450
                my $nn=(defined $soc_name)? $soc_name : 'soc';
1451
                my ($box2,$combo2)=gen_combo_help("Defualt: the tail will get  deafualt parameter setting of $nn.\n Custom: it will allow custom parameter  setting for this tile only." , \@list, $pos);
1452
                my $lable2=gen_label_in_left("  Parameter Setting:");
1453
                $table->attach_defaults($lable2,0,3,$row,$row+1);
1454
                $table->attach_defaults($box2,3,7,$row,$row+1);$row++;
1455
                $combo2->signal_connect('changed'=>sub{
1456
                        my $in=$combo2->get_active_text();
1457
                        $mpsoc->mpsoc_set_tile_param_setting($tile,$in);
1458
 
1459
 
1460
                });
1461
 
1462
 
1463
 
1464
 
1465
 
1466
                $combo->signal_connect('changed'=>sub{
1467
                        my $new_soc=$combo->get_active_text();
1468
                        if ($new_soc eq ' '){
1469
                                #unconnect tile
1470
                                $mpsoc->mpsoc_set_tile_free($tile);
1471
                        }else {
1472
                                $mpsoc->mpsoc_set_tile_soc_name($tile,$new_soc);
1473
                        }
1474
 
1475
 
1476
 
1477
                });
1478
 
1479
 
1480
 
1481
 
1482
 
1483
 
1484
                my $mtable = def_table(10, 1, TRUE);
1485
 
1486
                $mtable->attach_defaults($scrolled_win,0,1,0,9);
1487
                $mtable->attach_defaults($okbox,0,1,9,10);
1488
 
1489
                $window->add ($mtable);
1490
                $window->show_all();
1491
 
1492
                $ok-> signal_connect("clicked" => sub{
1493
                        $window->destroy;
1494
                        set_state($state,"refresh_soc",1);
1495
                        my $soc_name=$combo->get_active_text();
1496
                        my $setting=$combo2->get_active_text();
1497
                        if ($soc_name ne ' ' && $setting ne 'Default'){
1498
                        get_soc_parameter_setting ($mpsoc,$soc_name,$state,$tile);
1499
 
1500
                        }
1501
                        #save new values 
1502
                        #$top->top_add_default_soc_param(\%param_value);
1503
                        #set_state($soc_state,"refresh_soc",1);
1504
                        #$$refresh_soc->clicked;
1505
 
1506
                        });
1507
 
1508
        });
1509
 
1510
 
1511
        #$button->show_all;
1512
        return $button;
1513
 
1514
 
1515
}
1516
 
1517
 
1518
 
1519
 
1520
 
1521
 
1522
 
1523
 
1524
##########
1525
#
1526
#########
1527
 
1528
sub gen_tiles{
1529
        my ($mpsoc,$soc_state)=@_;
1530
 
1531
        my $nx= $mpsoc->mpsoc_get_param("NX");
1532
        my $ny= $mpsoc->mpsoc_get_param("NY");
1533
 
1534
        #print "($nx,$ny);\n";
1535
        my $table=def_table($nx,$ny,FALSE);#    my ($row,$col,$homogeneous)=@_;
1536
        my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
1537
        $scrolled_win->set_policy( "automatic", "automatic" );
1538
        $scrolled_win->add_with_viewport($table);
1539
 
1540
 
1541
 
1542
 
1543
 
1544
 
1545
        for (my $y=0;$y<$ny;$y++){
1546
                for (my $x=0; $x<$nx;$x++){
1547
                        my $tile_num=($nx*$y)+ $x;
1548
                        my $tile=get_tile($mpsoc,$soc_state,$tile_num,$x,$y);
1549
                #print "($x,$y);\n";
1550
                $table->attach_defaults ($tile, $x, $x+1 , $y, $y+1);
1551
 
1552
 
1553
        }}
1554
 
1555
 
1556
 
1557
 
1558
 
1559
 
1560
 
1561
 
1562
 
1563
 
1564
 
1565
############
1566
#    main
1567
############
1568
sub mpsocgen_main{
1569
 
1570
        my $infc = interface->interface_new();
1571
        my $soc = ip->lib_new ();
1572
        #my $soc = soc->soc_new();
1573
 
1574
        my $mpsoc= mpsoc->mpsoc_new();
1575
        #my $soc= eval { do 'lib/soc/soc.SOC' };
1576
 
1577
        my $soc_state=  def_state("ideal");
1578
        # main window
1579
        #my $window = def_win_size(1000,800,"Top");
1580
        #  The main table containg the lib tree, selected modules and info section 
1581
        my $main_table = Gtk2::Table->new (25, 12, FALSE);
1582
 
1583
        # The box which holds the info, warning, error ...  mesages
1584
        my ($infobox,$info)= create_text();
1585
 
1586
 
1587
        my $refresh = Gtk2::Button->new_from_stock('ref');
1588
 
1589
 
1590
        my $noc_conf_box=noc_config ($mpsoc,$soc_state);
1591
        my $noc_tiles=gen_tiles($mpsoc,$soc_state);
1592
 
1593
 
1594
 
1595
        $main_table->set_row_spacings (4);
1596
        $main_table->set_col_spacings (1);
1597
 
1598
        #my  $device_win=show_active_dev($soc,$soc,$infc,$soc_state,\$refresh,$info);
1599
 
1600
 
1601
        my $generate = def_image_button('icons/gen.png','Generate');
1602
        my $genbox=def_hbox(TRUE,0);
1603
        $genbox->pack_start($generate,   FALSE, FALSE,0);
1604
 
1605
 
1606
 
1607
        my $open = def_image_button('icons/browse.png','Load MPSoC');
1608
        my $openbox=def_hbox(TRUE,0);
1609
        $openbox->pack_start($open,   FALSE, FALSE,0);
1610
 
1611
 
1612
 
1613
        my ($entrybox,$entry) = def_h_labeled_entry('MPSoC name:');
1614
        $entry->signal_connect( 'changed'=> sub{
1615
                my $name=$entry->get_text();
1616
                $mpsoc->mpsoc_set_mpsoc_name($name);
1617
        });
1618
 
1619
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
1620
        $main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 23);
1621
        $main_table->attach_defaults ($noc_tiles , 4, 12, 0, 23);
1622
        $main_table->attach_defaults ($infobox  , 0, 12, 23,24);
1623
        $main_table->attach_defaults ($openbox,0, 3, 24,25);
1624
        $main_table->attach_defaults ($entrybox,3, 7, 24,25);
1625
 
1626
        $main_table->attach_defaults ($genbox, 10, 12, 24,25);
1627
 
1628
 
1629
        #referesh the mpsoc generator 
1630
        $refresh-> signal_connect("clicked" => sub{
1631
                $noc_conf_box->destroy();
1632
                $noc_conf_box=noc_config ($mpsoc,$soc_state);
1633
                $main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 23);
1634
                $noc_conf_box->show_all();
1635
 
1636
 
1637
 
1638
                $noc_tiles->destroy();
1639
                $noc_tiles=gen_tiles($mpsoc,$soc_state);
1640
                $main_table->attach_defaults ($noc_tiles , 4, 12, 0, 23);
1641
 
1642
                $main_table->show_all();
1643
 
1644
 
1645
        });
1646
 
1647
 
1648
 
1649
        #check soc status every 0.5 second. referesh device table if there is any changes 
1650
        Glib::Timeout->add (100, sub{
1651
 
1652
                my ($state,$timeout)= get_state($soc_state);
1653
 
1654
                if ($timeout>0){
1655
                        $timeout--;
1656
                        set_state($soc_state,$state,$timeout);
1657
                }
1658
                elsif( $state ne "ideal" ){
1659
                        $refresh->clicked;
1660
                        my $saved_name=$mpsoc->mpsoc_get_mpsoc_name();
1661
                        if(defined $saved_name) {$entry->set_text($saved_name);}
1662
                        set_state($soc_state,"ideal",0);
1663
 
1664
                }
1665
                return TRUE;
1666
 
1667
        } );
1668
 
1669
 
1670
        $generate-> signal_connect("clicked" => sub{
1671
                generate_mpsoc($mpsoc,$info);
1672
                $refresh->clicked;
1673
 
1674
        });
1675
 
1676
#       $wb-> signal_connect("clicked" => sub{ 
1677
#               wb_address_setting($mpsoc);
1678
#       
1679
#       });
1680
 
1681
        $open-> signal_connect("clicked" => sub{
1682
                set_state($soc_state,"ref",5);
1683
                load_mpsoc($mpsoc,$soc_state);
1684
 
1685
        });
1686
 
1687
 
1688
        my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
1689
                $sc_win->set_policy( "automatic", "automatic" );
1690
                $sc_win->add_with_viewport($main_table);
1691
 
1692
        return $sc_win;
1693
 
1694
 
1695
}
1696
 
1697
 
1698
 
1699
 
1700
        return $scrolled_win;
1701
}
1702
 
1703
 
1704
 
1705
 
1706
#############
1707
#       load_mpsoc
1708
#############
1709
 
1710
sub load_mpsoc{
1711
        my ($mpsoc,$soc_state)=@_;
1712
        my $file;
1713
        my $dialog = Gtk2::FileChooserDialog->new(
1714
                'Select a File', undef,
1715
                'open',
1716
                'gtk-cancel' => 'cancel',
1717
                'gtk-ok'     => 'ok',
1718
                );
1719
 
1720
        my $filter = Gtk2::FileFilter->new();
1721
        $filter->set_name("MPSoC");
1722
        $filter->add_pattern("*.MPSOC");
1723
        $dialog->add_filter ($filter);
1724
                my $dir = Cwd::getcwd();
1725
        $dialog->set_current_folder ("$dir/lib/mpsoc")  ;
1726
 
1727
 
1728
        if ( "ok" eq $dialog->run ) {
1729
                $file = $dialog->get_filename;
1730
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1731
                if($suffix eq '.MPSOC'){
1732
                        my $pp= eval { do $file };
1733
                        clone_obj($mpsoc,$pp);
1734
                        set_state($soc_state,"load_file",0);
1735
                }
1736
     }
1737
     $dialog->destroy;
1738
 
1739
 
1740
 
1741
 
1742
 
1743
}
1744
 
1745
##########
1746
 
1747
##########
1748
sub copy_noc_files{
1749
        my ($project_dir,$dest)=@_;
1750
 
1751
my @noc_files=('/mpsoc/src_noc/arbiter.v',
1752
        '/mpsoc/src_noc/baseline.v',
1753
        '/mpsoc/src_noc/canonical_credit_count.v',
1754
        '/mpsoc/src_noc/class_table.v',
1755
        '/mpsoc/src_noc/combined_vc_sw_alloc.v',
1756
        '/mpsoc/src_noc/comb_nonspec.v',
1757
        '/mpsoc/src_noc/comb_spec2.v',
1758
        '/mpsoc/src_noc/comb-spec1.v',
1759
        '/mpsoc/src_noc/congestion_analyzer.v',
1760
        '/mpsoc/src_noc/credit_count.v',
1761
        '/mpsoc/src_noc/crossbar.v',
1762
        '/mpsoc/src_noc/flit_buffer.v',
1763
        '/mpsoc/src_noc/inout_ports.v',
1764
        '/mpsoc/src_noc/inout_ports.v.classic',
1765
        '/mpsoc/src_noc/input_ports.v',
1766
        '/mpsoc/src_noc/main_comp.v',
1767
        '/mpsoc/src_noc/noc.v',
1768
        '/mpsoc/src_noc/route_mesh.v',
1769
        '/mpsoc/src_noc/router.v',
1770
        '/mpsoc/src_noc/route_torus.v',
1771
        '/mpsoc/src_noc/routing.v',
1772
        '/mpsoc/src_noc/vc_alloc_request_gen.v');
1773
        foreach my $f (@noc_files){
1774
                copy ("$project_dir$f",$dest);
1775
 
1776
        }
1777
 
1778
 
1779
}

powered by: WebSVN 2.1.0

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