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 22

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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