123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #!/usr/bin/perl
- #
- # Extract dependency files from a Quartus .qsf file
- #
- use strict;
- my($project,$outfile,@infiles) = @ARGV;
- my %dep_deps = ();
- my %map_deps = ();
- my %asm_deps = ();
- my %cof_list = ();
- my $output_dir = 'output_files';
- sub read_file($) {
- my($infile) = @_;
- $dep_deps{$infile}++;
- $map_deps{$infile}++;
- open(my $in, '<', $infile) or die;
- while (defined(my $l = <$in>)) {
- chomp $l;
- if ($l =~ /^\s*include\s+\"?(.*?)\"?\s*$/) {
- read_file($1);
- next;
- } elsif ($l =~ /^\s*\#nodeps:\s*\"?(.*?)\"?\s*$/) {
- delete $asm_deps{$1};
- delete $map_deps{$1};
- delete $cof_list{$1};
- next;
- }
- next unless ($l =~ /^\s*set_global_assignment\s+\-name\s+(\w+)\s+\"?(.*?)\"?\s*$/);
- my $type = lc($1);
- my $name = $2;
- if ($type =~ /^project_output_directory$/i) {
- $output_dir = $name;
- next;
- }
- next if ($type !~ /_file$/i || $type =~ /^generate_/i);
- $name =~ s/^quartus_\w+://;
- $name =~ s/\s-.*$//;
- if ($name =~ /\.cof$/i) {
- $cof_list{$name}++;
- } elsif ($type =~ /^(signaltap_file|use_signaltap_file|sld_file|cdf_file)$/i) {
- # Skip
- } elsif ($type eq 'source_tcl_script_file' &&
- $name =~ /\.qsf$/i) {
- read_file($name);
- } elsif ($type =~ /^(mif|hex)_file$/i) {
- $asm_deps{$name}++;
- } else {
- $map_deps{$name}++;
- }
- }
- close($in);
- }
- sub print_deps($$%) {
- my($out,$prefix,%deps) = @_;
- print $out "\n", $prefix;
- foreach my $dep (sort keys(%deps)) {
- print $out " \\\n\t", $dep;
- }
- print $out "\n";
- }
- unlink($outfile);
- foreach my $f (@infiles) {
- read_file($f);
- }
- open(my $out, '>', $outfile) or die;
- print_deps($out, "${outfile} :", %dep_deps);
- print_deps($out, "${project}_asm_deps := ", %asm_deps);
- print $out "\n$output_dir/$project.mif_update.rpt: \$(${project}_asm_deps)\n";
- print $out "\nall_asm_deps += \$(${project}_asm_deps)\n";
- print_deps($out, "${project}_map_deps := ", %map_deps);
- print $out "\n$output_dir/$project.map.rpt: \$(${project}_map_deps)\n";
- print $out "\nall_map_deps += \$(${project}_map_deps)\n";
- close($out);
- exit 0;
|