blob: 0dda29995f19bf4200370ef5cbec901796a4593f [file] [log] [blame]
#!/usr/bin/perl
###################################################################################
# This script prepares the ABC created blif for VPR by fixing lines that are too
# long and adding the clock signals to the latches.
#
# Usage:
# hack_fix_lines_and_latches.pl abc_blif output_blif clock_file1 clock_file2
#
# Parameters:
# abc_blif: The input blif that was created by ABC
# output_blif: The blif output by this script, to be used in VPR
# clock_file1: File that contains a list of benchmarks and their clock signals
# Each line of the file contains the benchmark name, then the
# clock signal name, separated by white space.
# clock_file2: A additional clock file to check
#
###################################################################################
use strict;
sub find_clock;
# check the parametes. Note PERL does not consider the script itself a parameter.
my $number_arguments = @ARGV;
if ($number_arguments != 3 and $number_arguments != 4)
{
print("usage: hack_fix_latches.pl [input_blif] [output_blif] [clock_file] [optional_2nd_clock_file] \n");
exit(-1);
}
# Read input/output file parameters
my $input_file_path = shift(@ARGV);
(-f $input_file_path) or die "Input file does not exists ($input_file_path)";
my $output_file_path = shift(@ARGV);
my $clock_file_path = shift(@ARGV);
my $clock2_file_path = shift(@ARGV);
# Get benchmark name
$input_file_path =~ /(.*?\/)+(.*?)\./;
my $bench_name = $2;
print "Benchmark name: $bench_name\n";
##########################################################################
############################ FIX LINE LENGTHS ############################
##########################################################################
open(IN_FILE_HDL, "<$input_file_path");
open(OUT_FILE_HDL, ">$output_file_path");
while (<IN_FILE_HDL>)
{
my $line = $_;
chomp($line);
my $i = 0;
my $start;
while ((length($line) - $i) > 1500)
{
$start = $i;
$i += 1000;
while (substr($line, $i, 1) ne " ")
{
$i++;
}
print OUT_FILE_HDL substr($line, $start, $i - $start) . " \\\n";
}
print OUT_FILE_HDL substr($line, $i) . "\n";
}
close (IN_FILE_HDL);
close (OUT_FILE_HDL);
##########################################################################
############################ ADD CLOCKS TO LATCHES #######################
##########################################################################
my $found = 0;
my $clock = "";
find_clock(\$found, \$clock, $clock_file_path, $bench_name);
find_clock(\$found, \$clock, $clock2_file_path, $bench_name);
if (! $found)
{
print ("Could not find benchmark in bench/clock file(s): $clock_file_path,$clock2_file_path\nSee http://code.google.com/p/vtr-verilog-to-routing/wiki/ClocksFile\n");
exit(-1);
}
if ($clock ne "")
{
print "Clock Found:$clock\n";
}
else
{
print "Invalid clock found.\n";
exit(-1);
}
open (OUT_FILE_HDL, "<$output_file_path");
my @lines = <OUT_FILE_HDL>;
close (OUT_FILE_HDL);
open (OUT_FILE_HDL, ">$output_file_path");
my $line;
foreach $line (@lines)
{
chomp($line);
$line =~ s/(.latch.*)( [012])/\1 re top\^$clock\2/;
print OUT_FILE_HDL $line . "\n";
}
close (OUT_FILE_HDL);
print "\nSuccess\n";
# sed command to substitute the details in...note the \\ is used since passed to command prompt which chops one \
#print "sed -e \"s/\\(.latch.*\\)\\( [012]\\)/\\1 re $clock\\2/\" $output_file_path > $output_file_path";
#system "sed -e \"s/\\(.latch.*\\)\\( [012]\\)/\\1 re $clock\\2/\" $output_file_path > $output_file_path";
sub find_clock
{
my $found_ref = shift();
my $clock_name_ref = shift();
my $clock_file = shift();
my $bench_name = shift();
my $line;
if (-r $clock_file)
{
# open the bench/clock file.
open (LIST_FILE, "<$clock_file");
# loop looking for benchmark
while ($line = <LIST_FILE>)
{
chomp($line);
# Skip comments and empty lines
if ($line =~ /^\w*#/ or $line =~ /^\w*$/)
{
next;
}
$line =~ m/^(\S+)\s+(\S+)\s*$/;
if ($bench_name eq $1)
{
${$found_ref} = 1;
${$clock_name_ref} = $2;
last;
}
}
close (LIST_FILE);
}
return;
}