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/] [soc.pm] - 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 strict;
3
 
4
package soc;
5
 
6
use ip;
7
 
8
 
9
sub soc_new {
10
    # be backwards compatible with non-OO call
11
    my $class = ("ARRAY" eq ref $_[0]) ? "soc" : shift;
12
    my $self;
13
 
14
    $self = {};
15
    $self->{modules}        = {};
16
    $self->{instance_order}=();
17
    $self->{hdl_files}=();
18
 
19
    bless($self,$class);
20
 
21
    return $self;
22
}
23
 
24
 
25
sub soc_add_instance{
26
        my ($self,$instance_id,$category,$module,$ip) = @_;
27
        if(exists ($self->{instances}{$instance_id})){
28
                return 0;
29
        }
30 24 alirezamon
        my $module_name=$ip->ip_get($category,$module,"module_name");
31 16 alirezamon
        #print "$module_name\n";
32
        $self->{instances}{$instance_id}={};
33
        $self->{instances}{$instance_id}{module}=$module;
34
        $self->{instances}{$instance_id}{module_name}=$module_name;
35
        $self->{instances}{$instance_id}{category}=$category;
36
        $self->{instances}{$instance_id}{instance_name}=$instance_id;
37
        my @sockets=$ip->ip_get_module_sockets_list($category,$module);
38
        foreach my $socket(@sockets){
39
                my ($type,$value,$connection_num)=$ip->ip_get_socket ($category,$module,$socket);
40
                soc_add_socket_to_instance($self,$instance_id,$socket,$type,$value,$connection_num);
41
                #add socket names
42
                my $int_num=($type eq 'num')? $value :1;
43
                for (my $i=0;$i<$int_num;$i++){
44
                        my $name=$ip->ip_get_socket_name($category,$module, $socket,$i);
45
                        $self->{instances}{$instance_id}{sockets}{$socket}{nums}{$i}{name}=$name;
46
                }
47
 
48
 
49
        }
50
        my @plugs=$ip->ip_get_module_plugs_list($category,$module);
51
        foreach my $plug(@plugs){
52
                my ($type,$value,$connection_num)=$ip->ip_get_plug ($category,$module,$plug);
53
                soc_add_plug_to_instance($self,$instance_id,$plug,$type,$value,$connection_num);
54
                #add plug names anf deafult connection as IO
55
                my $int_num=($type eq 'num')? $value :1;
56
                for (my $i=0;$i<$int_num;$i++){
57
                        my $name=$ip->ip_get_plug_name($category,$module, $plug,$i);
58
                        $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$i}{name}=$name;
59
                        soc_add_instance_plug_conection($self,$instance_id,$plug,$i,"IO");
60
                        my ($addr , $width) =$ip->ip_get_wb_addr ($category,$module,$plug,$i);
61
                        if(defined $addr){
62
                                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$i}{addr}=$addr;
63
                                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$i}{width}=$width;
64
                        }
65
                }
66
        }
67
 
68
        return 1;
69
}
70
 
71
sub soc_add_instance_order{
72
        my ($self,$instance_id)=@_;
73
        push (@{$self->{instance_order}},$instance_id);
74
        #print " @{$self->{instance_order}} \n";        
75
}
76
 
77
sub soc_remove_scolar_from_array{
78
        my ($array_ref,$item)=@_;
79
        my @array=@{$array_ref};
80
        my @new;
81
        foreach my $p (@array){
82
                if($p ne $item ){
83
                        push(@new,$p);
84
                }
85
        }
86
        return @new;
87
}
88
 
89
sub soc_get_scolar_pos{
90
        my ($item,@list)=@_;
91
        my $pos;
92
        my $i=0;
93
        foreach my $c (@list)
94
        {
95
                if(  $c eq $item) {$pos=$i}
96
                $i++;
97
        }
98
        return $pos;
99
}
100
 
101
sub soc_remove_from_instance_order{
102
        my ($self,$instance_id)=@_;
103
        my @a=soc_remove_scolar_from_array($self->{instance_order},$instance_id);
104
        $self->{instance_order}=\@a;
105
        #print " @{$self->{instance_order}} \n";        
106
}
107
 
108
sub soc_get_instance_order{
109
        my $self=shift;
110
        my @order;
111
        @order = @{$self->{instance_order}} if (defined $self->{instance_order});
112
        return @order;
113
}
114
 
115
sub soc_increase_instance_order{
116
        my ($self,$item)=@_;
117
        my @order;
118
        if (defined $self->{instance_order}){
119
                @order = @{$self->{instance_order}};
120
                my $pos=soc_get_scolar_pos($item,@order);
121
                if(defined $order[$pos+1] ){
122
                        $order[$pos]=$order[$pos+1];
123
                        $order[$pos+1]=$item;
124
                        $self->{instance_order}=\@order;
125
                }
126
        }
127
}
128
 
129
sub soc_decrease_instance_order{
130
        my ($self,$item)=@_;
131
        my @order;
132
        if (defined $self->{instance_order}){
133
                @order = @{$self->{instance_order}};
134
                my $pos=soc_get_scolar_pos($item,@order);
135
                if($pos !=0 ){
136
                        $order[$pos]=$order[$pos-1];
137
                        $order[$pos-1]=$item;
138
                        $self->{instance_order}=\@order;
139
                }
140
        }
141
}
142
 
143
sub soc_get_module_name{
144
        my ($self,$instance_id)=@_;
145
        my $module_name;
146
        if(exists ($self->{instances}{$instance_id}{module_name})){
147
                $module_name= $self->{instances}{$instance_id}{module_name};
148
        }
149
        return $module_name;
150
}
151
 
152
 
153
sub soc_get_plug_name {
154
        my ($self,$instance_id,$plug,$num)=@_;
155
        my $name;
156
        if(exists($self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{name})){
157
                $name=$self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{name};
158
        }
159
        return $name;
160
}
161
 
162
sub soc_get_plug_addr {
163
        my ($self,$instance_id,$plug,$num)=@_;
164
        my ($addr , $width);
165
        if(exists($self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{addr})){
166
                $addr=  $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{addr};
167
                $width= $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{width};
168
        }
169
        return ($addr , $width);
170
}
171
 
172
 
173
sub soc_get_socket_name {
174
        my ($self,$instance_id,$socket,$num)=@_;
175
        my $name;
176
        if(exists($self->{instances}{$instance_id}{sockets}{$socket}{nums}{$num})){
177
                $name=$self->{instances}{$instance_id}{sockets}{$socket}{nums}{$num}{name};
178
        }
179
        return $name;
180
}
181
 
182
sub soc_remove_instance{
183
        my ($self,$instance_id)=@_;
184
        if ( exists( $self->{instances}{$instance_id} )) {
185
             delete( $self->{instances}{$instance_id} );
186
        }
187
 
188
 
189
}
190
 
191
 
192
sub soc_add_socket_to_instance{
193
        my ($self,$instance_id,$socket,$type,$value,$connection_num)=@_;
194
        if ( exists( $self->{instances}{$instance_id} )){
195
                $self->{instances}{$instance_id}{sockets}{$socket}{type}=$type;
196
                $self->{instances}{$instance_id}{sockets}{$socket}{value}=$value;
197
                $self->{instances}{$instance_id}{sockets}{$socket}{connection_num}=$connection_num;
198
 
199
        }
200
}
201
 
202
sub soc_get_socket_of_instance{
203
        my ($self,$instance_id,$socket)=@_;
204
        my ($type,$value,$connection_num);
205
        if ( exists( $self->{instances}{$instance_id} )){
206
                $type=$self->{instances}{$instance_id}{sockets}{$socket}{type};
207
                $value=$self->{instances}{$instance_id}{sockets}{$socket}{value};
208
                $connection_num=$self->{instances}{$instance_id}{sockets}{$socket}{connection_num};
209
        }
210
        return ($type,$value,$connection_num);
211
}
212
 
213
 
214
 
215
 
216
 
217
sub soc_add_plug_to_instance{
218
        my ($self,$instance_id,$plug,$type,$value,$connection_num)=@_;
219
        if ( exists( $self->{instances}{$instance_id} )){
220
                $self->{instances}{$instance_id}{plugs}{$plug}{type}=$type;
221
                $self->{instances}{$instance_id}{plugs}{$plug}{value}=$value;
222
                $self->{instances}{$instance_id}{plugs}{$plug}{connection_num}=$connection_num;
223
 
224
        }
225
}
226
 
227
sub soc_get_plug_of_instance{
228
        my ($self,$instance_id,$plug)=@_;
229
        my ($type,$value,$connection_num);
230
        if ( exists( $self->{instances}{$instance_id} )){
231
                $type=$self->{instances}{$instance_id}{plugs}{$plug}{type};
232
                $value=$self->{instances}{$instance_id}{plugs}{$plug}{value};
233
                $connection_num=$self->{instances}{$instance_id}{plugs}{$plug}{connection_num};
234
        }
235
        return ($type,$value,$connection_num);
236
}
237
 
238
sub soc_set_soc_name{
239
        my ($self,$name)=@_;
240
        if(defined $name){$self->{soc_name}=$name;}
241
}
242
 
243
sub soc_get_soc_name{
244
        my ($self)=@_;
245
        my $name;
246
        if(exists  $self->{soc_name}){ $name=$self->{soc_name};}
247
        return $name;
248
}
249
 
250
 
251
 
252
 
253
 
254
 
255
sub soc_add_instance_plug_conection{
256
 
257
        my ($self,$instance_id,$plug,$plug_num,$id,$socket,$num)=@_;
258
        if(exists ($self->{instances}{$instance_id}{plugs}{$plug})){
259
                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_id}=$id;
260
                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket}=$socket;
261
                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket_num}=$num;
262
        }
263
 
264
}
265
 
266
sub soc_get_module_plug_conection{
267
        my ($self,$instance_id,$plug,$plug_num)=@_;
268
        my ($id,$socket,$num);
269
        if(exists($self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num})){
270
                $id =   $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_id};
271
                $socket=        $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket};
272
                $num=   $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket_num};
273
        }
274
        return  ($id,$socket,$num);
275
}
276
 
277
sub soc_get_all_plugs_of_an_instance{
278
        my ($self,$instance_id)=@_;
279
        my @list;
280
 
281
        if(exists ($self->{instances}{$instance_id}{plugs})){
282
                foreach my $p (sort keys %{$self->{instances}{$instance_id}{plugs}}){
283
                push (@list,$p);
284
 
285
                }
286
        }
287
        return @list;
288
 
289
}
290
 
291
 
292
##############################################
293
sub soc_get_modules_plug_connected_to_socket{
294
        my ($self,$id,$socket,$socket_num)=@_;
295
        my %plugs;
296
        my %plug_nums;
297
        my @instances=soc_get_all_instances($self);
298
        foreach my $instance_id (@instances){
299
                        my @plugs=soc_get_all_plugs_of_an_instance($self,$instance_id);
300
                        foreach my $plug (@plugs){
301
                                foreach my $plug_num (keys %{$self->{instances}{$instance_id}{plugs}{$plug}{nums}}){
302
                                        my $id_ =       $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_id};
303
                                        my $socket_=    $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket};
304
                                        my $socket_num_=        $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$plug_num}{connect_socket_num};
305
                                        #print "if($id_ eq $id && $socket_ eq $socket &&  $socket_num_ eq $socket_num )\n";
306
                                        if($id_ eq $id && $socket_ eq $socket &&  $socket_num_ eq $socket_num ) {
307
                                                $plugs{$instance_id}=$plug;
308
                                                $plug_nums{$instance_id}=$plug_num;
309
 
310
                                        }
311
                                }
312
                        }
313
 
314
        }
315
 
316
 
317
 
318
        return (\%plugs, \%plug_nums);
319
 
320
}
321
 
322
 
323
 
324
 
325
 
326
 
327
 
328
 
329
 
330
 
331
 
332
 
333
 
334
sub get_modules_have_this_socket{
335
        my ($self,$socket)=@_;
336
        my %r;
337
        my @instances=soc_get_all_instances($self);
338
        if(!defined $socket ){return %r;}
339
        foreach my $p (@instances)
340
        {
341
                        if(exists ($self->{instances}{$p}{sockets}{$socket})) {
342
                                $r{$p}=$self->{instances}{$p}{sockets}{$socket}{value};
343
 
344
                        }
345
 
346
        }
347
        return %r;
348
 
349
}
350
 
351
 
352
 
353
 
354
sub soc_get_all_instances{
355
        my ($self)=@_;
356
        my @list;
357
        foreach my $p (sort keys %{$self->{instances}}){
358
                push (@list,$p);
359
        }
360
        return @list;
361
}
362
 
363
sub soc_get_all_instances_of_module{
364
        my ($self,$category,$module)=@_;
365
        my @list;
366
        my @m_list;
367
        @list=soc_get_all_instances($self);
368
 
369
        foreach my $p (@list){
370
                #printf "\$p=$p  \& $self->{instances}{$p}{module}\n";
371
                if(($self->{instances}{$p}{module} eq $module) &&
372
                   ($self->{instances}{$p}{category} eq $category)){
373
                        push(@m_list,$p);
374
                }
375
        }
376
        return @m_list;
377
}
378
 
379
 
380
 
381
sub soc_add_instance_param{
382
                my ($self,$instance_id,$param_ref)=@_;
383
                if(exists ($self->{instances}{$instance_id})){
384
                        my %param=%$param_ref;
385
                        foreach my $p (sort keys %param){
386
                                my $value = $param{$p};
387
                                $self->{instances}{$instance_id}{parameters}{$p}{value}=$value;
388
                                #print "lllllllll:$value\n";
389
                        }
390
                        return 1;
391
                }
392
                return 0;
393
}
394
 
395
 
396
sub soc_add_instance_param_order{
397
                my ($self,$instance_id,$param_ref)=@_;
398
                if(exists ($self->{instances}{$instance_id})){
399
                        $self->{instances}{$instance_id}{parameters_order}=$param_ref;
400
                        return 1;
401
                }
402
                return 0;
403
}
404
 
405
sub soc_get_instance_param_order{
406
                my ($self,$instance_id)=@_;
407
                my @r;
408
                if(defined ($self->{instances}{$instance_id}{parameters_order}) ){
409
                        @r=@{$self->{instances}{$instance_id}{parameters_order}};
410
 
411
                }
412
                return @r;
413
}
414
 
415
 
416
 
417
sub soc_get_module_param{
418
                my ($self,$instance_id)=@_;
419
                my %param;
420
                if(exists ($self->{instances}{$instance_id}{parameters}))
421
                {
422
                        foreach my $p (sort keys %{$self->{instances}{$instance_id}{parameters}})
423
                        {
424
                                $param{$p}=$self->{instances}{$instance_id}{parameters}{$p}{value};
425
                        }
426
                }
427
                return %param;
428
}
429
 
430
 
431
 
432
sub soc_get_module_param_value{
433
                my ($self,$instance_id,$param)=@_;
434
                my $value;
435
                if(exists ($self->{instances}{$instance_id}{parameters}{$param})){
436
                        $value= $self->{instances}{$instance_id}{parameters}{$param}{value};
437
                }
438
                return $value;
439
}
440
 
441
 
442
 
443
 
444
 
445
sub soc_get_all_instance_name{
446
        my ($self)=@_;
447
        my @instance_names;
448
        my @instances=$self->soc_get_all_instances();
449
        foreach my $instance_id (@instances){
450
                        my $name= $self->{instances}{$instance_id}{instance_name};
451
                        push(@instance_names,$name);
452
 
453
        }
454
        return @instance_names;
455
}
456
 
457
 
458
sub soc_set_instance_name{
459
        my ($self,$instance_id,$instance_name)=@_;
460
        if ( exists( $self->{instances}{$instance_id} )){
461
                $self->{instances}{$instance_id}{instance_name}=$instance_name;
462
        }
463
 
464
}
465
 
466
sub soc_get_instance_name{
467
        my ($self,$instance_id)=@_;
468
        my $instance_name;
469
        if ( exists( $self->{instances}{$instance_id} )){
470
                 $instance_name=$self->{instances}{$instance_id}{instance_name};
471
        }
472
        return $instance_name;
473
 
474
}
475
 
476
 
477
sub soc_get_instance_id{
478
        my ($self,$intance_name)=@_;
479
        foreach my $id (sort keys %{$self->{instances}}){
480
                my $p=$self->{instances}{$id}{instance_name};
481
                if ($p eq $intance_name) {return $id;}
482
 
483
        }
484
        return;
485
}
486
 
487
sub soc_get_module{
488
        my ($self,$instance_id) = @_;
489
        my $module;
490
        if ( exists( $self->{instances}{$instance_id} )){
491
                $module=$self->{instances}{$instance_id}{module};
492
        }
493
        return $module;
494
}
495
 
496
sub soc_get_category{
497
        my ($self,$instance_id) = @_;
498
        my $category;
499
        if ( exists( $self->{instances}{$instance_id} )){
500
                $category=$self->{instances}{$instance_id}{category};
501
        }
502
        return $category;
503
}
504
 
505
sub soc_add_plug_base_addr{
506
        my($self,$instance_id,$plug,$num,$base,$end)=@_;
507
        if(exists ($self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num})){
508
                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{base}=$base;
509
                $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{end}=$end;
510
        }
511
}
512
 
513
 
514
 
515
sub soc_list_base_addreses{
516
                my ($self,$id) = @_;
517
                my %bases;
518
                my @all_instances=soc_get_all_instances($self);
519
                foreach my $instance_id (@all_instances){
520
                        my @plugs=soc_get_all_plugs_of_an_instance($self,$instance_id);
521
                        foreach my $plug (@plugs){
522
                                foreach my $num (sort keys  %{$self->{instances}{$instance_id}{plugs}{$plug}{nums}}){
523
                                        my $base=$self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{base};
524
                                        my $end=$self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{end};
525
                                        my $connect_id=$self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{connect_id};
526
                                        if(defined $base && ($connect_id eq $id)){
527
                                                $bases{$end}=$base;
528
 
529
                                        }
530
                                }
531
                        }
532
                }
533
                return %bases;
534
 
535
}
536
 
537
 
538
sub soc_list_plug_nums{
539
        my ($self,$instance_id,$plug)=@_;
540
        my @list;
541
        if(exists($self->{instances}{$instance_id}{plugs}{$plug})){
542
                foreach my $num (sort keys  %{$self->{instances}{$instance_id}{plugs}{$plug}{nums}}){
543
                        push (@list,$num);
544
                }
545
        }
546
        return @list;
547
}
548
 
549
 
550
sub soc_get_plug{
551
        my ($self,$instance_id,$plug,$num) = @_;
552
        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num);
553
        if(exists($self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num})){
554
                $addr=                          $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{addr};
555
                $base=                          $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{base};
556
                $end=                           $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{end};
557
                $name=                          $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{name};
558
                $connect_id=            $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{connect_id};
559
                $connect_socket=        $self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{connect_socket};
560
                $connect_socket_num=$self->{instances}{$instance_id}{plugs}{$plug}{nums}{$num}{connect_socket_num};
561
 
562
        }
563
        return ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num);
564
 
565
}
566
 
567
 
568
 
569
sub soc_add_top{
570
        my ($self,$top_ip)=@_;
571
        $self->{top_ip}=$top_ip;
572
 
573
}
574
 
575
sub soc_get_top{
576
        my $self=shift;
577
        return $self->{top_ip};
578
 
579
}
580
 
581
sub soc_get_hdl_files{
582
        my ($self)=shift;
583
        return @{$self->{hdl_files}};
584
}
585
 
586
 
587
sub soc_add_hdl_files{
588
        my ($self,@hdl_list)=@_;
589
        my @old=@{$self->{hdl_files}};
590
        my @new=(@old,@hdl_list);
591
        $self->{hdl_files}=\@new;
592
}
593
 
594
#a-b
595
sub soc_get_diff_array{
596
        my ($a_ref,$b_ref)=@_;
597
        my @A=@{$a_ref};
598
        my @B=@{$b_ref};
599
        my @C;
600
        foreach my $p (@A){
601
                if( !grep (/^$p$/,@B)){push(@C,$p)};
602
        }
603
        return  @C;
604
 
605
}
606
 
607
sub soc_remove_hdl_files{
608
        my ($self,@hdl_list)=@_;
609
        my @old=@{$self->{hdl_files}};
610
        my @new=soc_get_diff_array(\@old,\@hdl_list);
611
        $self->{hdl_files}=\@new;
612
}
613
 
614
 
615
 
616 17 alirezamon
sub new_wires {
617
                my $class = shift;
618
                my $self;
619
                $self->{assigned_name}={};
620
                bless($self,$class);
621
                return $self;
622
}
623
sub wire_add{
624
        my ($self,$name,$filed,$data)=@_;
625
        $self->{assigned_name}{$name}{$filed}=$data;
626
}
627
 
628
sub wire_get{
629
        my ($self,$name,$filed)=@_;
630
        return  $self->{assigned_name}{$name}{$filed};
631
}
632
 
633
sub wires_list{
634
        my($self)=shift;
635
        my @list=       sort keys $self->{assigned_name};
636
        return @list;
637
}
638
 
639
 
640 16 alirezamon
1

powered by: WebSVN 2.1.0

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