mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/perl -W
 | 
						|
 | 
						|
###########################################
 | 
						|
## derivgen.pl
 | 
						|
##
 | 
						|
## Written: David_Harris@hmc.edu 
 | 
						|
## Created: 29 January 2024
 | 
						|
## Modified: 
 | 
						|
##
 | 
						|
## Purpose: Read config/derivlist.txt and generate config/deriv/*/config.vh
 | 
						|
##          derivative configurations from the base configurations
 | 
						|
##
 | 
						|
## A component of the CORE-V-WALLY configurable RISC-V project.
 | 
						|
## https://github.com/openhwgroup/cvw
 | 
						|
## https://github.com/openhwgroup/cvw
 | 
						|
##
 | 
						|
## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
 | 
						|
##
 | 
						|
## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
 | 
						|
##
 | 
						|
## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file 
 | 
						|
## except in compliance with the License, or, at your option, the Apache License version 2.0. You 
 | 
						|
## may obtain a copy of the License at
 | 
						|
##
 | 
						|
## https:##solderpad.org/licenses/SHL-2.1/
 | 
						|
##
 | 
						|
## Unless required by applicable law or agreed to in writing, any work distributed under the 
 | 
						|
## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 | 
						|
## either express or implied. See the License for the specific language governing permissions 
 | 
						|
## and limitations under the License.
 | 
						|
################################################################################################
 | 
						|
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
import os;
 | 
						|
use Data::Dumper;
 | 
						|
 | 
						|
my $curderiv = "";
 | 
						|
my @derivlist = ();
 | 
						|
my %derivs;
 | 
						|
my %basederiv;
 | 
						|
 | 
						|
if ($#ARGV != -1) {
 | 
						|
    die("Usage: $0")
 | 
						|
}
 | 
						|
my $derivlist = "$ENV{WALLY}/config/derivlist.txt";
 | 
						|
open(my $fh, $derivlist) or die "Could not open file '$derivlist' $!";
 | 
						|
foreach my $line (<$fh>) {
 | 
						|
    chomp $line;
 | 
						|
    my @tokens = split('\s+', $line);
 | 
						|
    if ($#tokens < 0 || $tokens[0] =~ /^#/) {   # skip blank lines and comments
 | 
						|
        next;
 | 
						|
    }
 | 
						|
    if ($tokens[0] =~ /deriv/) {   # start of a new derivative
 | 
						|
        &terminateDeriv();
 | 
						|
        $curderiv = $tokens[1];
 | 
						|
        $basederiv{$curderiv} = $tokens[2];
 | 
						|
        @derivlist = ();
 | 
						|
        if ($#tokens > 2) {
 | 
						|
            my $inherits = $derivs{$tokens[3]};
 | 
						|
            @derivlist = @{$inherits};
 | 
						|
        }
 | 
						|
    } else {   # add to the current derivative
 | 
						|
        $line =~ /\s*(\S+)\s*(.*)/;
 | 
						|
        my @entry = ($1, $2);
 | 
						|
        push(@derivlist, \@entry);
 | 
						|
    }
 | 
						|
}
 | 
						|
&terminateDeriv();
 | 
						|
close($fh);
 | 
						|
foreach my $key (keys %derivs) {
 | 
						|
    my $dir = "$ENV{WALLY}/config/deriv/$key";
 | 
						|
    system("rm -rf $dir");
 | 
						|
    system("mkdir -p $dir");
 | 
						|
    my $configunmod = "$dir/config_unmod.vh";
 | 
						|
    my $config = "$dir/config.vh";
 | 
						|
    my $base = "$ENV{WALLY}/config/$basederiv{$key}/config.vh";
 | 
						|
    system("cp $base $configunmod");
 | 
						|
    open(my $unmod, $configunmod) or die "Could not open file '$configunmod' $!";
 | 
						|
    open(my $fh, '>>', $config) or die "Could not open file '$config' $!";
 | 
						|
 | 
						|
    my $datestring = localtime();
 | 
						|
    my %hit = ();
 | 
						|
    print $fh "// Config $key automatically derived from $basederiv{$key} on $datestring usubg derivgen.pl\n";
 | 
						|
    foreach my $line (<$unmod>) {
 | 
						|
        foreach my $entry (@{$derivs{$key}}) {    
 | 
						|
            my @ent = @{$entry};
 | 
						|
            my $param = $ent[0];
 | 
						|
            my $value = $ent[1]; 
 | 
						|
            if ($line =~ s/$param\s*=\s*.*;/$param = $value;/) {
 | 
						|
                $hit{$param} = 1;
 | 
						|
#               print("Hit: new line in $config for $param is $line");
 | 
						|
            }
 | 
						|
        }
 | 
						|
        print $fh $line;
 | 
						|
    }
 | 
						|
    close($fh);
 | 
						|
    close($unmod);
 | 
						|
    foreach my $entry (@{$derivs{$key}}) {
 | 
						|
        my @ent = @{$entry};
 | 
						|
        my $param = $ent[0];
 | 
						|
        if (!exists($hit{$param})) {
 | 
						|
            print("Unable to find $param in $key\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
    system("rm -f $dir/config_unmod.vh");
 | 
						|
}
 | 
						|
 | 
						|
sub terminateDeriv {
 | 
						|
    if ($curderiv ne "") { # close out the previous derivative
 | 
						|
        my @dl = @derivlist;
 | 
						|
        $derivs{$curderiv} = \@dl;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
sub printref {
 | 
						|
    my $ref = shift;
 | 
						|
    my @array = @{$ref};
 | 
						|
    foreach my $entry (@array) {
 | 
						|
        print join('_', @{$entry}), ', ';
 | 
						|
    }
 | 
						|
    print("\n");
 | 
						|
} |