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

Subversion Repositories xgate

[/] [xgate/] [trunk/] [sw/] [tools/] [misc/] [make_decode.pl] - Rev 31

Go to most recent revision | Compare with Previous | Blame | View Log

#!/usr/bin/perl -w
 
sub month_to_number {
  if ($_[0] eq "0") {
      $_[0] = "0";
  } elsif ($_[0] eq "1") {
      $_[0] = "1";
  } elsif ($_[0] eq "IMM3") {
      $_[0] = "???";
  } elsif ($_[0] eq "RS") {
      $_[0] = "???";
  } elsif ($_[0] eq "RD") {
      $_[0] = "???";
  } elsif ($_[0] eq "IMM4") {
      $_[0] = "????";
  } elsif ($_[0] eq "RS1") {
      $_[0] = "???";
  } elsif ($_[0] eq "RS2") {
      $_[0] = "???";
  } elsif ($_[0] eq "REL9") {
      $_[0] = "?????????";
  } elsif ($_[0] eq "REL10") {
      $_[0] = "??????????";
  } elsif ($_[0] eq "RB") {
      $_[0] = "???";
  } elsif ($_[0] eq "OFFS5") {
      $_[0] = "?????";
  } elsif ($_[0] eq "RI") {
      $_[0] = "???";
  } elsif ($_[0] eq "IMM8") {
      $_[0] = "????????";
  } else {
      printf "Bad Instruction Parameter: %s\n", $_[0];
      $_[0] = "";
  }
}
 
sub set_default_values {
    print "  always \@*\n";
    print "    begin\n";
    print "      enable_rd = 0;\n";
    print "      enable_imm3 = 0;\n";
    print "      enable_rs = 0;\n";
    print "      enable_imm4 = 0;\n";
    print "      enable_rs1 = 0;\n";
    print "      enable_rs2 = 0;\n";
    print "      enable_rel9 = 0;\n";
    print "      enable_rel10 = 0;\n";
    print "      enable_rb = 0;\n";
    print "      enable_offs5 = 0;\n";
    print "      enable_ri = 0;\n";
    print "      enable_imm8 = 0;\n";
    print "      ena_rd_low_byte = 0;\n";
    print "      ena_rd_high_byte = 0;\n";
    print "      ena_bra_ = 0;\n";
    print "      ena_alu_ = 0;\n";
    print "\n";
    print "      case (op_code)\n";
}
 
 
if( @ARGV < 1 ) {
  $progname = `basename $0`;
  chomp($progname);
  print "Syntax: $progname <Infile> <Outfile>\n";
  die;
} elsif ( @ARGV < 2 ) {
  print "Using default output file \"temp.v\"\n";
  $Infile = shift @ARGV;
  $Outfile = 'temp.v';
} else {
  $Infile = shift @ARGV;
  $Outfile = shift @ARGV;
}
 
open( source_file,  "<$Infile" )  || die "Could not open Input file";
open( verilog_file, ">$Outfile" ) || die "Could not open Output file";
 
$i = 1;
@op_code_list = ();
set_default_values;
while (<source_file>) {
  chomp;
  s/\\$//;      # remove trailing \
  s/}$//;       # remove trailing }
  s/{.*//;      # get rid of all the lines starting with {
  s/\\\w*//g;   # get rid of all words starting with \
  s/^ *//g;     # get rid of all leading blanks
  s/'96RI/-RI/; # swap oddball minus sign format
  if ($_) {
    if (! / [01] [01] / ) {
      print "\n      // Instruction Group -- $_ \n";
    } else {
      /( [01] )/;
      $inst = index($_, $1);
      $instruction = substr($_, 0, $inst);
      $op_code = substr($_, $inst++);
      # print "Instruction Line = $_\n";
      @bit_fields = split / /, $op_code;
      shift @bit_fields;  # get rid of leading blank element
      $case_var = "";
      foreach $field (@bit_fields) {
	$case_var = $case_var . &month_to_number($field);
      }
      push @op_code_list, $case_var;
      print "\n      // Instruction = $instruction, Op Code = $op_code\n";
      print "      16'b$case_var :\n";
      print "         begin\n";
      print "           ena_bra_ = 1;\n";
      print "           ena_alu_ = 1;\n";
      if (index($instruction, "RD") != -1) {
        print "           ena_rd_low_byte = 1;\n";
        print "           ena_rd_high_byte = 1;\n";
      }
      if (index($instruction, "IMM3") != -1) {print "           enable_imm3 = 1;\n"}
      if (index($instruction, "RS") != -1) {print "           enable_rs = 1;\n"}
      if (index($instruction, "IMM4") != -1) {print "           enable_imm4 = 1;\n"}
      if (index($instruction, "RS1") != -1) {print "           enable_rs1 = 1;\n"}
      if (index($instruction, "RS2") != -1) {print "           enable_rs2 = 1;\n"}
      if (index($instruction, "REL9") != -1) {print "           enable_rel9 = 1;\n"}
      if (index($instruction, "REL10") != -1) {print "           enable_rel10 = 1;\n"}
      if (index($instruction, "RB") != -1) {print "           enable_rb = 1;\n"}
      if (index($instruction, "OFFS5") != -1) {print "           enable_offs5 = 1;\n"}
      if (index($instruction, "RI") != -1) {print "           enable_ri = 1;\n"}
      if (index($instruction, "IMM8") != -1) {print "           enable_imm8 = 1;\n"}
      print "         end\n";
      $i++;
    }
  }
}
 
print "      default :\n";
print "        begin\n";
print "        end\n";
print "    endcase\n";
 
print "    end\n";
 
 
close( source_file );
close( verilog_file );
 
sort @op_code_list;
foreach $item (@op_code_list) {
  print "$item\n"
}
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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