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

Subversion Repositories wb_builder

[/] [wb_builder/] [tags/] [arelease/] [generator/] [wishbone.pl] - Blame information for rev 17

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

powered by: WebSVN 2.1.0

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