| 1 | #! /usr/bin/perl | 
|---|
| 2 | # | 
|---|
| 3 | # Postprocess debug file from vis | 
|---|
| 4 | #   Combine bus signals | 
|---|
| 5 | # | 
|---|
| 6 | # Author: Toshi Isogai | 
|---|
| 7 | # | 
|---|
| 8 | # $Id: visdbgpp,v 1.1 2001/03/14 20:10:04 hsv Exp $ | 
|---|
| 9 |  | 
|---|
| 10 | %sigval = (); | 
|---|
| 11 |  | 
|---|
| 12 | while (<>) { | 
|---|
| 13 |   if (m{^([\w\.]+(<\*\d+\*>)?)<\d+>}) { # a (possibly partial) state | 
|---|
| 14 |     # get lines on the same bus | 
|---|
| 15 |     $sig = $1; | 
|---|
| 16 |     $val = $sigval{$sig}; | 
|---|
| 17 |     # Quote the signal name when using it as pattern because it may | 
|---|
| 18 |     # contain the metacharacter '*'. | 
|---|
| 19 |     while (m{^\Q$sig\E<(\d+)>:(\d)}) { | 
|---|
| 20 |       $val = ($val & ~(1<<$1)) | ($2 << $1); # replace value on bit | 
|---|
| 21 |       $_ = <ARGV>; | 
|---|
| 22 |     } | 
|---|
| 23 |     printf "$sig:0x%X\n", $val; | 
|---|
| 24 |     $sigval{$sig} = $val; | 
|---|
| 25 |     redo; | 
|---|
| 26 |  | 
|---|
| 27 |   } elsif (m{<}) {              # a CTL formula | 
|---|
| 28 |       # combine (xyz<a+1:a> * xyz<a-1>) into xyz<a+1:a-1> | 
|---|
| 29 |       while (m{\(([\w\.]+(<\*\d+\*>)?)<(\d+)(:(\d+))?>=(0x)?([\da-fA-F]+) | 
|---|
| 30 |                \s\*\s | 
|---|
| 31 |                \1<(\d+)>=(\d)\)}xg) { | 
|---|
| 32 |         $str = $&;              # entire matched string | 
|---|
| 33 |         $sig = $1;              # signal name | 
|---|
| 34 |         $msb = $3;              # most significant bit index | 
|---|
| 35 |         $lsb = $5;              # optional least significant bit index | 
|---|
| 36 |         $val = hex ($7);        # value of left-hand side | 
|---|
| 37 |         $newlsb = $8;           # index being added to the vector | 
|---|
| 38 |         $bit = $9;              # value of the new bit | 
|---|
| 39 |  | 
|---|
| 40 |         if ($lsb eq '') { | 
|---|
| 41 |           # new start | 
|---|
| 42 |           $lsb = $msb; | 
|---|
| 43 |         } | 
|---|
| 44 |  | 
|---|
| 45 |         if ($lsb == $newlsb+1 || $msb == $newlsb-1) { | 
|---|
| 46 |           $val = sprintf("%X",($val << 1) + $bit); | 
|---|
| 47 |  | 
|---|
| 48 |           s{\Q$str\E}{$sig<$msb:$newlsb>=0x$val}; | 
|---|
| 49 |  | 
|---|
| 50 |         } else { | 
|---|
| 51 |           # warning | 
|---|
| 52 |           print (STDERR "Warning: Non concecutive bits at $.. "); | 
|---|
| 53 |           if ($msb == $lsb) { | 
|---|
| 54 |             print (STDERR "Bit $msb next to Bit $newlsb\n"); | 
|---|
| 55 |           } else { | 
|---|
| 56 |             print (STDERR "MSB $msb LSB $lsb next to Bit $newlsb\n"); | 
|---|
| 57 |           } | 
|---|
| 58 |         } | 
|---|
| 59 |  | 
|---|
| 60 |       } | 
|---|
| 61 |  | 
|---|
| 62 |   } | 
|---|
| 63 |   print; | 
|---|
| 64 |   last if eof(); | 
|---|
| 65 |  | 
|---|
| 66 | } | 
|---|