uart: swap status with config half word
[calu.git] / 2_isa / gentex.pl
index b2751c84d51c257fce8d3cbca1f31273d93a8e35..967bd7a99b1101dae2a073c05295664b202fe62d 100755 (executable)
@@ -1,6 +1,10 @@
 #!/usr/bin/perl
 use strict;
 
+sub plaintext {
+       print $_[0];
+}
+
 sub ins {
        my $bits = $_[0];
        my $bline;
@@ -17,8 +21,11 @@ sub ins {
        my $x;
        my @fieldnames;
        my @flagnames = ('SF', 'CF', 'OF', 'ZF');
+       my $section = "\\subsubsection";
 
-
+       if($_[9]) {
+               $section = "\\item ";
+       }
 
        @fields = split(/\|/, $_[3]);
        foreach my $field (@fields) {
@@ -48,36 +55,29 @@ sub ins {
 
                if($fieldn =~ m/^[^\(.]*\(\s*([0-1]+)\s*\).*$/) {
                        if(length($1) == $fields[$count]) {
-                               push(@bitlist,$1);
+                               push(@bitlist,'S'.$1);
                                $fieldn =~  s/\s?\(\s*[0-1]+\s*\)//;
                                $pvline = 1;
                        }
                        else {
-                               $x = '';
-                               for($i = 1; $i <= $fields[$count]; $i++) {
-                                       $x .= 'X';
-                               }
-                       push(@bitlist,$x);
+                               $x = 'LX';
+                               push(@bitlist,$x);
                        }
                }
                else {
-                       $x = '';
-                       for($i = 1; $i <= $fields[$count]; $i++) {
-                               $x .= 'X';
-                       }
+                       $x = 'LX';
                        push(@bitlist,$x);
                }
                #$tabular .= $fieldn.": ". $bits." \\\\";
                $count++;
        }
-       my $bitlist = join("",@bitlist);
 
        #$tabular .= "\\textbf{names:} @fieldnames \n";
        #$tabular .= "\\textbf{bitlist:} $bitlist \n";
 
        $count = $bits-1;
 
-       $tabular = "\\subsubsection{".$_[1]."}\n";
+       $tabular = $section."{\\texttt{".$_[1]."} -- ".$_[2]."}\n";
        $tabular .= "\\begin{center} \n \\resizebox{\\textwidth}{!}{\n";
        $tabular .= "\\begin{tabular}{|l|";
        for($i = $bits-1; $i >= 0; $i--) {
@@ -93,30 +93,36 @@ sub ins {
                        $bline .= "\\\\ \\hline \n";
                }
 
-               #build bitvalue
-               $vline .= substr($bitlist,($bits-1)-$i,1);
-               if($i != 0) {
-                       $vline .= " & ";
-               }
-               else {
-                       $vline .= "\\\\ \\hline \n";
-               }
-
-               #build nameline
+               #build nameline and bitvalue
                #because of multicolumn we need to limit execution
                if($i == $count) {
                        $nline .= "\\multicolumn{@fields[0]}{>{\\columncolor{names}}c|}{@fieldnames[0]}";
 
+                       if(substr(@bitlist[0],0,1) eq "L") {
+                               $vline .= "\\multicolumn{@fields[0]}{>{\\columncolor{bitval}}c|}{".substr(@bitlist[0],1)."}";
+                       }
+                       else {
+                               for(my $j = 1; $j <= @fields[0]; $j++) {
+                                       $vline .= substr(@bitlist[0],$j,1);
+                                       if($j != @fields[0]) {
+                                               $vline .= " & ";
+                                       }
+                               }
+                       }
+
                        #update count
                        $count -= @fields[0];
 
                        if($count < 0) {
                                $nline .= "\\\\ \\hline \n";
+                               $vline .= "\\\\ \\hline \n";
                        }
                        else {
                                $nline .= " & ";
+                               $vline .= " & ";
                        }
 
+                       shift(@bitlist);
                        shift(@fieldnames);
                        shift(@fields);
                }
@@ -159,6 +165,41 @@ sub ins {
        }
 
        print $tabular;
+
+       if($_[8]) {
+               print "\\paragraph{Aliases to this Instruction:} \n";
+               my @aliases = split(/\|/, $_[8]);
+
+               print "\\begin{list}{\\labelitemi}{\\leftmargin=0em \\itemindent=1em}";
+
+
+               foreach my $alias (@aliases) {
+                       my $long;
+                       my $sub;
+                       my @params;
+                       my $namelist = $_[4];
+
+                       @params = split(/-/, $alias);
+                       $sub = @params[0];
+                       $long = @params[1];
+                       shift(@params); shift(@params);
+
+                       foreach my $vals (@params) {
+                               my $field;
+                               my $val;
+                               ($field, $val) = split(/\//, $vals);
+
+                               my @fieldnames = split(/\|/, $namelist);
+
+                               $fieldnames[$field] = $fieldnames[$field]."(".$val.")";
+                               $namelist = join("|",@fieldnames);
+                       }
+
+                       ins($_[0], $sub, $long,$_[3], $namelist, '', '', '', '',1);
+               }
+               print "\\end{list}";
+       }
+
 }
 
 if($#ARGV != 0) {