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 18

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

powered by: WebSVN 2.1.0

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