#! /usr/bin/perl # # Postprocess debug file from vis # Combine bus signals # # Author: Toshi Isogai # # $Id: visdbgpp,v 1.1 2001/03/14 20:10:04 hsv Exp $ %sigval = (); while (<>) { if (m{^([\w\.]+(<\*\d+\*>)?)<\d+>}) { # a (possibly partial) state # get lines on the same bus $sig = $1; $val = $sigval{$sig}; # Quote the signal name when using it as pattern because it may # contain the metacharacter '*'. while (m{^\Q$sig\E<(\d+)>:(\d)}) { $val = ($val & ~(1<<$1)) | ($2 << $1); # replace value on bit $_ = ; } printf "$sig:0x%X\n", $val; $sigval{$sig} = $val; redo; } elsif (m{<}) { # a CTL formula # combine (xyz * xyz) into xyz while (m{\(([\w\.]+(<\*\d+\*>)?)<(\d+)(:(\d+))?>=(0x)?([\da-fA-F]+) \s\*\s \1<(\d+)>=(\d)\)}xg) { $str = $&; # entire matched string $sig = $1; # signal name $msb = $3; # most significant bit index $lsb = $5; # optional least significant bit index $val = hex ($7); # value of left-hand side $newlsb = $8; # index being added to the vector $bit = $9; # value of the new bit if ($lsb eq '') { # new start $lsb = $msb; } if ($lsb == $newlsb+1 || $msb == $newlsb-1) { $val = sprintf("%X",($val << 1) + $bit); s{\Q$str\E}{$sig<$msb:$newlsb>=0x$val}; } else { # warning print (STDERR "Warning: Non concecutive bits at $.. "); if ($msb == $lsb) { print (STDERR "Bit $msb next to Bit $newlsb\n"); } else { print (STDERR "MSB $msb LSB $lsb next to Bit $newlsb\n"); } } } } print; last if eof(); }