eval 'exec perl -S $0 ${1+"$@"}'
                 if 0;
## 
## -------------------------------------------------------------
##    Copyright 2004-2008 Synopsys, Inc.
##    All Rights Reserved Worldwide
## 
##    Licensed under the Apache License, Version 2.0 (the
##    "License"); you may not use this file except in
##    compliance with the License.  You may obtain a copy of
##    the License at
## 
##        http://www.apache.org/licenses/LICENSE-2.0
## 
##    Unless required by applicable law or agreed to in
##    writing, software 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.
## -------------------------------------------------------------
## 


$vmm = $0;
$vmm =~ s|([^/]*)$||;
$me = $1;

sub usage
{
    print STDERR <<USAGE;

Usage: $me [-d] [-p distdir] [vcs_home]

Move the VMM source distribution that contains this script
onto a VCS installation.

If a VCS installation is not explicitly defined, \$VCS_HOME is used.

If the -p option is used, the specified directory is used as VMM
source distribution instead of the directory where this script is
found.

The '-d' option displays the command that would normally be executed
during the patching process but does not execute them.

USAGE

    exit(1);
}

#
# Parse the command-line options
#
require "getopts.pl";
&usage if !&Getopts("dhp:") || $opt_h;

$vmm = $opt_p if $opt_p;

$vcs = shift(@ARGV);
$vcs = $ENV{'VCS_HOME'} unless $vcs;
&usage() unless $vcs;

$| = 1;

# Make sure the VMM patch area is a valid one
if (! -e "$vmm/sv/std_lib/vmm.sv") {
   print STDERR "ERROR: Cannot patch from \"$vmm\": Not a VMM patch distribution\n";
   exit(-1);
}

# Make sure VCS_HOME exists
if (! -e "$vcs/etc/rvm/vmm.sv") {
   print STDERR "ERROR: Cannot patch \"$vcs\": Not a suitable VCS installation\n";
   exit(-1);
}
# Make sure VCS_HOME is writeable!
if (! -w "$vcs/etc") {
   print STDERR "ERROR: Cannot patch \"$vcs\": No write permission\n";
   exit(-1) unless $opt_d;
}

print "\nPatching the VCS installation located at \"$vcs\"\n";
print "with the VMM OpenSource distribution located at \"$vmm\"\n\n";

# Check if the patch contains SvOv interop code
$interop = system("grep -q VMM_OV_INTEROP $vmm/sv/std_lib/vmm.sv");
if ($interop) {
   print "\033[41m";
   print "******************** WARNING *********************\n";
   print "This will disable RVM-OV/VMM-SV interoperability!!\n";
   print "******************** WARNING *********************";
   print "\033[0m\n\n";
}

if ($opt_d) {
   print "<DEBUG : WILL NOT PATCH> Proceed (y/n) ? [n] ";
} else {
   print "Proceed (y/n) ? [n] ";
}

$answer = <STDIN>;
if ($answer !~ m/^\s*[yY]/) {
   print "Patching operation ABORTED.\n";
   exit(1);
}

print "Patching...\n";

($sec, $min, $hour, $mday, $mon, $year, $junk) = localtime($^T);
$stamp = sprintf("%4d.%02d.%02d.%02d.%02d.%02d",
                 $year+1900, $mon, $mday, $hour, $min, $sec);

sub patch {
   print "$cmd\n";
   return if $opt_d;
   $rc = system($cmd);
   if ($rc) {
      print STDERR "Error while executing \"$cmd\": $!\n";
      print STDERR "Patching aborted.\n\n";
      print STDERR "** WARNING ** Your VCS installation may be corrupted!\n\n";
      exit($rc);
   }
}

$cmd = "echo \"Patched on $stamp from $vmm\" >$vcs/VMM_PATCHED.$stamp";
&patch;

$cmd = "mv $vcs/etc/rvm $vcs/etc/rvm.$stamp";
&patch;
$cmd = "mkdir $vcs/etc/rvm";
&patch;

@bins = ();
foreach $bin (<$vmm/shared/bin/*/ralgen>) {
   $bin =~ m#([^/]+)/ralgen#;
   $bin = $1;
   push(@bins, $bin);
}
%os = ();
foreach $bin (@bins) {
   next if (! -e "$vcs/$bin");

   $os{$bin} = 1;

   $cmd = "cp $vcs/$bin/bin/ralgen.binary $vcs/etc/rvm.$stamp/ralgen.$bin";
   &patch;

   $cmd = "chmod u+w $vcs/$bin/bin/ralgen.binary";
   &patch;

   $cmd = "cp $vmm/shared/bin/$bin/ralgen $vcs/$bin/bin/ralgen.binary";
   &patch;
}

@not_os = ();
foreach $bin (<$vcs/*/bin/ralgen.binary>) {
   $bin =~ m#([^/]+)/bin/ralgen#;
   $bin = $1;
   if (!$os{$bin}) {
      push(@not_os, $bin);
   }
}

$cmd = "cp $vcs/bin/vmmgen $vcs/etc/rvm.$stamp/vmmgen";
&patch;

$cmd = "chmod u+w $vcs/bin/vmmgen $vcs/bin/rvmgen";
&patch;

$cmd = "cp $vmm/shared/bin/vmmgen $vcs/bin/vmmgen";
&patch;

$cmd = "cp $vmm/shared/bin/vmmgen $vcs/bin/rvmgen";
&patch;

$cmd = "mkdir $vcs/etc/rvm/shared";
&patch;
$cmd = "cp -r $vmm/shared/lib $vcs/etc/rvm/shared";
&patch;

$cmd = "cp -r $vmm/shared/src $vcs/etc/rvm/shared";
&patch;

$cmd = "cp -r $vmm/sv/* $vcs/etc/rvm";
&patch;

$cmd = "sed -e s/vmm_std_lib/_vcs_vmm/ <$vmm/sv/std_lib/vmm.sv >$vcs/etc/rvm/std_lib/vmm.sv";
&patch;

$cmd = "mkdir $vcs/etc/rvm/sv";
&patch;
$cmd = "mkdir $vcs/etc/rvm/sv/RAL";
&patch;
$cmd = "ln -s ../../RAL/tests $vcs/etc/rvm/sv/RAL";
&patch;

# Bring back the OV stuff
$cmd = "cp $vcs/etc/rvm.$stamp/*.vrp $vcs/etc/rvm";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/ov $vcs/etc/rvm";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/shared/lib/templates/*.vr $vcs/etc/rvm/shared/lib/templates";
&patch;
$cmd = "cp -r $vcs/etc/rvm.$stamp/shared/lib/templates/ov.* $vcs/etc/rvm/shared/lib/templates";
&patch;

if (@not_os) {
   print STDERR "\n\033[43m";
   print STDERR "******************** WARNING *********************\n";
   print STDERR "'ralgen' was not patched for the following OS:\n";
   foreach $os (@not_os) {
      print STDERR "   $os\n";
   }
   print STDERR "******************** WARNING *********************";
   print STDERR "\033[0m\n\n";
}

if (%os) {
   print STDERR "\n\033[42m";
   print STDERR "'ralgen' was patched for the following OS:\n";
   foreach $os (keys(%os)) {
      print STDERR "   $os\n";
   }
   print STDERR "\033[0m\n\n";
} else {
   print STDERR "\n\033[41m";
   print STDERR "******************** WARNING *********************\n";
   print STDERR "'ralgen' was not patched!!\n";
   print STDERR "******************** WARNING *********************";
   print STDERR "\033[0m\n\n";
}

print STDERR "\033[42m";
print STDERR "The VMM library and applications were patched for all OS\n";
print STDERR "because they are OS-independent\n";
print STDERR "\033[0m\n\n";

print STDERR "Patch completed...\n\n";

exit(0);
