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

Subversion Repositories wb_builder

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

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

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

powered by: WebSVN 2.1.0

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