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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.74/] [tools/] [bin/] [ticonv_rri] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 37 wfjm
#!/usr/bin/perl -w
2
# $Id: ticonv_rri 795 2016-08-09 12:45:58Z mueller $
3
#
4
# Copyright 2014-2016 by Walter F.J. Mueller 
5
#
6
# This program is free software; you may redistribute and/or modify it under
7
# the terms of the GNU General Public License as published by the Free
8
# Software Foundation, either version 2, or at your option any later version.
9
#
10
# This program is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
12
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13
# for complete details.
14
#
15
#  Revision History:
16
# Date         Rev Version  Comment
17
# 2016-08-07   795   1.2.1  avoid GetOptions =f (bug in perl v5.22.1)
18
# 2015-04-03   661   1.2    adopt to new stat checking and mask polarity
19
# 2015-01-31   640   1.1.2  use 'rlc get|set' instead of 'rlc config'
20
# 2014-12-21   616   1.1.1  add .ndef and n= for BlockDone expects
21
# 2014-12-06   609   1.1    use .cmax and .eop; drop .cclst; (for rlink v4)
22
# 2014-08-09   580   1.0    Initial version
23
#
24
 
25
#-------------------------------------------------------------------------------
26
# handles the command:
27
#
28
#  .mode  rri
29
#  .dbaso n
30
#  .rlmon 0|1
31
#  .rbmon 0|1
32
#  .scntl n 0|1
33
#! .sinit g8 g16       !! NOT YET !!
34
#  .sdef  [s=g8]
35
#  .ndef  0|1
36
#  .amclr
37
#  .amdef name g8
38
#  .reset
39
#  .wait  n
40
#  .wtlam n
41
#  .cmax  n
42
#  .eop
43
#  rreg    [d=g16] [s=g8]
44
#  wreg    g16 [s=g8]
45
#  rblk    n [n=dd] [s=g8]
46
#         followed by n d=g16 data check values
47
#  wblk    n [n=dd] [s=g8]
48
#         followed by n g16 data values
49
#  stat   [d=g16] [s=d8]
50
#  attn   [d=g16] [s=d8]
51
#  init    g16 [s=g8]
52
#
53
 
54
use 5.005;                                  # require Perl 5.005 or higher
55
use strict;                                 # require strict checking
56
 
57
use Getopt::Long;
58
use FileHandle;
59
 
60
my %opts = ();
61
 
62
GetOptions(\%opts, "tout=s", "cmax=i"
63
          )
64
  or die "bad options";
65
 
66
sub cmdlist_do;
67
sub add_addr;
68
sub add_data;
69
sub add_edata;
70
sub add_edata;
71
 
72
sub cget_chkblank;                          # check for unused chars in cmd line
73
sub cget_tagval2_gdat;                      # get tag=v1[,v2], generic base
74
sub cget_tagval_gdat;                       # get tag=val, generic base
75
sub cget_gdat;                              # get generic base value
76
sub sget_bdat;                              # convert 01 string -> binary value
77
sub get_line;
78
 
79
my $cmd_line;
80
my $cmd_rest;
81
my $dbase = 2;                              # use binary as default data radix
82
 
83
my @cmdfh;
84
my @cmdlist;
85
 
86
if (scalar(@ARGV) != 1) {
87
  print STDERR "ticonv_rri-E: usage: ticonv_rri \n";
88
  exit 1;
89
}
90
 
91
my $fnam = $ARGV[0];
92
my $tout = $opts{tout} || 10.;
93
my $cmax = $opts{cmax} || 6;
94
 
95
my $ref_sdef = 0x00;                        # by default check for 'hard' errors
96
my $msk_sdef = 0xf8;                        # ignore the status bits + attn flag
97
my $chk_ndef = 1;                           # dcnt default check on by default
98
 
99
my $fh = new FileHandle;
100
$fh->open("<$fnam") or die "failed to open '$fnam'";
101
push @cmdfh, $fh;
102
 
103
print "set save_config_basedata [rlc get basedata]\n";
104
print "set save_config_basestat [rlc get basestat]\n";
105
print "rlc set basedata 8\n";
106
print "rlc set basestat 2\n";
107
 
108
while (1) {
109
  my $cmd = get_line();
110
  last unless defined $cmd;
111
  $cmd_line = $cmd;
112
  $cmd_rest = "";
113
 
114
  # .mode mode -> accept only 'rri', quit otherwise ------------------
115
  if ($cmd =~ /^\.mode\s+(.*)$/) {
116
    if ($1 ne "rri") {
117
      print "# FAIL: $cmd not supported\n";
118
      exit 1;
119
    }
120
    next;
121
 
122
  # .dbaso n ---------------------------------------------------------
123
  } elsif ($cmd =~ /^\.dbaso\s+(\d+)$/) {
124
    my $dbaso = $1;
125
    cmdlist_do();
126
    print "rlc set basedata $dbaso\n";
127
 
128
  # .cmax n ----------------------------------------------------------
129
  } elsif ($cmd =~ /^\.cmax\s+(\d+)$/) {
130
    $cmax = $1;
131
    next;
132
 
133
  # .eop -------------------------------------------------------------
134
  } elsif ($cmd =~ /^\.eop/) {
135
    cmdlist_do();
136
    next;
137
 
138
  # .sdef s=ref[,msk] ------------------------------------------------
139
  } elsif ($cmd =~ /^\.sdef\s+s=([01]+),?([01]*)/) {
140
    $cmd_rest = $';
141
    cmdlist_do();
142
    $ref_sdef = oct("0b$1");
143
    $msk_sdef = oct("0b$2");
144
 
145
  # .ndef ------------------------------------------------------------
146
  } elsif ($cmd =~ /^\.ndef\s+([01])/) {
147
    $cmd_rest = $';
148
    cmdlist_do();
149
    $chk_ndef = $1;
150
 
151
  # .rlmon,.rbmon ----------------------------------------------------
152
  } elsif ($cmd =~ /^\.(r[lb]mon)\s+(\d)/) {
153
    $cmd_rest = $';
154
    cmdlist_do();
155
    print "rlc oob -$1 $2\n";
156
 
157
  # .scntl -----------------------------------------------------------
158
  } elsif ($cmd =~ /^\.scntl\s+(\d+)\s+(\d)/) {
159
    $cmd_rest = $';
160
    cmdlist_do();
161
    print "rlc oob -sbcntl $1 $2\n";
162
 
163
  # .reset -----------------------------------------------------------
164
  } elsif ($cmd =~ /^\.reset/) {
165
    $cmd_rest = $';
166
    cmdlist_do();
167
    print "rlc exec -init 0 1\n";
168
 
169
  # .amclr -----------------------------------------------------------
170
  } elsif ($cmd =~ /^\.amclr/) {
171
    $cmd_rest = $';
172
    cmdlist_do();
173
    print "rlc amap -clear\n";
174
 
175
  # .amdef -----------------------------------------------------------
176
  } elsif ($cmd =~ /^\.amdef\s+([0-9a-z]+)\s+([01]+)/) {
177
    $cmd_rest = $';
178
    cmdlist_do();
179
    my $anam = $1;
180
    my $aval = sprintf ('0%3.3o', oct("0b$2"));
181
    print "rlc amap -insert $anam $aval\n";
182
 
183
  # .wait n ----------------------------------------------------------
184
  # Note: simply send zeros rather true idles. both are discarded anyway
185
  } elsif ($cmd =~ /^(\.wait)/) {
186
    $cmd_rest = $';
187
    my $delay = cget_gdat(16,10,1,256);
188
    cmdlist_do();
189
    print "rlc log \".wait $delay\"\n";
190
    print "rlc rawio -wblk {";
191
    for (my $i = 0; $i < $delay; $i++) {
192
      printf  " 0%3.3o", 0x00;
193
    }
194
    print "}\n";
195
 
196
  # .wtlam n ---------------------------------------------------------
197
  # Note: ignore n, use tout here !
198
  } elsif ($cmd =~ /^(\.wtlam)/) {
199
    $cmd_rest = $';
200
    my $delay = cget_gdat(16,10,1);         # currently ignores
201
    cmdlist_do();
202
    printf "rlc wtlam %d\n", $tout;
203
 
204
  # rreg  [d=g16] [s=b8] ---------------------------------------
205
  } elsif ($cmd =~ /^rreg/) {
206
    $cmd_rest = $';
207
    my $act = "-rreg";
208
    $act .= add_addr();
209
    $act .= add_edata($dbase);
210
    $act .= add_estat();
211
    push @cmdlist, $act;
212
 
213
  # wreg|init  g16 [s=b8] --------------------------------------
214
  } elsif ($cmd =~ /^(wreg|init)/) {
215
    $cmd_rest = $';
216
    my $act = "-$1";
217
    $act .= add_addr();
218
    $act .= add_data($dbase);
219
    $act .= add_estat();
220
    push @cmdlist, $act;
221
 
222
  # rblk  n [n=dd] [s=b8] --------------------------------------
223
  } elsif ($cmd =~ /^rblk/) {
224
    $cmd_rest = $';
225
    my $act = "-rblk";
226
    $act .= add_addr();
227
    my $nblk = cget_gdat(16,10,1,256);
228
    $act .= " $nblk";
229
    $act .= add_edone($nblk);
230
    $act .= add_estat();
231
    cget_chkblank();
232
    my @ref_rblk;
233
    my @msk_rblk;
234
    my $do_msk = 0;
235
    for (my $i = 0; $i < $nblk; $i++) {
236
      $cmd_rest = get_line() if ($cmd_rest eq "");
237
      $cmd_rest =~ s/^\s*//;
238
      my ($ref,$msk) = cget_tagval2_gdat("d",16,$dbase);
239
      if (not defined $ref) {
240
        $ref = 0;
241
        $msk = 0xffff;
242
      }
243
      $msk = 0 unless defined $msk;
244
      $do_msk = 1 if $msk != 0;
245
      push @ref_rblk, sprintf("0%6.6o", $ref);
246
      push @msk_rblk, sprintf("0%6.6o", (0xffff & ~$msk));
247
    }
248
 
249
    $act .= ' -edata {' . join(' ',@ref_rblk) . '}';
250
    $act .= ' {' . join(' ',@msk_rblk) . '}' if $do_msk;
251
    push @cmdlist, $act;
252
    cmdlist_do();
253
 
254
  # wblk  n [n=dd] [s=b8] --------------------------------------
255
  } elsif ($cmd =~ /^wblk/) {
256
    $cmd_rest = $';
257
    my $act = "-wblk";
258
    $act .= add_addr();
259
    my $nblk = cget_gdat(16,10,1,256);
260
    my $edone = add_edone($nblk);
261
    my $estat = add_estat();
262
    cget_chkblank();
263
    my @dat_wblk;
264
    for (my $i = 0; $i < $nblk; $i++) {
265
      $cmd_rest = get_line() if ($cmd_rest eq "");
266
      $cmd_rest =~ s/^\s*//;
267
      push @dat_wblk, sprintf('0%6.6o', cget_gdat(16,$dbase));
268
    }
269
 
270
    $act .= ' {' . join(' ',@dat_wblk) . '}';
271
    $act .= $edone;
272
    $act .= $estat;
273
    push @cmdlist, $act;
274
    cmdlist_do();
275
 
276
 
277
  # stat|attn [d=g16] [s=b8] -----------------------------------------
278
  } elsif ($cmd =~ /^(stat|attn)\s+/) {
279
    $cmd_rest = $';
280
    my $act = "-$1";
281
    $act .= add_edata($dbase);
282
    $act .= add_estat();
283
    push @cmdlist, $act;
284
 
285
  # unknown commands -------------------------------------------------
286
  } else {
287
    print "# FAIL: no match for '$cmd'\n";
288
    exit 1;
289
  }
290
 
291
  cget_chkblank();
292
 
293
  cmdlist_do() if scalar(@cmdlist) >= $cmax;
294
}
295
 
296
cmdlist_do();
297
 
298
print "rlc set basedata \$save_config_basedata\n";
299
print "rlc set basestat \$save_config_basestat\n";
300
 
301
exit 0;
302
 
303
#-------------------------------------------------------------------------------
304
sub add_addr {
305
  my $addr;
306
 
307
  $cmd_rest =~ s/^\s*//;
308
  if ($cmd_rest =~ /^\.([[0-9a-z.]+)/) {
309
    $addr = $1;
310
    $cmd_rest = $';
311
  } else {
312
    $addr =sprintf('0x%4.4x', cget_gdat(16,2));
313
  }
314
  return " $addr";
315
}
316
 
317
#-------------------------------------------------------------------------------
318
sub add_data {
319
  my ($dbase) = @_;
320
  my $data = cget_gdat(16,$dbase);
321
  return sprintf(" 0%6.6o", $data);
322
}
323
 
324
#-------------------------------------------------------------------------------
325
# Note: input has ignore mask, output has check mask now
326
sub add_edata {
327
  my ($dbase) = @_;
328
  my ($ref,$msk) = cget_tagval2_gdat("d",16,$dbase);
329
  return "" unless defined $ref;
330
  my $str = sprintf(" -edata 0%6.6o", $ref);
331
  $str .= sprintf(" 0%6.6o", (0xffff & ~$msk)) if defined $msk && $msk;
332
  return $str;
333
}
334
 
335
#-------------------------------------------------------------------------------
336
# Note: input has ignore mask, output has check mask now
337
#       -estat always added, either from s= tag or from .sdef directive
338
sub add_estat {
339
  my ($dat, $msk) = cget_tagval2_gdat("s",8,2);
340
  unless (defined $dat) {
341
    $dat = $ref_sdef;
342
    $msk = $msk_sdef;
343
  }
344
  my $str = sprintf(" -estat 0x%2.2x", $dat);
345
  $str .= sprintf(" 0x%2.2x", (0xff & ~$msk)) if defined $msk && $msk;
346
  return $str;
347
}
348
 
349
#-------------------------------------------------------------------------------
350
sub add_edone {
351
  my ($bsize) = @_;
352
  my ($nblk) = cget_tagval_gdat("n",16,10);
353
  $nblk = $bsize if (not defined $nblk && $chk_ndef);
354
  return "" unless defined $nblk;
355
  my $str = sprintf(" -edone %d", $nblk);
356
  return $str;
357
}
358
 
359
#-------------------------------------------------------------------------------
360
sub cmdlist_do {
361
  return unless scalar(@cmdlist);
362
 
363
  print "rlc exec \\\n";
364
  while (scalar(@cmdlist)) {
365
    print "         ";
366
    print shift @cmdlist;
367
    print " \\\n" if scalar(@cmdlist);
368
  }
369
  print "\n";
370
  @cmdlist = ();
371
  return;
372
}
373
 
374
#-------------------------------------------------------------------------------
375
 
376
sub cget_chkblank {                         # check for unused chars in cmd line
377
  $cmd_rest =~ s/^\s*//;
378
  if ($cmd_rest ne "") {
379
    print "ticonv_rri-E: extra data ignored: \"$cmd_rest\"\n";
380
    print "          for command: \"$cmd_line\"\n";
381
    exit 1;
382
  }
383
}
384
 
385
#-------------------------------------------------------------------------------
386
 
387
sub cget_tagval2_gdat {                     # get tag=v1[,v2], generic base
388
  my ($tag,$nbit,$dbase) = @_;
389
  my $dat;
390
  my $msk = undef;
391
  $cmd_rest =~ s/^\s*//;
392
  if ($cmd_rest =~ /^$tag=/) {
393
    $cmd_rest = $';
394
    if ($cmd_rest =~ /^-/) {
395
      $cmd_rest = $';
396
      my $msk = (1 << $nbit) -1;
397
      return (0,$msk);
398
    } else {
399
      $dat = cget_gdat($nbit, $dbase);
400
      if ($cmd_rest =~ /^,/) {
401
        $cmd_rest = $';
402
        $msk = cget_gdat($nbit, $dbase);
403
      }
404
      return ($dat, $msk);
405
    }
406
  }
407
  return (undef, undef);
408
}
409
 
410
#-------------------------------------------------------------------------------
411
 
412
sub cget_tagval_gdat {                      # get tag=val, generic base
413
  my ($tag,$nbit,$dbase,$min,$max) = @_;
414
  $cmd_rest =~ s/^\s*//;
415
  if ($cmd_rest =~ /^$tag=/) {
416
    $cmd_rest = $';
417
    return cget_gdat($nbit, $dbase,$min,$max);
418
  }
419
  return undef;
420
}
421
 
422
#-------------------------------------------------------------------------------
423
 
424
sub cget_gdat {                             # get generic base value
425
  my ($nbit,$dbase,$min,$max) = @_;
426
  my $dat;
427
 
428
  $cmd_rest =~ s/^\s*//;
429
  if ($cmd_rest =~ /^[xXoObBdD]"/) {
430
    if ($cmd_rest =~ /^[xX]"([0-9a-fA-F]+)"/) {
431
      $cmd_rest = $';
432
      $dat = hex $1;
433
    } elsif ($cmd_rest =~ /^[oO]"([0-7]+)"/) {
434
      $cmd_rest = $';
435
      $dat = oct $1;
436
    } elsif ($cmd_rest =~ /^[bB]"([01]+)"/) {
437
      $cmd_rest = $';
438
      my $odat = sget_bdat($nbit, $1);
439
      $dat = $odat if defined $odat;
440
    } elsif ($cmd_rest =~ /^[dD]"([+-]?[0-9]+)"/) {
441
      $cmd_rest = $';
442
      my $odat = (int $1) & ((1<<$nbit)-1);
443
      $dat = $odat;
444
    }
445
  } else {
446
    if ($cmd_rest =~ /^([+-]?[0-9]+)\./) {
447
      $cmd_rest = $';
448
      my $odat = (int $1) & ((1<<$nbit)-1);
449
      $dat = $odat;
450
    } elsif ($dbase == 16 && $cmd_rest =~ /^([0-9a-fA-F]+)/) {
451
      $cmd_rest = $';
452
      $dat = hex $1;
453
    } elsif ($dbase ==  8 && $cmd_rest =~ /^([0-7]+)/) {
454
      $cmd_rest = $';
455
      $dat = oct $1;
456
    } elsif ($dbase ==  2 && $cmd_rest =~ /^([01]+)/) {
457
      $cmd_rest = $';
458
      my $odat = sget_bdat($nbit, $1);
459
      $dat = $odat if defined $odat;
460
    } elsif ($dbase == 10 && $cmd_rest =~ /^([0-9]+)/) {
461
      $cmd_rest = $';
462
      $dat = int $1;
463
    }
464
  }
465
 
466
  if (not defined $dat) {
467
    print "ticonv_rri-E: cget_gdat error in \"$cmd_rest\" (base=$dbase)\n";
468
    exit 1;
469
  }
470
 
471
  if (defined $min && $dat < $min) {
472
    print "ticonv_rri-E: cget_gdat range error, $dat < $min\n";
473
    exit 1;
474
  }
475
  if (defined $max && $dat > $max) {
476
    print "ticonv_rri-E: cget_gdat range error, $dat > $max\n";
477
    exit 1;
478
  }
479
 
480
  return $dat;
481
}
482
 
483
#-------------------------------------------------------------------------------
484
 
485
sub sget_bdat {                             # convert 01 string -> binary value
486
  my ($nbit,$str) = @_;
487
  my $nchar = length($str);
488
  my $odat = 0;
489
 
490
  if ($nchar != $nbit) {
491
    print "ticonv_rri-E: sget_bdat error \'$str\' has not length $nbit\n";
492
    exit 1;
493
  }
494
 
495
  for (my $i = 0; $i < $nchar; $i++) {
496
    $odat *= 2;
497
    $odat += 1 if substr($str, $i, 1) eq "1";
498
  }
499
  return $odat;
500
}
501
 
502
#-------------------------------------------------------------------------------
503
 
504
sub get_line {
505
  while (1) {
506
    return undef unless scalar(@cmdfh);
507
    my $fh = $cmdfh[$#cmdfh];
508
    my $cmd = <$fh>;
509
    if (not defined $cmd) {
510
      $fh->close();
511
      pop @cmdfh;
512
      next;
513
    }
514
 
515
    # detect @ lines
516
    if ($cmd =~ /^@(.+)/) {
517
      my $fnam = $1;
518
      my $fh = new FileHandle;
519
      $fh->open("<$fnam") or die "failed to open '$fnam'";
520
      push @cmdfh, $fh;
521
      next;
522
    }
523
 
524
    # write C... comment lines to rlc log
525
    if ($cmd =~ /^C(.*)/) {
526
      cmdlist_do();
527
      my $msg = $1;
528
      $msg =~ s/"/'/g;
529
      $msg =~ s/\[/\{/g;
530
      $msg =~ s/\]/\}/g;
531
      print "rlc log \"C $msg\"\n";
532
      next;
533
    }
534
 
535
    $cmd =~ s{^\s*}{};          # remove leading blanks
536
 
537
    next if $cmd =~ m/^#/;      # ignore "# ...." lines
538
    next if $cmd =~ m/^;/;      # ignore "; ...." lines
539
 
540
    $cmd =~ s{--.*}{};          # remove comments after --
541
    $cmd =~ s{\s*$}{};          # remove trailing blanks
542
    next if $cmd eq "";         # ignore empty lines
543
 
544
    return $cmd;
545
  }
546
}

powered by: WebSVN 2.1.0

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