OpenCores
URL https://opencores.org/ocsvn/wb_builder/wb_builder/trunk

Subversion Repositories wb_builder

[/] [wb_builder/] [trunk/] [generator/] [wishbone.pl] - Blame information for rev 15

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

Line No. Rev Author Line
1 2 unneback
#!/usr/bin/perl
2
 
3
#use POSIX;
4
use Tk;
5
use Time::Local;
6
 
7
#
8
# usage perl wishbone_gui.pl [-nogui] [wishbone.defines]
9
#
10
 
11
# description: users manual
12
 
13
my $infile = "wishbone.defines";
14
my $outfile = wb;
15
 
16
my $a;
17
my $i=0;
18
my $j=0;
19
 
20
# default settings
21
my $syscon=syscon;
22
my $intercon=intercon;
23
my $target="generic";
24
my $hdl=vhdl;
25
my $ext=".vhd";
26
my $signal_groups=0;
27
my $comment="--";
28
my $dat_size=32;
29
my $adr_size=32;
30
my $tgd_bits=0;
31
my $tga_bits=2;
32
my $tgc_bits=3;
33
my $rename_tgc="cti";
34
my $rename_tga="bte";
35
my $rename_tgd="tgd";
36
my $classic="000";
37
my $endofburst="111";
38
my $interconnect="sharedbus";
39
my $mux_type="andor";
40
my $optimize="speed";
41 13 unneback
my $priority="0";
42 2 unneback
 
43
# keep track of implementation size
44
my $masters=0;
45
my $slaves=0;
46
my $rty_o=0;
47
my $rty_i=0;
48
my $err_o=0;
49
my $err_i=0;
50
my $tgc_o=0;
51
my $tgc_i=0;
52
my $tga_o=0;
53
my $tga_i=0;
54
 
55
# GUI FSM
56
my $state='WinGlobal';
57
my $next=0;
58
my $back=0;
59
my $amp=0;
60
my $asp=0;
61
my $del=0;
62
my $i;
63
 
64
# open input file
65
#if (open(FILE,"<$file")) {
66
 
67
# read in settings from infile
68
 
69
sub master_init {
70
  $masters += 1;
71
  $master[$masters]{"wbm"}=$_[0];
72
  $master[$masters]{"dat_size"}=$dat_size;
73
  $master[$masters]{"adr_size"}=$adr_size;
74
  $master[$masters]{"type"}="rw";
75
  $master[$masters]{"adr_o_hi"}=31;
76
  $master[$masters]{"adr_o_lo"}=0;
77
  $master[$masters]{"lock_o"}=0;
78
  $master[$masters]{"err_i"}=1;
79
  $master[$masters]{"rty_i"}=1;
80
  $master[$masters]{"tga_o"}=0;
81
  $master[$masters]{"tgd_o"}=0;
82
  $master[$masters]{"tgc_o"}=0;
83
  $master[$masters]{"priority"}=1;
84
};
85
 
86
sub slave_init {
87
  $slaves += 1;
88
  $slave[$slaves]{"wbs"}=$_[0];
89
  $slave[$slaves]{"dat_size"}=$dat_size;
90
  $slave[$slaves]{"type"}="rw";
91
  $slave[$slaves]{"sel_i"}=1;
92
  $slave[$slaves]{"adr_i_hi"}=31;
93
  $slave[$slaves]{"adr_i_lo"}=2;
94
  $slave[$slaves]{"lock_i"}=0;
95
  $slave[$slaves]{"tgd_i"}=0;
96
  $slave[$slaves]{"tga_i"}=0;
97
  $slave[$slaves]{"tgc_i"}=0;
98
  $slave[$slaves]{"err_o"}=0;
99
  $slave[$slaves]{"rty_o"}=0;
100
  $slave[$slaves]{"baseadr"}="00000000";
101
  $slave[$slaves]{"size"}="00100000";
102
  $slave[$slaves]{"baseadr1"}="00000000";
103
  $slave[$slaves]{"size1"}="ffffffff";
104
  $slave[$slaves]{"baseadr2"}="00000000";
105
  $slave[$slaves]{"size2"}="ffffffff";
106
  $slave[$slaves]{"baseadr3"}="00000000";
107
  $slave[$slaves]{"size3"}="ffffffff";
108
};
109
 
110
sub read_defines {
111 14 unneback
$priority=0;
112 2 unneback
open(FILE,"<$_[0]") or die "could not read from $file";
113
while($a = <FILE>)
114
{
115
  if ($a =~ /^(syscon|intercon|filename)( *)(=)( *)([a-zA-Z0-9_\/\.]+)(;?)$/) {
116
    if($1 eq "syscon")   { $syscon = $5; }
117
    if($1 eq "intercon") { $intercon = $5; }
118
    if($1 eq "filename") { $outfile = $5; }
119
  }
120
 
121
  if ($a =~ /^(target)( *)(=)( *)(generic|xilinx|altera)(;?)$/) {
122
    $target = $5; };
123
 
124
  if ($a =~ /^(hdl)( *)(=)( *)(vhdl|verilog|perlilog);?$/) {
125
    $hdl = $5;
126
    if ($5 eq "vhdl") {
127
      $comment="--";
128
      $ext=".vhd";
129
    } else {
130
      $comment="//";
131
      $ext=".v";
132
    };
133
  };
134
 
135
  if ($a =~ /^(interconnect)( *)(=)( *)(crossbarswitch|sharedbus)(;?)$/) {
136
    $interconnect = $5; };
137
 
138
  if ($a =~ /^(signal_groups)( *)(=)( *)([0-1])(;?)($*)/) {
139
    $signal_groups = $5; };
140
 
141
  if ($a =~ /^(mux_type)( *)(=)( *)(mux|andor|tristate)(;?)$/) {
142
    $mux_type = $5; };
143
 
144
  if ($a =~ /^(optimize)( *)(=)( *)(speed|area);?$/) {
145
    $optimize = $5; };
146
 
147
  if ($a =~ /^(dat_size|adr_size|tgd_bits|tga_bits|tgc_bits)( *)(=)( *)([0-9]+)(;?)($*)/) {
148
    if ($1 eq "dat_size"){$dat_size = $5};
149
    if ($1 eq "adr_size"){$adr_size = $5};
150
    if ($1 eq "tgd_bits"){$tgd_bits = $5};
151
    if ($1 eq "tga_bits"){$tga_bits = $5};
152
    if ($1 eq "tgc_bits"){$tgc_bits = $5};
153
  };
154
 
155
  if ($a =~ /^(rename)(_)(tga|tgc|tgd)( *)(=)( *)([a-zA-Z_-]+)(;?)($*)/) {
156
    if ($3 eq "tga"){$rename_tga=$7};
157
    if ($3 eq "tgc"){$rename_tgc=$7};
158
    if ($3 eq "tgd"){$rename_tgd=$7};
159
  };
160
 
161
  # master port setup
162
  if ($a =~ /^(master)( *)([A-Za-z0-9_-]+)($*)/) {
163
    if($1 eq "master") {
164
      master_init($3);
165
    };
166
    $a = <FILE>;
167
    until ($a =~ /^(end master)($*)/) {
168 13 unneback
      if ($a =~ /^( *)(dat_size|adr_o_hi|adr_o_lo|lock_o|err_i|rty_i|tga_o|tgc_o|priority)( *)(=)( *)(0x)?([0-9a-fA-F]*)(;?)($*)/) {
169 12 unneback
        $master[$masters]{"$2"}=$7;
170 2 unneback
        if (($2 eq "rty_i") && ($7 eq 1)) {
171
          $rty_i++; };
172
        if (($2 eq "err_i") && ($7 eq 1)) {
173
          $err_i++; };
174
        if (($2 eq "tgc_o") && ($7 eq 1)) {
175
          $tgc_o++; };
176
        if (($2 eq "tga_o") && ($7 eq 1)) {
177
          $tga_o++; };
178 12 unneback
        # priority for shared bus system
179 14 unneback
        if ($2 eq "priority") {
180
          $priority += $7; };
181 2 unneback
      }; #end if
182
      if ($a =~ /^( *)(type)( *)(=)( *)(ro|wo|rw)(;?)($*)/) {
183
        $master[$masters]{"$2"}=$6; };
184
      # priority for crossbarswitch
185 4 unneback
      if ($a =~ /^( *)(priority)(_)([0-9a-zA-Z_]*)( *)(=)( *)([0-9]*)(;?)($*)/) {
186 2 unneback
        $master[$masters]{("priority_"."$4")}=$8; };
187
      $a = <FILE>;
188
    };
189
  };
190
 
191
  # slave port setup
192
  if ($a =~ /^(slave)( *)([A-Za-z0-9_-]+)($*)/) {
193
    if ($1 eq "slave") {
194
      slave_init($3);
195
    };
196
    $a = <FILE>;
197
    until ($a =~ /^(end slave)($*)/) {
198
      if ($a =~ /^( *)(dat_i|dat_o|sel_i|adr_i_hi|adr_i_lo|lock_i|tga_i|tgc_i|err_o|rty_o|baseadr|size|baseadr1|size1|baseadr2|size2|baseadr3|size3)( *)(=)( *)(0x)?([0-9a-fA-F]+)(;?)($*)/) {
199
        $slave[$slaves]{"$2"}=$7;
200
        if (($2 eq "rty_o") && ($7 eq 1)) {
201
          $rty_o++; };
202
        if (($2 eq "err_o") && ($7 eq 1)) {
203
          $err_o++; };
204
        if (($2 eq "tgc_i") && ($7 eq 1)) {
205
          $tgc_i++; };
206
        if (($2 eq "tga_i") && ($7 eq 1)) {
207
          $tga_i++; };
208
      }; #end if
209
      if ($a =~ /^( *)(type)( *)(=)( *)(ro|wo|rw)(;?)($*)/) {
210
        $slave[$slaves]{"$2"}=$6; };
211
      $a = <FILE>;
212
    };
213
  };
214
}; #end while
215
close($_[0]);
216
}; #end sub
217
 
218
################################################################################
219
# GUI
220
 
221
my $mw;
222
 
223
sub WinGlobalExit {
224
  $mw->destroy();
225
};
226
 
227
# global assignments
228
sub WinGlobal {
229
  $mw = MainWindow->new;
230
  $mw->title ("Wishbone generator");
231
  $frame=$mw->Frame(-label=>"Global definitions");
232
  # define file
233
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
234
  $frame->Label(-text => "Define file:")->pack(-side=>'left');
235
  $frame->Entry(-textvariable => \$infile)->pack(-side=>'right');
236
  # HDL file
237
  $frame=$mw->Frame();
238
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
239
  $frame->Label(-text => "HDL file   :")->pack(-side=>'left');
240
  $frame->Entry(-textvariable => \$outfile)->pack(-side=>'right');
241
  # intercon
242
  $frame=$mw->Frame();
243
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
244
  $frame->Label(-text => "intercon   :")->pack(-side=>'left');
245
  $frame->Entry(-textvariable => \$intercon)->pack(-side=>'right');
246
  # syscon
247
  $frame=$mw->Frame();
248
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
249
  $frame->Label(-text => "syscon     :")->pack(-side=>'left');
250
  $frame->Entry(-textvariable => \$syscon)->pack(-side=>'right');
251
  # target
252
  $frame=$mw->Frame();
253
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
254
  $frame->Label(-text => "Target :")->pack(-side=>'left');
255
  $a = $frame->Radiobutton ( -variable => \$target, -text => 'Generic', -value => 'generic')->pack(-side=>'left');
256
  $b = $frame->Radiobutton ( -variable => \$target, -text => 'XILINX', -value => 'xilinx')->pack(-side=>'left');
257
  $c = $frame->Radiobutton ( -variable => \$target, -text => 'ALTERA', -value => 'altera')->pack(-side=>'left');
258
  # interconnect
259
  $frame=$mw->Frame();
260
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
261
  $frame->Label(-text => "Interconnection :")->pack(-side=>'left');
262
  $a = $frame->Radiobutton ( -variable => \$interconnect, -text => 'Shared bus', -value => 'sharedbus')->pack( -side=>'left');
263
  $b = $frame->Radiobutton ( -variable => \$interconnect, -text => 'Crossbar switch', -value => 'crossbarswitch' )->pack( -side=>'right');
264
  # mux
265
  $frame=$mw->Frame();
266
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
267
  $frame->Label(-text => "Mux type :")->pack(-side=>'left');
268
  $a = $frame->Radiobutton ( -variable => \$mux_type, -text => 'mux', -value => 'mux')->pack( -side=>'left');
269
  $b = $frame->Radiobutton ( -variable => \$mux_type, -text => 'andor', -value => 'andor')->pack( -side=>'left');
270
  $c = $frame->Radiobutton ( -variable => \$mux_type, -text => 'tristate', -value => 'tristate' )->pack( -side=>'right');
271
  # hdl
272
  $frame=$mw->Frame();
273
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
274
  $frame->Label(-text => "HDL type :")->pack(-side=>'left');
275
  $a = $frame->Radiobutton ( -variable => \$hdl, -text => 'VHDL', -value => 'vhdl')->pack(-side=>'left');
276
  $b = $frame->Radiobutton ( -variable => \$hdl, -text => 'Verilog', -value => 'verilog')->pack(-side=>'left');
277
  $c = $frame->Radiobutton ( -variable => \$hdl, -text => 'Perlilog', -value => 'perlilog')->pack(-side=>'left');
278
  # signalgroups
279
  $frame=$mw->Frame();
280
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
281
  $frame->Label(-text => "Signal groups :")->pack(-side=>'left');
282
  $a = $frame->Radiobutton ( -variable => \$signal_groups, -text => 'No', -value => 0)->pack( -side=>'left');
283
  $b = $frame->Radiobutton ( -variable => \$signal_groups, -text => 'Yes', -value => 1 )->pack( -side=>'right');
284
  # dat size
285
  $frame=$mw->Frame();
286
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
287
  $frame->Label(-text => "Data bus size :")->pack(-side=>'left');
288
  $frame->Entry(-textvariable => \$dat_size)->pack(-side=>'right');
289
  # adr size
290
  $frame=$mw->Frame();
291
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
292
  $frame->Label(-text => "Adr bus size    :")->pack(-side=>'left');
293
  $frame->Entry(-textvariable => \$adr_size)->pack(-side=>'right');
294
  # tga
295
  $frame=$mw->Frame();
296
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
297
  $frame->Label(-text => "tga bits           :")->pack(-side=>'left');
298
  $frame->Entry(-textvariable => \$tga_bits)->pack(-side=>'right');
299
  $frame=$mw->Frame();
300
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
301
  $frame->Label(-text => "tga rename     :")->pack(-side=>'left');
302
  $frame->Entry(-textvariable => \$rename_tga)->pack(-side=>'right');
303
  # tgc
304
  $frame=$mw->Frame();
305
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
306
  $frame->Label(-text => "tgc bits           :")->pack(-side=>'left');
307
  $frame->Entry(-textvariable => \$tgc_bits)->pack(-side=>'right');
308
  $frame=$mw->Frame();
309
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
310
  $frame->Label(-text => "tgc rename     :")->pack(-side=>'left');
311
  $frame->Entry(-textvariable => \$rename_tgc)->pack(-side=>'right');
312
  $frame=$mw->Frame();
313
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
314
  $frame->Label(-text => "classic           :")->pack(-side=>'left');
315
  $frame->Entry(-textvariable => \$classic)->pack(-side=>'right');
316
  $frame=$mw->Frame();
317
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
318
  $frame->Label(-text => "end of burst   :")->pack(-side=>'left');
319
  $frame->Entry(-textvariable => \$endofburst)->pack(-side=>'right');
320
  # tgd
321
  $frame=$mw->Frame();
322
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
323
  $frame->Label(-text => "tgd bits           :")->pack(-side=>'left');
324
  $frame->Entry(-textvariable => \$tgd_bits)->pack(-side=>'right');
325
  $frame=$mw->Frame();
326
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
327
  $frame->Label(-text => "tgd rename     :")->pack(-side=>'left');
328
  $frame->Entry(-textvariable => \$rename_tgd)->pack(-side=>'right');
329
  # exit
330
  $frame=$mw->Frame(-label=>"\n");
331
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
332
  $frame->Button(-text => "add master port", -command =>sub {WinGlobalExit(); $amp=1;})->pack (-side => 'left');
333
  $frame->Button(-text => "add slave  port", -command =>sub {WinGlobalExit(); $asp=1;})->pack (-side => 'left');
334
  if (($masters > 0) && ($slaves > 0)) {
335
    $frame->Button(-text => "set priority", -command =>sub {WinGlobalExit();})->pack (-side => 'left');
336
  };
337
  $frame->Button(-text => "next", -command =>sub {WinGlobalExit(); $next=1;})->pack (-side => 'right');
338
  MainLoop;
339
};
340
 
341
# add master port
342
sub WinAddMaster {
343
  master_init("wbm". ($masters+1));
344
  $mw = MainWindow->new;
345
  $mw->title ("Wishbone generator");
346
  $frame=$mw->Frame(-label=>"Add wishbone master port");
347
  # port name
348
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
349
  $frame->Label(-text => "Master port name:")->pack(-side=>'left');
350
  $frame->Entry(-textvariable => \$master[$masters]{"wbm"})->pack(-side=>'right');
351
  # exit
352
  $frame=$mw->Frame(-label=>"\n");
353
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
354
  $frame->Button(-text => "add master port", -command =>sub {WinGlobalExit(); $amp=1;})->pack ( -side => 'left');
355
  $frame->Button(-text => "next", -command =>sub {WinGlobalExit(); $next=1;})->pack ( -side => 'right');
356
  MainLoop;
357
};
358
 
359
sub WinMaster {
360
  $mw = MainWindow->new;
361
  $mw->title ("Wishbone generator");
362
  $frame=$mw->Frame(-label=>"Master port");
363
  # Master port
364
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
365
  $frame->Label(-text => "Master port    :")->pack(-side=>'left');
366
  $frame->Entry(-textvariable => \$master[$i]{"wbm"})->pack(-side=>'right');
367
  # dat_size
368
  $frame=$mw->Frame();
369
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
370
  $frame->Label(-text => "Data bus size :")->pack(-side=>'left');
371
  $frame->Entry(-textvariable => \$master[$i]{"dat_size"})->pack(-side=>'right');
372
  # adr size
373
  $frame=$mw->Frame();
374
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
375
  $frame->Label(-text => "Adr bus size   :")->pack(-side=>'left');
376
  $frame->Entry(-textvariable => \$master[$i]{"adr_size"})->pack(-side=>'right');
377
  # type
378
  $frame=$mw->Frame();
379
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
380
  $frame->Label(-text => "Master type   :")->pack(-side=>'left');
381
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"type"}, -text => 'Read/Write', -value => 'rw')->pack(-side=>'left');
382
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"type"}, -text => 'Read only', -value => 'ro')->pack(-side=>'left');
383
  $c = $frame->Radiobutton ( -variable => \$master[$i]{"type"}, -text => 'Write only', -value => 'wo')->pack(-side=>'left');
384
  # err_i
385
  $frame=$mw->Frame();
386
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
387
  $frame->Label(-text => "err_i   :")->pack(-side=>'left');
388
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"err_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
389
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"err_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
390
  # rty_i
391
  $frame=$mw->Frame();
392
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
393
  $frame->Label(-text => "rty_i   :")->pack(-side=>'left');
394
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"rty_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
395
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"rty_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
396
  # lock_o
397
  $frame=$mw->Frame();
398
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
399
  $frame->Label(-text => "lock_o :")->pack(-side=>'left');
400
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"lock_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
401
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"lock_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
402
  # tga_o
403
  $frame=$mw->Frame();
404
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
405
  $frame->Label(-text => "tga_o  :")->pack(-side=>'left');
406
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"tga_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
407
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"tga_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
408
  # tgc_o
409
  $frame=$mw->Frame();
410
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
411
  $frame->Label(-text => "tgc_o  :")->pack(-side=>'left');
412
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"tgc_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
413
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"tgc_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
414
  # tgd_o
415
  $frame=$mw->Frame();
416
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
417
  $frame->Label(-text => "tgd_o  :")->pack(-side=>'left');
418
  $a = $frame->Radiobutton ( -variable => \$master[$i]{"tgd_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
419
  $b = $frame->Radiobutton ( -variable => \$master[$i]{"tgd_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
420
  # exit
421
  $frame=$mw->Frame(-label=>"\n");
422
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
423
  if ($i == $masters) {
424
    $frame->Button(-text => "add slave port", -command =>sub {WinGlobalExit(); $am=1;})->pack (-side => 'left');
425
  };
426
  $frame->Button(-text => "delete", -command =>sub {WinGlobalExit(); $del=1;})->pack (-side => 'left');
427
  $frame->Button(-text => "back", -command =>sub {WinGlobalExit(); $back=1;})->pack (-side => 'left');
428
  $frame->Button(-text => "next", -command =>sub {WinGlobalExit(); $next=1;})->pack (-side => 'left');
429
  MainLoop;
430
};
431
 
432
# add slave port
433
sub WinAddSlave {
434
  slave_init("wbs" . ($slaves+1));
435
  $mw = MainWindow->new;
436
  $mw->title ("Wishbone generator");
437
  $frame=$mw->Frame(-label=>"Add wishbone slave port");
438
  # port name
439
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
440
  $frame->Label(-text => "Slave port name:")->pack(-side=>'left');
441
  $frame->Entry(-textvariable => \$slave[$slaves]{"wbs"})->pack(-side=>'right');
442
  # exit
443
  $frame=$mw->Frame(-label=>"\n");
444
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
445
  $frame->Button(-text => "add slave port", -command =>sub {WinGlobalExit(); $asp=1;})->pack ( -side => 'left');
446
  $frame->Button(-text => "next", -command =>sub {WinGlobalExit(); $next=1;})->pack ( -side => 'right');
447
  MainLoop;
448
};
449
 
450
# slave port
451
sub WinSlave {
452
  $mw = MainWindow->new;
453
  $mw->title ("Wishbone generator");
454
  $frame=$mw->Frame(-label=>"Slave port");
455
  # Slave port
456
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
457
  $frame->Label(-text => "Slave port       :")->pack(-side=>'left');
458
  $frame->Entry(-textvariable => \$slave[$i]{"wbs"})->pack(-side=>'right');
459
  # dat_size
460
  $frame=$mw->Frame();
461
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
462
  $frame->Label(-text => "Data bus size :")->pack(-side=>'left');
463
  $frame->Entry(-textvariable => \$slave[$i]{"dat_size"})->pack(-side=>'right');
464
  # adr
465
  $frame=$mw->Frame();
466
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
467
  $frame->Label(-text => "adr hi              :")->pack(-side=>'left');
468
  $frame->Entry(-textvariable => \$slave[$i]{"adr_i_hi"})->pack(-side=>'left');
469
  $frame=$mw->Frame();
470
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
471
  $frame->Label(-text => "adr lo              :")->pack(-side=>'left');
472
  $frame->Entry(-textvariable => \$slave[$i]{"adr_i_lo"})->pack(-side=>'right');
473
  # type
474
  $frame=$mw->Frame();
475
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
476
  $frame->Label(-text => "Slave type   :")->pack(-side=>'left');
477
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"type"}, -text => 'Read/Write', -value => 'rw')->pack(-side=>'left');
478
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"type"}, -text => 'Read only', -value => 'ro')->pack(-side=>'left');
479
  $c = $frame->Radiobutton ( -variable => \$slave[$i]{"type"}, -text => 'Write only', -value => 'wo')->pack(-side=>'left');
480
  # lock_i
481
  $frame=$mw->Frame();
482
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
483
  $frame->Label(-text => "lock_i   :")->pack(-side=>'left');
484
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"lock_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
485
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"lock_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
486
  # tga_i
487
  $frame=$mw->Frame();
488
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
489
  $frame->Label(-text => "tga_i   :")->pack(-side=>'left');
490
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"tga_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
491
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"tga_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
492
  # tgc_i
493
  $frame=$mw->Frame();
494
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
495
  $frame->Label(-text => "tgc_i   :")->pack(-side=>'left');
496
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"tgc_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
497
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"tgc_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
498
  # tgd_i
499
  $frame=$mw->Frame();
500
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
501
  $frame->Label(-text => "tgd_i   :")->pack(-side=>'left');
502
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"tgd_i"}, -text => 'No', -value => 0)->pack( -side=>'left');
503
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"tgd_i"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
504
  # err_o
505
  $frame=$mw->Frame();
506
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
507
  $frame->Label(-text => "err_o   :")->pack(-side=>'left');
508
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"err_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
509
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"err_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
510
  # rty_o
511
  $frame=$mw->Frame();
512
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
513
  $frame->Label(-text => "rty_o   :")->pack(-side=>'left');
514
  $a = $frame->Radiobutton ( -variable => \$slave[$i]{"rty_o"}, -text => 'No', -value => 0)->pack( -side=>'left');
515
  $b = $frame->Radiobutton ( -variable => \$slave[$i]{"rty_o"}, -text => 'Yes', -value => 1 )->pack( -side=>'right');
516
  # ss
517
  $frame=$mw->Frame();
518
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
519
  $frame->Label(-text => "Base_adr  :")->pack(-side=>'left');
520
  $frame->Entry(-textvariable => \$slave[$i]{"baseadr"})->pack(-side=>'right');
521
  $frame=$mw->Frame();
522
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
523
  $frame->Label(-text => "Size           :")->pack(-side=>'left');
524
  $frame->Entry(-textvariable => \$slave[$i]{"size"})->pack(-side=>'right');
525
  $frame=$mw->Frame();
526
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
527
  $frame->Label(-text => "Base_adr1 :")->pack(-side=>'left');
528
  $frame->Entry(-textvariable => \$slave[$i]{"baseadr1"})->pack(-side=>'right');
529
  $frame=$mw->Frame();
530
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
531
  $frame->Label(-text => "Size1          :")->pack(-side=>'left');
532
  $frame->Entry(-textvariable => \$slave[$i]{"size1"})->pack(-side=>'right');
533
  $frame=$mw->Frame();
534
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
535
  $frame->Label(-text => "Base_adr2 :")->pack(-side=>'left');
536
  $frame->Entry(-textvariable => \$slave[$i]{"baseadr2"})->pack(-side=>'right');
537
  $frame=$mw->Frame();
538
  $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
539
  $frame->Label(-text => "Size2          :")->pack(-side=>'left');
540
  $frame->Entry(-textvariable => \$slave[$i]{"size2"})->pack(-side=>'right');
541
 
542
  # exit
543
  $frame=$mw->Frame(-label=>"\n");
544
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
545
  $frame->Button(-text => "back", -command =>sub {WinGlobalExit(); $back=1;})->pack ( -side => 'left');
546
  $frame->Button(-text => "delete", -command =>sub {WinGlobalExit(); $del=1;})->pack ( -side => 'left');
547
  $frame->Button(-text => "next", -command =>sub {WinGlobalExit(); $next=1;})->pack ( -side => 'right');
548
  MainLoop;
549
};
550
 
551
# Prio shared bus
552
sub WinPrioshb {
553
  $mw = MainWindow->new;
554
  $mw->title ("Wishbone generator");
555
  $frame=$mw->Frame(-label=>"Priority for shared bus system")->pack();
556
  for ($i=1; $i le $masters; $i++) {
557
    $frame=$mw->Frame();
558
    $frame->pack(-side => 'top', -fill => 'y', -expand => 'y');
559
    $frame->Label(-text => $master[$i]{"wbm"})->pack(-side=>'left');
560
    $frame->Entry(-textvariable => \$master[$i]{"priority"})->pack(-side=>'right');
561
  };
562
  # exit
563
  $frame=$mw->Frame(-label=>"\n");
564
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
565
  $frame->Button(-text => "back", -command =>sub {WinGlobalExit(); $back=1;})->pack ( -side => 'left');
566
  $frame->Button(-text => "generate", -command =>sub {WinGlobalExit(); $next=1;})->pack ( -side => 'right');
567
  MainLoop;
568
};
569
 
570
# Prio cross bar switch
571
sub WinPriocbs {
572
  my $tmp="";
573
  $mw = MainWindow->new;
574
  $mw->title ("Wishbone generator");
575
  $frame=$mw->Frame(-label=>"Priority for crossbar switch bus system")->pack();
576
  $frame=$mw->Frame();
577
  $frame->pack(-side => 'top', -fill => 'x', -expand => 'y');
578
  $frame->Entry(-textvariable => \$tmp)->pack(-side=>'left');
579
  for ($j=1; $j le $slaves; $j++) {
580
    $frame->Entry(-textvariable => \$slave[$j]{"wbs"})->pack(-side=>'left');
581
  };
582
  for ($i=1; $i le $masters; $i++) {
583
    $frame=$mw->Frame();
584
    $frame->pack(-side => 'top', -fill => 'x', -expand => 'y');
585
    #$frame->Label(-text => $master[$i]{"wbm"})->pack(-side=>'left');
586
    $frame->Entry(-textvariable => \$master[$i]{"wbm"})->pack(-side=>'left');
587
    for ($j=1; $j le $slaves; $j++) {
588
      #$frame->Label(-text => $master[$i]{"priority_".($slave[$j]{"wbs"})})->pack(-side=>'left');
589
      $frame->Entry(-textvariable => \$master[$i]{"priority_".($slave[$j]{"wbs"})})->pack(-side=>'left');
590
    };
591
  };
592
  # exit
593
  $frame=$mw->Frame(-label=>"\n");
594
  $frame->pack(-side => 'right', -fill => 'y', -expand => 'y');
595
  $frame->Button(-text => "back", -command =>sub {WinGlobalExit(); $back=1;})->pack ( -side => 'left');
596
  $frame->Button(-text => "generate", -command =>sub {WinGlobalExit(); $next=1;})->pack ( -side => 'right');
597
  MainLoop;
598
};
599
 
600
# delete wishbone master
601
sub wbm_del {
602
  my $i;
603
  if ($_[0] != $masters) {
604
    for ($i=$_[0]; $i lt $masters; $i++) {
605
      $master[$i]=$master[$i+1];
606
    };
607
  };
608
  $masters--;
609
};
610
 
611
# delete wishbone slave
612
sub wbs_del {
613
  my $i;
614
  if ($_[0] != $slaves) {
615
    for ($i=$_[0]; $i lt $slaves; $i++) {
616
      $slave[$i]=$slave[$i+1];
617
    };
618
  };
619
  $slaves--;
620
};
621
 
622
# GUI FSM
623
sub gui_fsm {
624
$i=1;
625
until ($state eq "bye") {
626
  $amp=0; $asp=0; $back=0; $next=0; $del=0;
627
  if ($state eq 'WinGlobal') {
628
    WinGlobal;
629
    if ($amp == 1) {
630
      $state='WinAddMaster';
631
    } elsif ($asp == 1) {
632
      $state='WinAddSlave';
633
    } elsif ($next == 1) {
634
      $i=1;
635
      if ($masters == 0) {
636
        $state='WinAddMaster';
637
      } else {
638
        $state='WinMaster';
639
      };
640
    } else {
641
      $state='WinPrio';
642
    };
643
  } elsif ($state eq 'WinAddMaster') {
644
    WinAddMaster;
645
    if ($next == 1) {
646
      $i=1;
647
      $state='WinMaster';
648
    };
649
  } elsif ($state eq 'WinMaster') {
650
    WinMaster;
651
    if ($del == 1) {
652
      wbm_del($i);
653
      $state='WinGlobal';
654
      $i=1;
655
    } elsif ($asp == 1) {
656
      $state='WinAddSlave';
657
    } elsif ($next == 1) {
658
      if ($i == $masters) {
659
        $i=1;
660
        if ($slaves == 0) {
661
          $state='WinAddSlave';
662
        } else {
663
          $state='WinSlave';
664
        };
665
      } else {
666
        $i++
667
      };
668
    } else {
669
      if ($i == 1) {
670
        $state='WinGlobal';
671
      } else {
672
        $i--;
673
      }
674
    };
675
  } elsif ($state eq 'WinAddSlave') {
676
    WinAddSlave;
677
    if ($next == 1) {
678
      $i=1;
679
      $state='WinSlave';
680
    };
681
  } elsif ($state eq 'WinSlave') {
682
    WinSlave;
683
    if ($del == 1) {
684
      wbs_del($i);
685
      $i=1;
686
      $state='WinGlobal';
687
    } elsif ($next == 1) {
688
      if ($i eq $slaves) {
689
        $state='WinPrio';
690
      } else {
691
        $i++
692
      };
693
    } else {
694
      if ($i == 1) {
695
        $state='WinGlobal';
696
      } else {
697
        $i--;
698
      }
699
    };
700
  } elsif ($state eq 'WinPrio') {
701
    if ($interconnect eq "sharedbus") {
702
      WinPrioshb;
703
    } else {
704
      WinPriocbs;
705
    };
706
    if ($next == 1) {
707
      $state='bye';
708
    } else {
709
      $state='WinGlobal';
710
    };
711
  };
712
};
713
};
714
 
715
sub generate_defines {
716
  open(OUTFILE,"> $_[0]") or die "could not open $infile for writing";
717
  printf OUTFILE "# Generated by PERL program wishbone.pl.\n";
718
  printf OUTFILE "# File used as input for wishbone arbiter generation\n";
719
  $tmp=localtime(time);
720
  printf OUTFILE "# Generated %s\n\n",$tmp;
721
  printf OUTFILE "filename=%s\n",$outfile;
722
  printf OUTFILE "intercon=%s\n",$intercon;
723
  printf OUTFILE "syscon=%s\n",$syscon;
724
  printf OUTFILE "target=%s\n",$target;
725
  printf OUTFILE "hdl=%s\n",$hdl;
726
  printf OUTFILE "signal_groups=%s\n",$signal_groups;
727
  printf OUTFILE "tga_bits=%s\n",$tga_bits;
728
  printf OUTFILE "tgc_bits=%s\n",$tgc_bits;
729
  printf OUTFILE "tgd_bits=%s\n",$tgd_bits;
730
  printf OUTFILE "rename_tga=%s\n",$rename_tga;
731
  printf OUTFILE "rename_tgc=%s\n",$rename_tgc;
732
  printf OUTFILE "rename_tgd=%s\n",$rename_tgd;
733
  printf OUTFILE "classic=%s\n",$classic;
734
  printf OUTFILE "endofburst=%s\n",$endofburst;
735
  printf OUTFILE "dat_size=%s\n",$dat_size;
736
  printf OUTFILE "adr_size=%s\n",$adr_size;
737
  printf OUTFILE "mux_type=%s\n",$mux_type;
738
  printf OUTFILE "interconnect=%s\n",$interconnect;
739
  for ($i=1; $i le $masters; $i++) {
740
    printf OUTFILE "\nmaster %s\n",$master[$i]{"wbm"};
741
    printf OUTFILE "  type=%s\n",$master[$i]{"type"};
742
    printf OUTFILE "  lock_o=%s\n",$master[$i]{"lock_o"};
743
    printf OUTFILE "  tga_o=%s\n",$master[$i]{"tga_o"};
744
    printf OUTFILE "  tgc_o=%s\n",$master[$i]{"tgc_o"};
745
    printf OUTFILE "  tgd_o=%s\n",$master[$i]{"tgd_o"};
746
    printf OUTFILE "  err_i=%s\n",$master[$i]{"err_i"};
747
    printf OUTFILE "  rty_i=%s\n",$master[$i]{"rty_i"};
748 13 unneback
    if ($interconnect eq "sharedbus") {
749 2 unneback
      printf OUTFILE "  priority=%s\n",$master[$i]{"priority"};
750
    } else {
751
      for ($j=1; $j le $slaves; $j++) {
752
        printf OUTFILE "  priority_%s=%s\n",$slave[$j]{"wbs"},$master[$i]{"priority_".($slave[$j]{"wbs"})};
753
      };
754
    };
755
    printf OUTFILE "end master %s\n",$master[$i]{"wbm"};
756
  };
757
  for ($i=1; $i le $slaves; $i++) {
758
    printf OUTFILE "\nslave %s\n",$slave[$i]{"wbs"};
759
    printf OUTFILE "  type=%s\n",$slave[$i]{"type"};
760
    printf OUTFILE "  adr_i_hi=%s\n",$slave[$i]{"adr_i_hi"};
761
    printf OUTFILE "  adr_i_lo=%s\n",$slave[$i]{"adr_i_lo"};
762
    printf OUTFILE "  tga_i=%s\n",$slave[$i]{"tga_i"};
763
    printf OUTFILE "  tgc_i=%s\n",$slave[$i]{"tgc_i"};
764
    printf OUTFILE "  tgd_i=%s\n",$slave[$i]{"tgd_i"};
765
    printf OUTFILE "  lock_i=%s\n",$slave[$i]{"lock_i"};
766
    printf OUTFILE "  err_o=%s\n",$slave[$i]{"err_o"};
767
    printf OUTFILE "  rty_o=%s\n",$slave[$i]{"rty_o"};
768
    printf OUTFILE "  baseadr=0x%s\n",$slave[$i]{"baseadr"};
769
    printf OUTFILE "  size=0x%s\n",$slave[$i]{"size"};
770
    printf OUTFILE "  baseadr1=0x%s\n",$slave[$i]{"baseadr1"};
771
    printf OUTFILE "  size1=0x%s\n",$slave[$i]{"size1"};
772
    printf OUTFILE "  baseadr2=0x%s\n",$slave[$i]{"baseadr2"};
773
    printf OUTFILE "  size2=0x%s\n",$slave[$i]{"size2"};
774
    printf OUTFILE "end slave %s\n",$slave[$i]{"wbs"};
775
  };
776
  close(OUTFILE);
777
};
778
 
779
# print header
780
sub gen_header {
781
  printf OUTFILE "%s Generated by PERL program wishbone.pl. Do not edit this file.\n%s\n",$comment,$comment;
782
  printf OUTFILE "%s For defines see %s\n%s\n",$comment,$infile,$comment;
783
  $tmp=localtime(time);
784
  printf OUTFILE "%s Generated %s\n%s\n",$comment,$tmp,$comment;
785
  printf OUTFILE "%s Wishbone masters:\n",$comment;
786
  for ($i=1; $i le $masters; $i++) {
787
    printf OUTFILE "%s   %s\n",$comment,$master[$i]{"wbm"}; };
788
  printf OUTFILE "%s\n%s Wishbone slaves:\n",$comment,$comment;
789
  for ($i=1; $i le $slaves; $i++) {
790
    printf OUTFILE "%s   %s\n",$comment,$slave[$i]{"wbs"};
791
    if ($slave[$i]{"size"} ne ffffffff) {
792
      printf OUTFILE "%s     baseadr 0x%s - size 0x%s\n",$comment,$slave[$i]{"baseadr"},$slave[$i]{"size"}};
793
    if ($slave[$i]{"size1"} ne ffffffff) {
794
      printf OUTFILE "%s     baseadr 0x%s - size 0x%s\n",$comment,$slave[$i]{"baseadr1"},$slave[$i]{"size1"}};
795
    if ($slave[$i]{"size2"} ne ffffffff) {
796
      printf OUTFILE "%s     baseadr 0x%s - size 0x%s\n",$comment,$slave[$i]{"baseadr2"},$slave[$i]{"size2"}};
797
    if ($slave[$i]{"size3"} ne ffffffff) {
798
      printf OUTFILE "%s     baseadr 0x%s - size 0x%s\n",$comment,$slave[$i]{"baseadr3"},$slave[$i]{"size3"}};
799
  };
800
};
801
 
802
sub gen_vhdl_package {
803
  printf OUTFILE "-----------------------------------------------------------------------------------------\n";
804
  printf OUTFILE "library IEEE;\nuse IEEE.std_logic_1164.all;\n\n";
805
  printf OUTFILE "package %s_package is\n\n",$intercon;
806
 
807
  # records ?
808
  if ($signal_groups eq 1) {
809
    for ($i=1; $i le $masters; $i++) {
810
      # input record
811
      printf OUTFILE "type %s_wbm_i_type is record\n",$master[$i]{"wbm"};
812
      if ($master[$i]{"type"} =~ /(ro|rw)/) { printf OUTFILE "  dat_i : std_logic_vector(%s downto 0);\n",$master[$i]{"dat_size"}-1;};
813
      if ($master[$i]{"err_i"} eq 1) { printf OUTFILE "  err_i : std_logic;\n";};
814
      if ($master[$i]{"rty_i"} eq 1) { printf OUTFILE "  rty_i : std_logic;\n";};
815
      printf OUTFILE "  ack_i : std_logic;\n";
816
      printf OUTFILE "end record;\n";
817
      # output record
818
      printf OUTFILE "type %s_wbm_o_type is record\n",$master[$i]{"wbm"};
819
      if ($master[$i]{"type"} =~ /(wo|rw)/) {
820
        printf OUTFILE "  dat_o : std_logic_vector(%s downto 0);\n",$master[$i]{"dat_size"}-1;
821
        printf OUTFILE "  we_o  : std_logic;\n"; };
822
      if ($dat_size eq 8) {
823
        printf OUTFILE "  sel_o : std_logic;\n";
824
      } else {
825
        printf OUTFILE "  sel_o : std_logic_vector(%s downto 0);\n",$dat_size/8-1; };
826
      printf OUTFILE "  adr_o : std_logic_vector(%s downto 0);\n",$adr_size-1;
827
      if ($master[$i]{"lock_o"} eq 1) { printf OUTFILE "  lock_o : std_logic;\n";};
828
      if ($master[$i]{"tga_o"} eq 1) { printf OUTFILE "  %s_o : std_logic_vector(%s downto 0);\n",$rename_tga, $tga_bits-1;};
829
      if ($master[$i]{"tgc_o"} eq 1) { printf OUTFILE "  %s_o : std_logic_vector(%s downto 0);\n",$rename_tgc, $tgc_bits-1;};
830
      printf OUTFILE "  cyc_o : std_logic;\n";
831
      printf OUTFILE "  stb_o : std_logic;\n";
832
      printf OUTFILE "end record;\n\n";
833
    }; #end for
834
    for ($i=1; $i le $slaves; $i++) {
835
      # input record
836
      printf OUTFILE "type %s_wbs_i_type is record\n",$slave[$i]{"wbs"};
837
      if ($slave[$i]{"type"} ne "ro") {
838 4 unneback
        printf OUTFILE "  dat_i : std_logic_vector(%s downto 0);\n",$slave[$i]{"dat_size"}-1;
839 2 unneback
        printf OUTFILE "  we_i  : std_logic;\n"; };
840
      if ($dat_size eq 8) {
841
        printf OUTFILE "  sel_i : std_logic;\n";
842
      } else {
843
        printf OUTFILE "  sel_i : std_logic_vector(%s downto 0);\n",$dat_size/8-1; };
844
      if ($slave[$i]{"adr_i_hi"} gt 0) { printf OUTFILE "  adr_i : std_logic_vector(%s downto %s);\n",$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"};};
845
      if ($slave[$i]{"tga_i"} eq 1) { printf OUTFILE "  %s_i : std_logic_vector(%s downto 0);\n",$rename_tga,$tga_bits-1; };
846
      if ($slave[$i]{"tgc_i"} eq 1) { printf OUTFILE "  %s_i : std_logic_vector(%s downto 0);\n",$rename_tgc,$tgc_bits-1; };
847
      printf OUTFILE "  cyc_i : std_logic;\n";
848
      printf OUTFILE "  stb_i : std_logic;\n";
849
      printf OUTFILE "end record;\n";
850
      # output record
851
      printf OUTFILE "type %s_wbs_o_type is record\n",$slave[$i]{"wbs"};
852 4 unneback
      if ($slave[$i]{"type"} =~ /(ro|rw)/) { printf OUTFILE "  dat_o : std_logic_vector(%s downto 0);\n",$slave[$i]{"dat_size"}-1 };
853 2 unneback
      if ($slave[$i]{"rty_o"} eq 1) { printf OUTFILE "  rty_o : std_logic;\n" };
854
      if ($slave[$i]{"err_o"} eq 1) { printf OUTFILE "  err_o : std_logic;\n" };
855
      printf OUTFILE "  ack_o : std_logic;\n";
856
      printf OUTFILE "end record;\n";
857
    }; #end for
858
  }; #end if signal groups
859
 
860
  # overload of "and"
861
  printf OUTFILE "\nfunction \"and\" (\n  l : std_logic_vector;\n  r : std_logic)\nreturn std_logic_vector;\n";
862
  printf OUTFILE "end %s_package;\n",$intercon;
863
  printf OUTFILE "package body %s_package is\n",$intercon;
864
  printf OUTFILE "\nfunction \"and\" (\n  l : std_logic_vector;\n  r : std_logic)\nreturn std_logic_vector is\n";
865
  printf OUTFILE "  variable result : std_logic_vector(l'range);\n";
866
  printf OUTFILE "begin  -- \"and\"\n  for i in l'range loop\n  result(i) := l(i) and r;\nend loop;  -- i\nreturn result;\nend \"and\";\n";
867
  printf OUTFILE "end %s_package;\n",$intercon;
868
};
869
 
870
sub gen_trafic_ctrl {
871
  if ($hdl eq "vhdl") {
872
  if ($target eq "xilinx") {
873
    print OUTFILE <<EOP;
874
 
875
library IEEE;
876
use IEEE.std_logic_1164.all;
877
 
878
entity trafic_supervision is
879
 
880
  generic (
881 10 unneback
    priority     : integer := 1;
882
    tot_priority : integer := 2);
883 2 unneback
 
884
  port (
885
    bg           : in  std_logic;       -- bus grant
886
    ce           : in  std_logic;       -- clock enable
887
    trafic_limit : out std_logic;
888
    clk          : in  std_logic;
889
    reset        : in  std_logic);
890
 
891
end trafic_supervision;
892
 
893
architecture rtl of trafic_supervision is
894
 
895
  signal shreg : std_logic_vector(tot_priority-1 downto 0);
896
  signal cntr : integer range 0 to tot_priority;
897
 
898
begin  -- rtl
899
 
900
  -- purpose: holds information of usage of latest cycles
901
  -- type   : sequential
902
  -- inputs : clk, reset, ce, bg
903
  -- outputs: shreg('left)
904
  sh_reg: process (clk)
905
  begin  -- process shreg
906
    if clk'event and clk = '1' then  -- rising clock edge
907
      if ce='1' then
908
        shreg <= shreg(tot_priority-2 downto 0) & bg;
909
      end if;
910
    end if;
911
  end process sh_reg;
912
 
913
  -- purpose: keeps track of used cycles
914
  -- type   : sequential
915
  -- inputs : clk, reset, shreg('left), bg, ce
916
  -- outputs: trafic_limit
917
  counter: process (clk, reset)
918
  begin  -- process counter
919
    if reset = '1' then                 -- asynchronous reset (active hi)
920
      cntr <= 0;
921
      trafic_limit <= '0';
922
    elsif clk'event and clk = '1' then  -- rising clock edge
923
      if ce='1' then
924 4 unneback
        if bg='1' and shreg(tot_priority-1)/='1' then
925 2 unneback
          cntr <= cntr + 1;
926
          if cntr=priority-1 then
927
            trafic_limit <= '1';
928
          end if;
929
        elsif bg='0' and shreg(tot_priority-1)='1' then
930
          cntr <= cntr - 1;
931
          if cntr=priority then
932
            trafic_limit <= '0';
933
          end if;
934
        end if;
935
      end if;
936
    end if;
937
  end process counter;
938
 
939
end rtl;
940
EOP
941
  } else {
942
    print OUTFILE<<EOP;
943
library IEEE;
944
use IEEE.std_logic_1164.all;
945
 
946
entity trafic_supervision is
947
 
948
  generic (
949 11 unneback
    priority     : integer := 1;
950
    tot_priority : integer := 2);
951 2 unneback
 
952
  port (
953
    bg           : in  std_logic;       -- bus grant
954
    ce           : in  std_logic;       -- clock enable
955
    trafic_limit : out std_logic;
956
    clk          : in  std_logic;
957
    reset        : in  std_logic);
958
 
959
end trafic_supervision;
960
 
961
architecture rtl of trafic_supervision is
962
 
963
  signal shreg : std_logic_vector(tot_priority-1 downto 0);
964
  signal cntr : integer range 0 to tot_priority;
965
 
966
begin  -- rtl
967
 
968
  -- purpose: holds information of usage of latest cycles
969
  -- type   : sequential
970
  -- inputs : clk, reset, ce, bg
971
  -- outputs: shreg('left)
972
  sh_reg: process (clk,reset)
973
  begin  -- process shreg
974
    if reset = '1' then                 -- asynchronous reset (active hi)
975
      shreg <= (others=>'0');
976
    elsif clk'event and clk = '1' then  -- rising clock edge
977
      if ce='1' then
978
        shreg <= shreg(tot_priority-2 downto 0) & bg;
979
      end if;
980
    end if;
981
  end process sh_reg;
982
 
983
  -- purpose: keeps track of used cycles
984
  -- type   : sequential
985
  -- inputs : clk, reset, shreg('left), bg, ce
986
  -- outputs: trafic_limit
987
  counter: process (clk, reset)
988
  begin  -- process counter
989
    if reset = '1' then                 -- asynchronous reset (active hi)
990
      cntr <= 0;
991
      trafic_limit <= '0';
992
    elsif clk'event and clk = '1' then  -- rising clock edge
993
      if ce='1' then
994
        if bg='1' and shreg(tot_priority-1)='0' then
995
          cntr <= cntr + 1;
996
          if cntr=priority-1 then
997
            trafic_limit <= '1';
998
          end if;
999
        elsif bg='0' and shreg(tot_priority-1)='1' then
1000
          cntr <= cntr - 1;
1001
          if cntr=priority then
1002
            trafic_limit <= '0';
1003
          end if;
1004
        end if;
1005
      end if;
1006
    end if;
1007
  end process counter;
1008
 
1009
end rtl;
1010
EOP
1011
};
1012
} else {
1013
 
1014
};
1015
};
1016
 
1017
sub gen_entity {
1018
  # library usage
1019
  printf OUTFILE "\nlibrary IEEE;\nuse IEEE.std_logic_1164.all;\n";
1020
  printf OUTFILE "use work.%s_package.all;\n",$intercon;
1021
 
1022
  # entity intercon
1023
  printf OUTFILE "\nentity %s is\n  port (\n",$intercon;
1024
  # records
1025
  if ($signal_groups eq 1) {
1026
    # master port(s)
1027
    printf OUTFILE "  -- wishbone master port(s)\n";
1028
    for ($i=1; $i le $masters; $i++) {
1029
            printf OUTFILE "  -- %s\n",$master[$i]{"wbm"};
1030
      printf OUTFILE "  %s_wbm_i : out %s_wbm_i_type;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1031
      printf OUTFILE "  %s_wbm_o : in  %s_wbm_o_type;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1032
    }; #end for
1033
    # slave port(s)
1034
    printf OUTFILE "  -- wishbone slave port(s)\n";
1035
    for ($i=1; $i le $slaves; $i++) {
1036
      printf OUTFILE "  -- %s\n",$slave[$i]{"wbs"};
1037
      printf OUTFILE "  %s_wbs_i : out %s_wbs_i_type;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1038
      printf OUTFILE "  %s_wbs_o : in %s_wbs_o_type;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1039
    };
1040
  # separate signals
1041
  } else {
1042
    printf OUTFILE "  -- wishbone master port(s)\n";
1043
    for ($i=1; $i le $masters; $i++) {
1044
      printf OUTFILE "  -- %s\n",$master[$i]{"wbm"};
1045
      if ($master[$i]{"type"} ne "wo") {
1046
        printf OUTFILE "  %s_dat_i : out std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$dat_size-1; };
1047
      printf OUTFILE "  %s_ack_i : out std_logic;\n",$master[$i]{"wbm"};
1048
      if ($master[$i]{"err_i"} eq 1) {
1049
        printf OUTFILE "  %s_err_i : out std_logic;\n",$master[$i]{"wbm"}; };
1050
      if ($master[$i]{"rty_i"} eq 1) {
1051
        printf OUTFILE "  %s_rty_i : out std_logic;\n",$master[$i]{"wbm"}; };
1052
      if ($master[$i]{"type"} ne "ro") {
1053
        printf OUTFILE "  %s_dat_o : in  std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$dat_size-1;
1054
        printf OUTFILE "  %s_we_o  : in  std_logic;\n",$master[$i]{"wbm"};
1055
      };
1056
      if ($dat_size ge 16) {
1057
        printf OUTFILE "  %s_sel_o : in  std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$dat_size/8-1; };
1058
      printf OUTFILE "  %s_adr_o : in  std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$adr_size-1;
1059
      if ($master[$i]{"tgc_o"} eq 1) {
1060
        printf OUTFILE "  %s_%s_o : in  std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$rename_tgc,$tgc_bits-1; };
1061
      if ($master[$i]{"tga_o"} eq 1) {
1062
        printf OUTFILE "  %s_%s_o : in  std_logic_vector(%s downto 0);\n",$master[$i]{"wbm"},$rename_tga,$tga_bits-1; };
1063
      printf OUTFILE "  %s_cyc_o : in  std_logic;\n",$master[$i]{"wbm"};
1064
      printf OUTFILE "  %s_stb_o : in  std_logic;\n",$master[$i]{"wbm"};
1065
    };
1066
    printf OUTFILE "  -- wishbone slave port(s)\n";
1067
    for ($i=1; $i le $slaves; $i++) {
1068
      printf OUTFILE "  -- %s\n",$slave[$i]{"wbs"};
1069
      if ($slave[$i]{"type"} ne "wo") {
1070
        printf OUTFILE "  %s_dat_o : in  std_logic_vector(%s downto 0);\n",$slave[$i]{"wbs"},$dat_size-1; };
1071
      printf OUTFILE "  %s_ack_o : in  std_logic;\n",$slave[$i]{"wbs"};
1072
      if ($slave[$i]{"err_o"} eq 1) {
1073
        printf OUTFILE "  %s_err_o : in  std_logic;\n",$slave[$i]{"wbs"}; };
1074
      if ($slave[$i]{"rty_o"} eq 1) {
1075
        printf OUTFILE "  %s_rty_o : in  std_logic;\n",$slave[$i]{"wbs"}; };
1076
      if ($slave[$i]{"type"} ne "ro") {
1077
        printf OUTFILE "  %s_dat_i : out std_logic_vector(%s downto 0);\n",$slave[$i]{"wbs"},$dat_size-1;
1078
        printf OUTFILE "  %s_we_i  : out std_logic;\n",$slave[$i]{"wbs"};
1079
      };
1080
      if ($dat_size ge 16) {
1081
        printf OUTFILE "  %s_sel_i : out std_logic_vector(%s downto 0);\n",$slave[$i]{"wbs"},$dat_size/8-1; };
1082
      printf OUTFILE "  %s_adr_i : out std_logic_vector(%s downto %s);\n",$slave[$i]{"wbs"},$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"};
1083
      if ($slave[$i]{"tgc_i"} eq 1) {
1084
        printf OUTFILE "  %s_%s_i : out std_logic_vector(%s downto 0);\n",$slave[$i]{"wbs"},$rename_tgc,$tgc_bits-1; };
1085
      if ($slave[$i]{"tga_i"} eq 1) {
1086
        printf OUTFILE "  %s_%s_i : out std_logic_vector(%s downto 0);\n",$slave[$i]{"wbs"},$rename_tga,$tga_bits-1; };
1087
      printf OUTFILE "  %s_cyc_i : out std_logic;\n",$slave[$i]{"wbs"};
1088
      printf OUTFILE "  %s_stb_i : out std_logic;\n",$slave[$i]{"wbs"};
1089
    };
1090
  };
1091
  # clock and reset
1092
  printf OUTFILE "  -- clock and reset\n";
1093
  printf OUTFILE "  clk   : in std_logic;\n";
1094
  printf OUTFILE "  reset : in std_logic);\n";
1095
  printf OUTFILE "end %s;\n",$intercon;
1096
};
1097
 
1098
 
1099
# generate signals for remapping (for records)
1100
sub gen_sig_remap {
1101
  sub gen_sig_dec {
1102
    if ($_[1] gt 0) {
1103
      printf OUTFILE "  signal %s : std_logic_vector(%s downto %s);\n",$_[0],$_[1]-1,$_[2];
1104
    } else {
1105
      printf OUTFILE "  signal %s : std_logic;\n",$_[0];
1106
    };
1107
  };
1108
    for ($i=1; $i le $masters; $i++) {
1109
      if ($master[$i]{"type"} ne "wo") {
1110
        gen_sig_dec($master[$i]{"wbm"}.'_dat_i',$dat_size,0); };
1111
      gen_sig_dec($master[$i]{"wbm"}.'_ack_i');
1112
      if ($master[$i]{"err_i"} eq 1) {
1113
        gen_sig_dec($master[$i]{"wbm"}.'_err_i'); };
1114
      if ($master[$i]{"rty_i"} eq 1) {
1115
        gen_sig_dec($master[$i]{"wbm"}.'_rty_i') };
1116
      if ($master[$i]{"type"} ne "ro") {
1117
        gen_sig_dec($master[$i]{"wbm"}.'_dat_o',$dat_size,0);
1118
        gen_sig_dec($master[$i]{"wbm"}.'_we_o ');
1119
      };
1120
      if ($dat_size > 8) {
1121
        gen_sig_dec($master[$i]{"wbm"}.'_sel_o',$dat_size/8,0); };
1122
      gen_sig_dec($master[$i]{"wbm"}.'_adr_o',$adr_size,0);
1123
      if ($master[$i]{"tga_o"} eq 1) {
1124
        gen_sig_dec($master[$i]{"wbm"}.'_'.$rename_tga.'_o',$tga_bits,0); };
1125
      if ($master[$i]{"tgc_o"} eq 1) {
1126
        gen_sig_dec($master[$i]{"wbm"}.'_'.$rename_tgc.'_o',$tgc_bits,0); };
1127
      if ($master[$i]{"tgd_o"} eq 1) {
1128
        gen_sig_dec($master[$i]{"wbm"}.'_'.$rename_tgd.'_o',$tgd_bits,0); };
1129
      gen_sig_dec($master[$i]{"wbm"}.'_cyc_o');
1130
      gen_sig_dec($master[$i]{"wbm"}.'_stb_o');
1131
    };
1132
    for ($i=1; $i le $slaves; $i++) {
1133
      if ($slave[$i]{"type"} ne "wo") {
1134
        gen_sig_dec($slave[$i]{"wbs"}.'_dat_o',$dat_size,0); };
1135
      gen_sig_dec($slave[$i]{"wbs"}.'_ack_o');
1136
      if ($slave[$i]{"err_o"} eq 1) {
1137
        gen_sig_dec($slave[$i]{"wbs"}.'_err_o'); };
1138
      if ($slave[$i]{"rty_o"} eq 1) {
1139
        gen_sig_dec($slave[$i]{"wbs"}.'_rty_o'); };
1140
      if ($slave[$i]{"type"} ne "ro") {
1141
        gen_sig_dec($slave[$i]{"wbs"}.'_dat_i',$dat_size,0);
1142
        gen_sig_dec($slave[$i]{"wbs"}.'_we_i ');
1143
      };
1144
      if ($dat_size > 8) {
1145
        gen_sig_dec($slave[$i]{"wbs"}.'_sel_i',$dat_size/8,0); };
1146
      gen_sig_dec($slave[$i]{"wbs"}.'_adr_i',$slave[$i]{"adr_i_hi"}+1,$slave[$i]{"adr_i_lo"});
1147
      if ($slave[$i]{"tga_i"} eq 1) {
1148
        gen_sig_dec($slave[$i]{"wbs"}.'_'.$rename_tga.'_i',$tga_bits,0); };
1149
      if ($slave[$i]{"tgc_i"} eq 1) {
1150
        gen_sig_dec($slave[$i]{"wbs"}.'_'.$rename_tgc.'_i',$tgc_bits,0); };
1151
      if ($slave[$i]{"tgd_i"} eq 1) {
1152
        gen_sig_dec($slave[$i]{"wbs"}.'_'.$rename_tgd.'_i',$tgd_bits,0); };
1153
      gen_sig_dec($slave[$i]{"wbs"}.'_cyc_i');
1154
      gen_sig_dec($slave[$i]{"wbs"}.'_stb_i');
1155
    };
1156
};
1157
 
1158
sub gen_global_signals {
1159
  # single master
1160
  if ($masters eq 1) {
1161
    # slave select for generation of stb_i to slaves
1162
    for ($i=1; $i le $slaves; $i++) {
1163
      printf OUTFILE "  signal %s_ss : std_logic; -- slave select\n",$slave[$i]{"wbs"}; };
1164
  # shared bus
1165
  } elsif ($interconnect eq "sharedbus") {
1166
    # bus grant
1167
    for ($i=1; $i le $masters; $i++) {
1168
      printf OUTFILE "  signal %s_bg : std_logic; -- bus grant\n",$master[$i]{"wbm"}; };
1169
    # slave select for generation of stb_i to slaves
1170
    for ($i=1; $i le $slaves; $i++) {
1171
      printf OUTFILE "  signal %s_ss : std_logic; -- slave select\n",$slave[$i]{"wbs"}; };
1172
  # crossbarswitch
1173
  } else {
1174
    for ($i=1; $i le $masters; $i++) {
1175
      for ($j=1; $j le $slaves; $j++) {
1176
        if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1177
          printf OUTFILE "  signal %s_%s_ss : std_logic; -- slave select\n",$master[$i]{"wbm"},$slave[$j]{"wbs"};
1178
          printf OUTFILE "  signal %s_%s_bg : std_logic; -- bus grant\n",$master[$i]{"wbm"},$slave[$j]{"wbs"};
1179
        };
1180
      };
1181
    };
1182
  };
1183
};
1184
 
1185
sub gen_arbiter {
1186
  # out: wbm_bg (bus grant)
1187
  if ($masters eq 1) {
1188
    # ack_i
1189
    # cyc_i
1190
    # printf OUTFILE "%s_bg <= %s_cyc_o;\n",$master[1]{"wbm"},$master[1]{"wbm"};
1191
  # sharedbus
1192
  } elsif ($interconnect eq "sharedbus") {
1193
    printf OUTFILE "arbiter_sharedbus: block\n";
1194
    for ($i=1; $i le $masters; $i++) {
1195
      printf OUTFILE "  signal %s_bg_1, %s_bg_2, %s_bg_q : std_logic;\n",$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1196
    for ($i=1; $i le $masters; $i++) {
1197
      printf OUTFILE "  signal %s_trafic_ctrl_limit : std_logic;\n",$master[$i]{"wbm"}; };
1198
    printf OUTFILE "  signal ack, ce, idle :std_logic;\n";
1199
    printf OUTFILE "begin -- arbiter\n";
1200
    printf OUTFILE "ack <= %s_ack_o",$slave[1]{"wbs"};
1201
    for ($i=2; $i le $slaves; $i++) {
1202
      printf OUTFILE " or %s_ack_o",$slave[$i]{"wbs"}; };
1203
    printf OUTFILE ";\n";
1204
    # instantiate trafic_supervision(s)
1205
    for ($i=1; $i le $masters; $i++) {
1206
      printf OUTFILE "\ntrafic_supervision_%s : entity work.trafic_supervision\n",$i;
1207
      printf OUTFILE "generic map(\n";
1208
      printf OUTFILE "  priority => %s,\n",$master[$i]{"priority"};
1209
      printf OUTFILE "  tot_priority => %s)\n",$priority;
1210
      printf OUTFILE "port map(\n";
1211
      printf OUTFILE "  bg => %s_bg,\n",$master[$i]{"wbm"};
1212
      printf OUTFILE "  ce => ce,\n";
1213
      printf OUTFILE "  trafic_limit => %s_trafic_ctrl_limit,\n",$master[$i]{"wbm"};
1214
      printf OUTFILE "  clk => clk,\n";
1215
      printf OUTFILE "  reset => reset);\n"; };
1216
    # _bg_q
1217
    # bg eq 1 => set
1218
    # end of cycle => reset
1219
    for ($i=1; $i le $masters; $i++) {
1220
      printf OUTFILE "\nprocess(clk,reset)\nbegin\nif reset='1' then\n";
1221
      printf OUTFILE "  %s_bg_q <= '0';\n",$master[$i]{"wbm"};
1222
      printf OUTFILE "elsif clk'event and clk='1' then\n";
1223
      printf OUTFILE "if %s_bg_q='0' then\n",$master[$i]{"wbm"};
1224
      printf OUTFILE "  %s_bg_q <= %s_bg;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1225
      printf OUTFILE "elsif ack='1'";
1226
      if ($master[$i]{"tgc_o"} eq 1) {
1227
        printf OUTFILE " and (%s_%s_o=\"%s\" or %s_%s_o=\"%s\")",$master[$i]{"wbm"},$rename_tgc,$classic,$master[$i]{"wbm"},$rename_tgc,$endofburst; };
1228
      printf OUTFILE " then\n  %s_bg_q <= '0';\nend if;\nend if;\nend process;\n",$master[$i]{"wbm"};
1229
    }; # end for
1230
    # _bg
1231
    printf OUTFILE "\nidle <= '1' when %s_bg_q='0'",$master[1]{"wbm"};
1232
    for ($i=2; $i le $masters; $i++) {
1233
      printf OUTFILE " and %s_bg_q='0'",$master[$i]{"wbm"}; };
1234
    printf OUTFILE " else '0';\n";
1235
    printf OUTFILE "%s_bg_1 <= '1' when idle='1' and %s_cyc_o='1' and %s_trafic_ctrl_limit='0' else '0';\n",$master[1]{"wbm"},$master[1]{"wbm"},$master[1]{"wbm"};
1236 7 unneback
    $depend = $master[1]{"wbm"}."_bg_1='0'";
1237 2 unneback
    for ($i=2; $i le $masters; $i++) {
1238 7 unneback
      printf OUTFILE "%s_bg_1 <= '1' when idle='1' and %s_cyc_o='1' and %s_trafic_ctrl_limit='0' and (%s) else '0';\n",$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"},$depend;
1239
      $depend = $depend." and ".$master[$i]{"wbm"}."_bg_1='0'";
1240
    };
1241
 
1242
    printf OUTFILE "%s_bg_2 <= '1' when idle='1' and (%s) and %s_cyc_o='1' else '0';\n",$master[1]{"wbm"},$depend,$master[1]{"wbm"};
1243
    $depend = $depend." and ".$master[1]{"wbm"}."_bg_2='0'";
1244 2 unneback
    for ($i=2; $i le $masters; $i++) {
1245 7 unneback
      printf OUTFILE "%s_bg_2 <= '1' when idle='1' and (%s) and %s_cyc_o='1' else '0';\n",$master[$i]{"wbm"},$depend,$master[$i]{"wbm"};
1246
      $depend = $depend." and ".$master[$i]{"wbm"}."_bg_2='0'";
1247
    };
1248 2 unneback
    for ($i=1; $i le $masters; $i++) {
1249 7 unneback
      printf OUTFILE "%s_bg <= %s_bg_q or %s_bg_1 or %s_bg_2;\n",$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1250 2 unneback
    # ce
1251
    printf OUTFILE "ce <= %s_cyc_o",$master[1]{"wbm"};
1252
    for ($i=2; $i le $masters; $i++) {
1253
      printf OUTFILE " or %s_cyc_o",$master[$i]{"wbm"}; };
1254
    printf OUTFILE " when idle='1' else '0';\n\n";
1255
    # thats it
1256
    printf OUTFILE "end block arbiter_sharedbus;\n\n";
1257
  # interconnect crossbarswitch
1258
  } else {
1259
    for ($j=1; $j le $slaves; $j++) {
1260
      # single master ?
1261
      $tmp=0;
1262
      for ($l=1; $l le $masters; $l++) {
1263
        if ($master[$l]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1264
          $only_master = $l;
1265
          $tmp++;
1266
        };
1267
      };
1268
      if ($tmp == 1) {
1269
        printf OUTFILE "%s_%s_bg <= %s_%s_ss and %s_cyc_o;\n",$master[$only_master]{"wbm"},$slave[$j]{"wbs"},$master[$only_master]{"wbm"},$slave[$j]{"wbs"},$master[$only_master]{"wbm"};
1270
      } else {
1271
        printf OUTFILE "arbiter_%s : block\n",$slave[$j]{"wbs"};
1272
        for ($i=1; $i le $masters; $i++) {
1273
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1274
            printf OUTFILE "  signal %s_bg, %s_bg_1, %s_bg_2, %s_bg_q : std_logic;\n",$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"};
1275
            printf OUTFILE "  signal %s_trafic_limit : std_logic;\n",$master[$i]{"wbm"};
1276
          };
1277
        };
1278
        printf OUTFILE "  signal ce, idle, ack : std_logic;\n";
1279
        printf OUTFILE "begin\n";
1280
        printf OUTFILE "ack <= %s_ack_o;\n",$slave[$j]{"wbs"};
1281
        # instantiate trafic_supervision(s)
1282
        # calc tot priority per slave
1283
        $priority = 0;
1284
        for ($i=1; $i le $masters; $i++) {
1285
          $priority += $master[$i]{("priority_".($slave[$j]{"wbs"}))}; };
1286
        for ($i=1; $i le $masters; $i++) {
1287
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1288
            printf OUTFILE "\ntrafic_supervision_%s : entity work.trafic_supervision\n",$i;
1289
            printf OUTFILE "generic map(\n";
1290
            printf OUTFILE "  priority => %s,\n",$master[$i]{("priority_".($slave[$j]{"wbs"}))};
1291
            printf OUTFILE "  tot_priority => %s)\n",$priority;
1292
            printf OUTFILE "port map(\n";
1293
            printf OUTFILE "  bg => %s_%s_bg,\n",$master[$i]{"wbm"},$slave[$j]{"wbs"};
1294
            printf OUTFILE "  ce => ce,\n";
1295
            printf OUTFILE "  trafic_limit => %s_trafic_limit,\n",$master[$i]{"wbm"};
1296
            printf OUTFILE "  clk => clk,\n";
1297
            printf OUTFILE "  reset => reset);\n";
1298
          };
1299
        };
1300
        # _bg_q
1301
        # bg eq 1 => set
1302
        # end of cycle => reset
1303
        for ($i=1; $i le $masters; $i++) {
1304
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1305
            printf OUTFILE "\nprocess(clk,reset)\nbegin\nif reset='1' then\n";
1306
            printf OUTFILE "  %s_bg_q <= '0';\n",$master[$i]{"wbm"};
1307
            printf OUTFILE "elsif clk'event and clk='1' then\n";
1308
            printf OUTFILE "if %s_bg_q='0' then\n",$master[$i]{"wbm"};
1309
            printf OUTFILE "  %s_bg_q <= %s_bg;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1310
            printf OUTFILE "elsif ack='1'";
1311
            if ($master[$i]{"tgc_o"} eq 1) {
1312
              printf OUTFILE " and (%s_%s_o=\"%s\" or %s_%s_o=\"%s\")",$master[$i]{"wbm"},$rename_tgc,$classic,$master[$i]{"wbm"},$rename_tgc,$endofburst; };
1313
            printf OUTFILE " then\n  %s_bg_q <= '0';\nend if;\nend if;\nend process;\n",$master[$i]{"wbm"};
1314
          };
1315
        }; # end for
1316
        # _bg
1317 7 unneback
        $depend = "";
1318 2 unneback
        $tmp=1; until ($master[$tmp]{("priority_".($slave[$j]{"wbs"}))} ne 0) {$tmp++};
1319
        printf OUTFILE "\nidle <= '1' when %s_bg_q='0'",$master[$tmp]{"wbm"};
1320
        for ($i=$tmp+1; $i le $masters; $i++) {
1321
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1322
            printf OUTFILE " and %s_bg_q='0'",$master[$i]{"wbm"};
1323
          };
1324
        };
1325
        printf OUTFILE " else '0';\n";
1326
        printf OUTFILE "%s_bg_1 <= '1' when idle='1' and %s_cyc_o='1' and %s_%s_ss='1' and %s_trafic_limit='0' else '0';\n",$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$j]{"wbs"},$master[$tmp]{"wbm"};
1327 7 unneback
        $depend = $master[$tmp]{"wbm"}."_bg_1='0'",;
1328 2 unneback
        for ($i=$tmp+1; $i le $masters; $i++) {
1329
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1330 7 unneback
            printf OUTFILE "%s_bg_1 <= '1' when idle='1' and (%s) and %s_cyc_o='1' and %s_%s_ss='1' and %s_trafic_limit='0' else '0';\n",$master[$i]{"wbm"},$depend,$master[$i]{"wbm"},$master[$i]{"wbm"},$slave[$j]{"wbs"},$master[$i]{"wbm"},$slave[$j]{"wbs"},$master[$i]{"wbm"};;
1331
            $depend = $depend." and ".$master[$i]{"wbm"}."_bg_1='0'";
1332 2 unneback
          };
1333
        };
1334 7 unneback
        printf OUTFILE "%s_bg_2 <= '1' when idle='1' and (%s) and %s_cyc_o='1' and %s_%s_ss='1' else '0';\n",$master[$tmp]{"wbm"},$depend,$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$j]{"wbs"};
1335
        $depend = $depend." and ".$master[$tmp]{"wbm"}."_bg_2='0'";
1336 2 unneback
        $tmp1 = $tmp;
1337
        for ($i=$tmp+1; $i le $masters; $i++) {
1338
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1339 7 unneback
            printf OUTFILE "%s_bg_2 <= '1' when idle='1' and (%s) and %s_cyc_o='1' and %s_%s_ss='1' else '0';\n",$master[$i]{"wbm"},$depend,$master[$i]{"wbm"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1340
          $depend = $depend." and ".$master[$i]{"wbm"}."_bg_2='0'";
1341 2 unneback
          };
1342
        };
1343
        for ($i=1; $i le $masters; $i++) {
1344
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1345
            printf OUTFILE "%s_bg <= %s_bg_q or %s_bg_1 or %s_bg_2;\n",$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"},$master[$i]{"wbm"};
1346
          };
1347
        };
1348
        # ce
1349
        $tmp=1; until ($master[$tmp]{("priority_".($slave[$j]{"wbs"}))} ne 0) {$tmp++};
1350
        printf OUTFILE "ce <= (%s_cyc_o and %s_%s_ss)",$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$j]{"wbs"};
1351
          for ($i=$tmp+1; $i le $masters; $i++) {
1352
            if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1353
              printf OUTFILE " or (%s_cyc_o and %s_%s_ss)",$master[$i]{"wbm"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1354
            };
1355
          };
1356
        printf OUTFILE " when idle='1' else '0';\n";
1357
        # global bg
1358
        for ($i=1; $i le $masters; $i++) {
1359
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1360
            printf OUTFILE "%s_%s_bg <= %s_bg;\n",$master[$i]{"wbm"},$slave[$j]{"wbs"},$master[$i]{"wbm"};
1361
          };
1362
        };
1363
        printf OUTFILE "end block arbiter_%s;\n",$slave[$j]{"wbs"};
1364
      };
1365
    };
1366
  }; #end if
1367
};
1368
 
1369
sub gen_adr_decoder{
1370
  printf OUTFILE "decoder:block\n";
1371
  if ($interconnect eq "sharedbus") {
1372
    printf OUTFILE "  signal adr : std_logic_vector(%s downto 0);\n",$adr_size-1;
1373
    printf OUTFILE "begin\n";
1374
    # adr
1375
    printf OUTFILE "adr <= (%s_adr_o and %s_bg)",$master[1]{"wbm"},$master[1]{"wbm"};
1376
    if ($masters gt 1){
1377
      for ($i=2; $i le $masters; $i++) {
1378
        printf OUTFILE " or (%s_adr_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1379
    };
1380
    printf OUTFILE ";\n";
1381
    # slave select
1382
    for ($i=1; $i le $slaves; $i++) {
1383
      printf OUTFILE "%s_ss <= '1' when adr(%s downto %s)=\"",$slave[$i]{"wbs"}, $adr_size-1,log(hex($slave[$i]{"size"}))/log(2);
1384
      $slave[$i]{"baseadr"}=hex($slave[$i]{"baseadr"});
1385
      for ($j=$adr_size-1; $j ge (log(hex($slave[$i]{"size"}))/log(2)); $j--) {
1386
        if (($slave[$i]{"baseadr"}) >= (2**$j)) {
1387
          $slave[$i]{"baseadr"} -= 2**$j;
1388
          printf OUTFILE "1";
1389
        } else {
1390
          printf OUTFILE "0";
1391
        };
1392
      };
1393
      printf OUTFILE "\"";
1394
      # 1
1395
      if ($slave[$i]{"size1"} ne "ffffffff") {
1396
        printf OUTFILE " else\n'1' when adr(%s downto %s)=\"",$adr_size-1,log(hex($slave[$i]{"size1"}))/log(2);
1397
        $slave[$i]{"baseadr1"}=hex($slave[$i]{"baseadr1"});
1398
        for ($j=$adr_size-1; $j ge (log(hex($slave[$i]{"size1"}))/log(2)); $j--) {
1399
                      if (($slave[$i]{"baseadr1"}) >= (2**$j)) {
1400
            $slave[$i]{"baseadr1"} -= 2**$j;
1401
            printf OUTFILE "1";
1402
                      } else {
1403
                        printf OUTFILE "0";
1404
                      }; # end if
1405
        }; # end for
1406
        printf OUTFILE "\"";
1407
      };
1408
      # 2
1409
      if ($slave[$i]{"size2"} ne "ffffffff") {
1410
        printf OUTFILE " else\n'1' when adr(%s downto %s)=\"",$adr_size-1,log(hex($slave[$i]{"size2"}))/log(2);
1411
        $slave[$i]{"baseadr2"}=hex($slave[$i]{"baseadr2"});
1412
        for ($j=$adr_size-1; $j ge (log(hex($slave[$i]{"size2"}))/log(2)); $j--) {
1413
                      if (($slave[$i]{"baseadr2"}) >= (2**$j)) {
1414
                        $slave[$i]{"baseadr2"} -= 2**$j;
1415
                        printf OUTFILE "1";
1416
                      } else {
1417
                        printf OUTFILE "0";
1418
                      };
1419
        };
1420
        printf OUTFILE "\"";
1421
      };
1422
      # 3
1423
      if ($slave[$i]{"size3"} ne "ffffffff") {
1424
        printf OUTFILE " else\n'1' when adr(%s downto %s)=\"",$adr_size-1,log(hex($slave[$i]{"size3"}))/log(2);
1425
        $slave[$i]{"baseadr3"}=hex($slave[$i]{"baseadr3"});
1426
        for ($j=$adr_size-1; $j ge (log(hex($slave[$i]{"size3"}))/log(2)); $j--) {
1427
                      if (($slave[$i]{"baseadr3"}) >= (2**$j)) {
1428
            $slave[$i]{"baseadr3"} -= 2**$j;
1429
                        printf OUTFILE "1";
1430
                      } else {
1431
                        printf OUTFILE "0";
1432
                      };
1433
        };
1434
        printf OUTFILE "\"";
1435
      };
1436
      printf OUTFILE " else\n'0';\n";
1437
      # adr to slaves
1438
    };
1439
    for ($i=1; $i le $slaves; $i++) {
1440
      printf OUTFILE "%s_adr_i <= adr(%s downto %s);\n",$slave[$i]{"wbs"},$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"}; };
1441
  # crossbar switch
1442
  } else {
1443
    printf OUTFILE "begin\n";
1444
    # master_slave_ss
1445
#    $j=0;
1446
    for ($i=1; $i le $masters; $i++) {
1447
      $slave[$j]{"baseadr"}=hex($slave[$j]{"baseadr"});
1448
      for ($j=1; $j le $slaves; $j++) {
1449
        if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1450
        printf OUTFILE "%s_%s_ss <= '1' when %s_adr_o(%s downto %s)=\"",$master[$i]{"wbm"},$slave[$j]{"wbs"},$master[$i]{"wbm"},$adr_size-1,log(hex($slave[$j]{"size"}))/log(2);
1451
        $tmp=hex($slave[$j]{"baseadr"});
1452
        for ($k=$adr_size-1; $k ge (log(hex($slave[$j]{"size"}))/log(2)); $k--) {
1453
          if ($tmp >= (2**$k)) {
1454
            $tmp -= 2**$k;
1455
            printf OUTFILE "1";
1456
          } else {
1457
            printf OUTFILE "0";
1458
          };
1459
        };
1460
        printf OUTFILE "\"";
1461
        # 2?
1462
        if ($slave[$j]{"size1"} ne "ffffffff") {
1463
          printf OUTFILE " else\n'1' when %s_adr_o(%s downto %s)=\"",$master[$i]{"wbm"},$adr_size-1,log(hex($slave[$j]{"size1"}))/log(2);
1464
          $tmp=hex($slave[$j]{"baseadr1"});
1465
          for ($k=$adr_size-1; $k ge (log(hex($slave[$j]{"size1"}))/log(2)); $k--) {
1466
                        if ($tmp >= (2**$k)) {
1467
                          $tmp -= 2**$k;
1468
                          printf OUTFILE "1";
1469
                        } else {
1470
                          printf OUTFILE "0";
1471
                        };
1472
          };
1473
          printf OUTFILE "\"";
1474
        };
1475
        # 3?
1476
        if ($slave[$j]{"size2"} ne "ffffffff") {
1477
          printf OUTFILE " else\n'1' when %s_adr_o(%s downto %s)=\"",$master[$i]{"wbm"},$adr_size-1,log(hex($slave[$j]{"size2"}))/log(2);
1478
          $tmp=hex($slave[$j]{"baseadr2"});
1479
          for ($k=$adr_size-1; $k ge (log(hex($slave[$j]{"size2"}))/log(2)); $k--) {
1480
                        if ($tmp >= (2**$k)) {
1481
                          $tmp -= 2**$k;
1482
                          printf OUTFILE "1";
1483
                        } else {
1484
                          printf OUTFILE "0";
1485
                        };
1486
          };
1487
          printf OUTFILE "\"";
1488
        };
1489
        printf OUTFILE " else \n'0';\n";
1490
        }; #if
1491
      };
1492
    };
1493
    # _adr_o
1494
    for ($i=1; $i le $slaves; $i++) {
1495
      # mux ?
1496
      $tmp=0;
1497
      for ($l=1; $l le $masters; $l++) {
1498
        if ($master[$l]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1499
          $tmp++;
1500
        };
1501
      };
1502
      if ($tmp eq 1) {
1503
        $k=1; until ($master[$k]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$k++};
1504
        printf OUTFILE "%s_adr_i <= %s_adr_o(%s downto %s);\n",$slave[$i]{"wbs"},$master[$k]{"wbm"},$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"};
1505
      } else {
1506
        $k=1; until ($master[$k]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$k++};
1507
        printf OUTFILE "%s_adr_i <= (%s_adr_o(%s downto %s) and %s_%s_bg)",$slave[$i]{"wbs"},$master[$k]{"wbm"},$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"},$master[$k]{"wbm"},$slave[$i]{"wbs"};
1508
        for ($j=$k+1; $j le $masters; $j++) {
1509
          if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1510
            printf OUTFILE " or (%s_adr_o(%s downto %s) and %s_%s_bg)",$master[$j]{"wbm"},$slave[$i]{"adr_i_hi"},$slave[$i]{"adr_i_lo"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1511
          };
1512
        };
1513
        printf OUTFILE ";\n";
1514
      };
1515
    };
1516
  };
1517
  printf OUTFILE "end block decoder;\n\n";
1518
};
1519
 
1520
sub gen_muxshb{
1521
    printf OUTFILE "mux: block\n";
1522
    printf OUTFILE "  signal cyc, stb, we, ack : std_logic;\n";
1523
    if (($rty_i gt 0) && ($rty_o gt 1)) {
1524
      printf OUTFILE "  signal rty : std_logic;\n"; };
1525
    if (($err_i gt 0) && ($err_o gt 1)) {
1526
      printf OUTFILE "  signal err : std_logic;\n"; };
1527
    if ($dat_size eq 8) {
1528
      printf OUTFILE "  signal sel : std_logic;\n";
1529
    } else {
1530
      printf OUTFILE "  signal sel : std_logic_vector(%s downto 0);\n",$dat_size/8-1;
1531
    };
1532
    printf OUTFILE "  signal dat_m2s, dat_s2m : std_logic_vector(%s downto 0);\n",$dat_size-1;
1533
    if (($tgc_o gt 0) && ($tgc_i gt 0)) {
1534
      printf OUTFILE "  signal tgc : std_logic_vector(%s downto 0);\n",$tgc_bits-1; };
1535
    if (($tga_o gt 0) && ($tga_i gt 0)) {
1536
      printf OUTFILE "  signal tga : std_logic_vector(%s downto 0);\n",$tga_bits-1; };
1537
    printf OUTFILE "begin\n";
1538
    # cyc
1539
    printf OUTFILE "cyc <= (%s_cyc_o and %s_bg)",$master[1]{"wbm"},$master[1]{"wbm"};
1540
    if ($masters gt 1) {
1541
      for ($i=2; $i le $masters; $i++) {
1542
        printf OUTFILE " or (%s_cyc_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1543
    };
1544
    printf OUTFILE ";\n";
1545
    for ($i=1; $i le $slaves; $i++) {
1546
      printf OUTFILE "%s_cyc_i <= %s_ss and cyc;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"}; };
1547
    # stb
1548
    printf OUTFILE "stb <= (%s_stb_o and %s_bg)",$master[1]{"wbm"},$master[1]{"wbm"};
1549
    if ($masters gt 1) {
1550
      for ($i=2; $i le $masters; $i++) {
1551
        printf OUTFILE " or (%s_stb_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1552
    };
1553
    printf OUTFILE ";\n";
1554
    for ($i=1; $i le $slaves; $i++) {
1555
      printf OUTFILE "%s_stb_i <= stb;\n",$slave[$i]{"wbs"}; };
1556
    # we
1557
    $i=1; until ($master[$i]{"type"} ne "ro") {$i++};
1558
    printf OUTFILE "we <= (%s_we_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"};
1559
    if ($i lt $masters) {
1560
      for ($j=$i+1; $j le $masters; $j++) {
1561
        if ($master[$j]{"type"} ne "ro") {
1562
          printf OUTFILE " or (%s_we_o and %s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"};
1563
        };
1564
      };
1565
    };
1566
    printf OUTFILE ";\n";
1567
    for ($i=1; $i le $slaves; $i++) {
1568
      if ($slave[$i]{"type"} ne "ro") {
1569
        printf OUTFILE "%s_we_i <= we;\n",$slave[$i]{"wbs"};
1570
      };
1571
    };
1572
    # ack
1573
    printf OUTFILE "ack <= %s_ack_o",$slave[1]{"wbs"};
1574
    for ($i=2; $i le $slaves; $i++) {
1575
      printf OUTFILE " or %s_ack_o",$slave[$i]{"wbs"}; };
1576
    printf OUTFILE ";\n";
1577
    for ($i=1; $i le $masters; $i++) {
1578
      printf OUTFILE "%s_ack_i <= ack and %s_bg;\n",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1579
    # rty
1580
    if (($rty_o eq 0) && ($rty_i gt 0)) {
1581
      for ($i=1; $i le $masters; $i++) {
1582
        if ($master[$i]{"rty_i"} eq 1) {
1583
          printf OUTFILE "%s_rty_i <= '0';\n",$master[$i]{"wbm"};
1584
        };
1585
      };
1586
    } elsif (($rty_o eq 1) && ($rty_i gt 0)) {
1587
      $i=1; until ($slave[$i]{"rty_o"} eq 1) {$i++};
1588
      for ($j=1; $j le $masters; $j++) {
1589
        if ($master[$j]{"rty_i"} eq 1) {
1590
          printf OUTFILE "%s_rty_i <= %s_rty_o;\n",$master[$j]{"wbm"},$slave[$i]{"wbs"};
1591
        };
1592
      };
1593
    } elsif (($rty_o gt 1) && ($rty_i gt 0)) {
1594
      $i=1; until ($slave[$i]{"rty_o"} eq 1) {$i++};
1595
      printf OUTFILE "rty <= %s_rty_o",$slave[$i]{"wbs"};
1596
      for ($j=$i+1; $j le $slaves; $j++) {
1597
        if ($slave[$j]{"rty_o"} eq 1) {
1598
          printf OUTFILE " or %s_rty_o",$slave[$j]{"wbs"};
1599
        };
1600
      };
1601
      printf OUTFILE ";\n";
1602
      for ($i=1; $i le $masters; $i++) {
1603
        if ($master[$i]{"rty_i"} eq 1) {
1604
          printf OUTFILE "%s_rty_i <= rty;\n",$master[$i]{"wbm"};
1605
        };
1606
      };
1607
    };
1608
    # err
1609
    if (($err_o eq 0) && ($err_i gt 0)) {
1610
      for ($i=1; $i le $masters; $i++) {
1611
        if ($master[$i]{"err_i"} eq 1) {
1612
          printf OUTFILE "%s_err_i <= '0';\n",$master[$i]{"wbm"};
1613
        };
1614
      };
1615
    } elsif (($err_o eq 1) && ($err_i gt 0)) {
1616
      $i=1; until ($slave[$i]{"err_o"} eq 1) {$i++};
1617
      for ($j=1; $j le $masters; $j++) {
1618
        if ($master[$j]{"err_i"} eq 1) {
1619
          printf OUTFILE "%s_err_i <= %s_err_o;\n",$master[$j]{"wbm"},$slave[$i]{"wbs"};
1620
        };
1621
      };
1622
    } elsif (($err_o gt 1) && ($err_i gt 0)) {
1623
      $i=1; until ($slave[$i]{"err_o"} eq 1) {$i++};
1624
      printf OUTFILE "err <= %s_err_o",$slave[$i]{"wbs"};
1625
      for ($j=$i+1; $j le $slaves; $j++) {
1626
        if ($slave[$j]{"err_o"} eq 1) {
1627
          printf OUTFILE " or %s_err_o",$slave[$j]{"wbs"};
1628
        };
1629
      };
1630
      printf OUTFILE ";\n";
1631
      for ($i=1; $i le $masters; $i++) {
1632
        if ($master[$i]{"err_i"} eq 1) {
1633
          printf OUTFILE "%s_err_i <= err;\n",$master[$i]{"wbm"};
1634
        };
1635
      };
1636
    };
1637
    # sel
1638
    printf OUTFILE "sel <= (%s_sel_o and %s_bg)",$master[1]{"wbm"},$master[1]{"wbm"};
1639
    if ($masters gt 1) {
1640
      for ($i=2; $i le $masters; $i++) {
1641
        printf OUTFILE " or (%s_sel_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"};
1642
      };
1643
    };
1644
    printf OUTFILE ";\n";
1645
    for ($i=1; $i le $slaves; $i++) {
1646
      printf OUTFILE "%s_sel_i <= sel;\n",$slave[$i]{"wbs"}; };
1647
    # data m2s
1648
    $i=1; until ($master[$i]{"type"} ne "ro") {$i++};
1649
    printf OUTFILE "dat_m2s <= (%s_dat_o and %s_bg)",$master[$i]{"wbm"},$master[$i]{"wbm"};
1650
    if ($i lt $masters) {
1651
      for ($j=$i+1; $j le $masters; $j++) {
1652
        printf OUTFILE " or (%s_dat_o and %s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"};
1653
      };
1654
    };
1655
    printf OUTFILE ";\n";
1656
    for ($i=1; $i le $slaves; $i++) {
1657
      if ($slave[$i]{"type"} ne "ro") {
1658
        printf OUTFILE "%s_dat_i <= dat_m2s;\n",$slave[$i]{"wbs"};
1659
      };
1660
    };
1661
    # data s2m
1662
    $i=1; until ($slave[$i]{"type"} ne "wo") {$i++};
1663
    printf OUTFILE "dat_s2m <= (%s_dat_o and %s_ss)",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1664
    if ($i lt $slaves) {
1665
      for ($j=$i+1; $j le $slaves; $j++) {
1666
        printf OUTFILE " or (%s_dat_o and %s_ss)",$slave[$j]{"wbs"},$slave[$j]{"wbs"};
1667
      };
1668
    };
1669
    printf OUTFILE ";\n";
1670
    for ($i=1; $i le $masters; $i++) {
1671
      if ($master[$i]{"type"} ne "wo") {
1672
        printf OUTFILE "%s_dat_i <= dat_s2m;\n",$master[$i]{"wbm"};
1673
      };
1674
    };
1675
    # tgc
1676
    if (($tgc_o eq 0) && ($tgc_i gt 0)) {
1677
      for ($i=1; $i le $slaves; $i++) {
1678
        if ($slave[$i]{"tgc_i"} eq 1) {
1679
          printf OUTFILE "%s_%s_i <= %s;\n",$slave[$i]{"wbs"},$rename_tgc,$classic;
1680
        };
1681
      };
1682
    } elsif (($tgc_o gt 0) && ($tgc_i gt 0)) {
1683
      $i=1; until ($master[$i]{"tgc_o"} eq 1) {$i++};
1684
      printf OUTFILE "tgc <= (%s_%s_o and %s_bg)",$master[$i]{"wbm"},$rename_tgc,$master[$i]{"wbm"};
1685
      for ($j=$i+1; $j le $masters; $j++) {
1686
        if ($master[$j]{"tgc_o"} eq 1) {
1687
          printf OUTFILE " or (%s_%s_o and %s_bg)",$master[$j]{"wbm"},$rename_tgc,$master[$j]{"wbm"};
1688
        };
1689
      };
1690
      printf OUTFILE ";\n";
1691
      for ($i=1; $i le $slaves; $i++) {
1692
        if ($slave[$i]{"tgc_i"} eq 1) {
1693
          printf OUTFILE "%s_%s_i <= tgc;\n",$slave[$i]{"wbs"},$rename_tgc,$slave[$i]{"wbs"};
1694
        };
1695
      };
1696
    };
1697
    # tga
1698
    if (($tga_o eq 0) && ($tga_i gt 0)) {
1699
      for ($i=1; $i le $slaves; $i++) {
1700
        if ($slave[$i]{"tga_i"} eq 1) {
1701
          printf OUTFILE "%s_%s_i <= (others=>'0');\n",$slave[$i]{"wbs"},$rename_tga;
1702
        };
1703
      };
1704
    } elsif (($tga_o gt 0) && ($tga_i gt 0)) {
1705
      $i=1; until ($master[$i]{"tga_o"} eq 1) {$i++};
1706
      printf OUTFILE "tga <= (%s_%s_o and %s_bg)",$master[$i]{"wbm"},$rename_tga,$master[$i]{"wbm"};
1707
      for ($j=$i+1; $j le $masters; $j++) {
1708
        if ($master[$j]{"tga_o"} eq 1) {
1709
          printf OUTFILE " or (%s_%s_o and %s_bg)",$master[$j]{"wbm"},$rename_tga,$master[$j]{"wbm"};
1710
        };
1711
      };
1712
      printf OUTFILE ";\n";
1713
      for ($i=1; $i le $slaves; $i++) {
1714
        if ($slave[$i]{"tga_i"} eq 1) {
1715
          printf OUTFILE "%s_%s_i <= tga;\n",$slave[$i]{"wbs"},$rename_tga,$slave[$i]{"wbs"};
1716
        };
1717
      };
1718
    };
1719
    # end block
1720
    printf OUTFILE "end block mux;\n\n";
1721
};
1722
 
1723
sub gen_muxcbs{
1724
    # cyc
1725
    printf OUTFILE "-- cyc_i(s)\n";
1726
    for ($i=1; $i le $slaves; $i++) {
1727
      $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++};
1728
      printf OUTFILE "%s_cyc_i <= (%s_cyc_o and %s_%s_bg)",$slave[$i]{"wbs"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1729
      for ($j=$tmp+1; $j le $masters; $j++) {
1730
        if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1731
          printf OUTFILE " or (%s_cyc_o and %s_%s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1732
        };
1733
      };
1734
      printf OUTFILE ";\n";
1735
    };
1736
    # stb
1737
    printf OUTFILE "-- stb_i(s)\n";
1738
    for ($i=1; $i le $slaves; $i++) {
1739
      $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++};
1740
      printf OUTFILE "%s_stb_i <= (%s_stb_o and %s_%s_bg)",$slave[$i]{"wbs"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1741
      for ($j=$tmp+1; $j le $masters; $j++) {
1742
        if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1743
          printf OUTFILE " or (%s_stb_o and %s_%s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1744
        };
1745
      };
1746
      printf OUTFILE ";\n";
1747
    };
1748
    # we
1749
    printf OUTFILE "-- we_i(s)\n";
1750
    for ($i=1; $i le $slaves; $i++) {
1751
      if ($slave[$i]{"type"} ne "ro") {
1752
        $tmp=1; until (($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$tmp]{"type"} ne "ro")) {$tmp++};
1753
        printf OUTFILE "%s_we_i <= (%s_we_o and %s_%s_bg)",$slave[$i]{"wbs"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1754
        for ($j=$tmp+1; $j le $masters; $j++) {
1755
          if (($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$j]{"type"} ne "ro")) {
1756
            printf OUTFILE " or (%s_we_o and %s_%s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1757
          };
1758
        };
1759
        printf OUTFILE ";\n";
1760
      };
1761
    };
1762
    # ack
1763
    printf OUTFILE "-- ack_i(s)\n";
1764
    for ($i=1; $i le $masters; $i++) {
1765
      $tmp=1; until ($master[$i]{("priority_".($slave[$tmp]{"wbs"}))} ne 0) {$tmp++};
1766
      printf OUTFILE "%s_ack_i <= (%s_ack_o and %s_%s_bg)",$master[$i]{"wbm"},$slave[$tmp]{"wbs"},$master[$i]{"wbm"},$slave[$tmp]{"wbs"};
1767
      for ($j=$tmp+1; $j le $slaves; $j++) {
1768
        if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1769
          printf OUTFILE " or (%s_ack_o and %s_%s_bg)",$slave[$j]{"wbs"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1770
        };
1771
      };
1772
      printf OUTFILE ";\n";
1773
    };
1774
    # rty
1775
    printf OUTFILE "-- rty_i(s)\n";
1776
    for ($i=1; $i le $masters; $i++) {
1777
      if ($master[$i]{"rty_i"} eq 1) {
1778
        $rty_o=0;
1779
        for ($j=1; $j le $masters; $j++) {
1780
          if (($slave[$j]{"rty_o"} eq 1) && ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0)) {
1781
            $rty_o+=1;
1782
          };
1783
        };
1784
        if ($rty_o eq 0) {
1785
          printf OUTFILE "%s_rty_i <= '0';\n",$master[$i]{"wbm"};
1786
        } else {
1787 8 unneback
          $tmp=1; until ($master[$i]{("priority_".($slave[$tmp]{"wbs"}))} ne 0) {$tmp++};
1788 2 unneback
          printf OUTFILE "%s_rty_i <= (%s_rty_o and %s_%s_bg)",$master[$i]{"wbm"},$slave[$tmp]{"wbs"},$master[$i]{"wbm"},$slave[$tmp]{"wbs"};
1789
          for ($j=$tmp+1; $j le $slaves; $j++) {
1790
            if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1791
              printf OUTFILE " or (%s_rty_o and %s_%s_bg)",$slave[$j]{"wbs"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1792
            };
1793
          };
1794
          printf OUTFILE ";\n";
1795
        };
1796
      };
1797
    };
1798
    # err
1799
    printf OUTFILE "-- err_i(s)\n";
1800
    for ($i=1; $i le $masters; $i++) {
1801
      if ($master[$i]{"err_i"} eq 1) {
1802 8 unneback
        $err_o=0;
1803 2 unneback
        for ($j=1; $j le $masters; $j++) {
1804
          if (($slave[$j]{"err_o"} eq 1) && ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0)) {
1805
            $err_o+=1;
1806
          };
1807
        };
1808
        if ($err_o eq 0) {
1809
          printf OUTFILE "%s_err_i <= '0';\n",$master[$i]{"wbm"};
1810
        } else {
1811 8 unneback
          $tmp=1; until ($master[$i]{("priority_".($slave[$tmp]{"wbs"}))} ne 0) {$tmp++};
1812 2 unneback
          printf OUTFILE "%s_err_i <= (%s_err_o and %s_%s_bg)",$master[$i]{"wbm"},$slave[$tmp]{"wbs"},$master[$i]{"wbm"},$slave[$tmp]{"wbs"};
1813
          for ($j=$tmp+1; $j le $slaves; $j++) {
1814
            if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1815
              printf OUTFILE " or (%s_err_o and %s_%s_bg)",$slave[$j]{"wbs"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1816
            };
1817
          };
1818
          printf OUTFILE ";\n";
1819
        };
1820
      };
1821
    };
1822
    # sel
1823
    printf OUTFILE "-- sel_i(s)\n";
1824
    for ($i=1; $i le $slaves; $i++) {
1825
      if ($dat_size >= 16) {
1826
        $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++};
1827
        printf OUTFILE "%s_sel_i <= (%s_sel_o and %s_%s_bg)",$slave[$i]{"wbs"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1828
        for ($j=$tmp+1; $j le $masters; $j++) {
1829
          if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1830
            printf OUTFILE " or (%s_sel_o and %s_%s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1831
          };
1832
        };
1833
        printf OUTFILE ";\n";
1834
      };
1835
    };
1836
    # dat
1837
    printf OUTFILE "-- slave dat_i(s)\n";
1838
    for ($i=1; $i le $slaves; $i++) {
1839
      if ($slave[$i]{"type"} ne "ro") {
1840
        $tmp=0;
1841
        for ($j=1; $j le $masters; $j++) {
1842
          if (($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$j]{"type"} ne "ro")) {
1843
            $tmp+=1;
1844
          };
1845
        };
1846
        if ($tmp eq 1) {
1847
          $j=1; until (($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$j]{"type"} ne "ro")) {$j++};
1848
          printf OUTFILE "%s_dat_i <= %s_dat_o;\n",$slave[$i]{"wbs"},$master[$j]{"wbm"};
1849
        } elsif ($tmp >= 1) {
1850
          $tmp=1; until (($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$tmp]{"type"} ne "ro")) {$tmp++};
1851
          printf OUTFILE "%s_dat_i <= (%s_dat_o and %s_%s_bg)",$slave[$i]{"wbs"},$master[$tmp]{"wbm"},$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1852
          for ($j=$tmp+1; $j le $masters; $j++) {
1853
            if (($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) && ($master[$j]{"type"} ne "ro")) {
1854
              printf OUTFILE " or (%s_dat_o and %s_%s_bg)",$master[$j]{"wbm"},$master[$j]{"wbm"},$slave[$i]{"wbs"};
1855
            };
1856
          };
1857
          printf OUTFILE ";\n";
1858
        };
1859
      };
1860
    };
1861
    printf OUTFILE "-- master dat_i(s)\n";
1862
    for ($i=1; $i le $masters; $i++) {
1863
      if ($master[$i]{"type"} ne "wo") {
1864
        $tmp=0;
1865
        for ($j=1; $j le $slaves; $j++) {
1866
          if ($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) {
1867
            $tmp+=1;
1868
          };
1869
        };
1870
        if ($tmp eq 1) {
1871
          $tmp=1; until ($master[$i]{("priority_".($slave[$tmp]{"wbs"}))} ne 0) {$tmp++};
1872
          printf OUTFILE "%s_dat_i <= %s_dat_o",$master[$i]{"wbm"},$slave[$tmp]{"wbs"};
1873
        } else {
1874
          $tmp=1; until ($master[$i]{("priority_".($slave[$tmp]{"wbs"}))} ne 0) {$tmp++};
1875
          printf OUTFILE "%s_dat_i <= (%s_dat_o and %s_%s_bg)",$master[$i]{"wbm"},$slave[$tmp]{"wbs"},$master[$i]{"wbm"},$slave[$tmp]{"wbs"};
1876
          for ($j=$tmp+1; $j le $slaves; $j++) {
1877 4 unneback
            if (($master[$i]{("priority_".($slave[$j]{"wbs"}))} ne 0) && ($master[$i]{"type"} ne "wo")) {
1878 2 unneback
              printf OUTFILE " or (%s_dat_o and %s_%s_bg)",$slave[$j]{"wbs"},$master[$i]{"wbm"},$slave[$j]{"wbs"};
1879
            };
1880
          };
1881
        };
1882
        printf OUTFILE ";\n";
1883
      };
1884
    };
1885
    # tgc
1886
    printf OUTFILE "-- tgc_i\n";
1887
    for ($i=1; $i le $slaves; $i++) {
1888
      if ($slave[$i]{"tgc_i"} eq 1) {
1889
        $tmp=0;
1890
        for ($j=1; $j le $masters; $j++) {
1891
          if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1892
            $tmp+=1;
1893
          };
1894
        };
1895
        if ($tmp eq 1) {
1896
          $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++;};
1897
          printf OUTFILE "%s_%s_i <= %s_%s_o",$slave[$i]{"wbs"},$rename_tgc,$master[$tmp]{"wbm"},$rename_tgc;
1898
        } else {
1899
          $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++;};
1900 4 unneback
          printf OUTFILE "%s_%s_i <= (%s_%s_o and %s_%s_bg)",$slave[$i]{"wbs"},$rename_tgc,$master[$tmp]{"wbm"},$rename_tgc,$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1901 2 unneback
          for ($j=$tmp+1; $j le $masters; $j++) {
1902
            if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1903 5 unneback
              if ($master[$j]{"tga_o"} eq 1) {
1904 6 unneback
                printf OUTFILE " or (%s_%s_o and %s_%s_bg)",$master[$j]{"wbm"},$rename_tgc,$master[$j]{"wbm"},$slave[$i]{"wbs"};
1905 5 unneback
              } else {
1906 6 unneback
                if ($classic ne "000") {
1907
                  printf OUTFILE " or \"%s\"",$classic;
1908
                };
1909 5 unneback
              };
1910
 
1911 2 unneback
            };
1912
          };
1913
        };
1914
        printf OUTFILE ";\n";
1915
      };
1916
    };
1917
    # tga
1918
    printf OUTFILE "-- tga_i\n";
1919
    for ($i=1; $i le $slaves; $i++) {
1920
      if ($slave[$i]{"tga_i"} eq 1) {
1921
        $tmp=0;
1922
        for ($j=1; $j le $masters; $j++) {
1923
          if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1924
            $tmp+=1;
1925
          };
1926
        };
1927
        if ($tmp eq 1) {
1928
          $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++;};
1929
          printf OUTFILE "%s_%s_i <= %s_%s_o",$slave[$i]{"wbs"},$rename_tga,$master[$tmp]{"wbm"},$rename_tga;
1930
        } else {
1931
          $tmp=1; until ($master[$tmp]{("priority_".($slave[$i]{"wbs"}))} ne 0) {$tmp++;};
1932 9 unneback
          printf OUTFILE "%s_%s_i <= (%s_%s_o and %s_%s_bg)",$slave[$i]{"wbs"},$rename_tga,$master[$tmp]{"wbm"},$rename_tga,$master[$tmp]{"wbm"},$slave[$i]{"wbs"};
1933 2 unneback
          for ($j=$tmp+1; $j le $masters; $j++) {
1934
            if ($master[$j]{("priority_".($slave[$i]{"wbs"}))} ne 0) {
1935 5 unneback
              if ($master[$j]{"tga_o"} eq 1) {
1936
                printf OUTFILE " or (%s_%s_o and %s_%s_bg)",$master[$j]{"wbm"},$rename_tga,$master[$j]{"wbm"},$slave[$i]{"wbs"};
1937
              };
1938 2 unneback
            };
1939
          };
1940
        };
1941
        printf OUTFILE ";\n";
1942
      };
1943
    };
1944
};
1945
 
1946
sub gen_remap{
1947
    for ($i=1; $i le $masters; $i++) {
1948
      if ($master[$i]{"type"} ne "wo") {
1949
        printf OUTFILE "%s_wbm_i.dat_i <= %s_dat_i;\n",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1950
      printf OUTFILE "%s_wbm_i.ack_i <= %s_ack_i ;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1951
      if ($master[$i]{"err_i"} eq 1) {
1952
        printf OUTFILE "%s_wbm_i.err_i <= %s_err_i;\n",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1953
      if ($master[$i]{"rty_i"} eq 1) {
1954
        printf OUTFILE "%s_wbm_i.rty_i <= %s_rty_i;\n",$master[$i]{"wbm"},$master[$i]{"wbm"}; };
1955
      if ($master[$i]{"type"} ne "ro") {
1956
        printf OUTFILE "%s_dat_o <= %s_wbm_o.dat_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1957
        printf OUTFILE "%s_we_o  <= %s_wbm_o.we_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1958
      };
1959
      printf OUTFILE "%s_sel_o <= %s_wbm_o.sel_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1960
      printf OUTFILE "%s_adr_o <= %s_wbm_o.adr_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1961
      if ($master[$i]{"tgc_o"} eq 1) {
1962
        printf OUTFILE "%s_%s_o <= %s_wbm_o.%s_o;\n",$master[$i]{"wbm"},$rename_tgc,$master[$i]{"wbm"},$rename_tgc; };
1963
      if ($master[$i]{"tga_o"} eq 1) {
1964
        printf OUTFILE "%s_%s_o <= %s_wbm_o.%s_o;\n",$master[$i]{"wbm"},$rename_tga,$master[$i]{"wbm"},$rename_tga; };
1965
      printf OUTFILE "%s_cyc_o <= %s_wbm_o.cyc_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1966
      printf OUTFILE "%s_stb_o <= %s_wbm_o.stb_o;\n",$master[$i]{"wbm"},$master[$i]{"wbm"};
1967
    };
1968
    for ($i=1; $i le $slaves; $i++) {
1969
      if ($slave[$i]{"type"} ne "wo") {
1970
        printf OUTFILE "%s_dat_o <= %s_wbs_o.dat_o;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"}; };
1971
      printf OUTFILE "%s_ack_o <= %s_wbs_o.ack_o;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1972
      if ($slave[$i]{"err_o"} eq 1) {
1973
        printf OUTFILE "%s_err_o <= %s_wbs_o.err_o;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"}; };
1974
      if ($slave[$i]{"rty_o"} eq 1) {
1975
        printf OUTFILE "%s_rty_o <= %s_wbs_o.rty_o;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"}; };
1976
      if ($slave[$i]{"type"} ne "ro") {
1977
        printf OUTFILE "%s_wbs_i.dat_i <= %s_dat_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1978
        printf OUTFILE "%s_wbs_i.we_i  <= %s_we_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1979
      };
1980
      printf OUTFILE "%s_wbs_i.sel_i <= %s_sel_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1981
      printf OUTFILE "%s_wbs_i.adr_i <= %s_adr_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1982
      if ($slave[$i]{"tgc_i"} eq 1) {
1983
        printf OUTFILE "%s_wbs_i.%s_i <= %s_%s_i;\n",$slave[$i]{"wbs"},$rename_tgc,$slave[$i]{"wbs"},$rename_tgc; };
1984
      if ($slave[$i]{"tga_i"} eq 1) {
1985
        printf OUTFILE "%s_wbs_i.%s_i <= %s_%s_i;\n",$slave[$i]{"wbs"},$rename_tga,$slave[$i]{"wbs"},$rename_tga; };
1986
      printf OUTFILE "%s_wbs_i.cyc_i <= %s_cyc_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1987
      printf OUTFILE "%s_wbs_i.stb_i <= %s_stb_i;\n",$slave[$i]{"wbs"},$slave[$i]{"wbs"};
1988
    };
1989
};
1990
 
1991
# GUI
1992
$tmp=shift;
1993
if ($tmp eq "-nogui") {
1994
  $infile = shift;
1995
  read_defines($infile);
1996
} else {
1997
  if ($tmp ne <undef>) {
1998
    $infile=$tmp;
1999
    read_defines($infile);
2000
  };
2001
  gui_fsm;
2002
  generate_defines($infile);
2003 14 unneback
  read_defines($infile);
2004 2 unneback
};
2005
 
2006
# main
2007
open(OUTFILE,">$outfile$ext") or die "could not write to $outfile$ext";
2008
gen_header;
2009
if ($hdl eq 'vhdl') {
2010
  gen_vhdl_package;
2011
  gen_trafic_ctrl;
2012
  gen_entity;
2013
  printf OUTFILE "architecture rtl of %s is\n",$intercon;
2014
  if ($signal_groups == 1) { gen_sig_remap; };
2015
  gen_global_signals;
2016
  printf OUTFILE "begin  -- rtl\n";
2017
  gen_arbiter;
2018
  gen_adr_decoder;
2019
  if ($interconnect eq 'sharedbus') {
2020
    gen_muxshb;
2021
  } else {
2022
    gen_muxcbs;
2023
  };
2024
  if ($signal_groups == 1) { gen_remap; };
2025
  printf OUTFILE "end rtl;";
2026
} else {
2027
 
2028
};
2029
close(OUTFILE);

powered by: WebSVN 2.1.0

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