#!/usr/bin/perl -w
use strict;

my %layersToDo=("li1"=>1,"mcon"=>1,"locali"=>1,"metal1"=>1);

sub readfile($)
{
  if(open MYRIN,"<$_[0]")
  {
    my $old=$/;
    undef $/;
    my $content=<MYRIN>;
    close MYRIN;
    $/=$old;
    return $content;
  }
  return undef;
}


foreach my $origlef (<orig/*.lef>)
{
  my $lef=$origlef; $lef=~s/^orig\///;	
  my $mag="../mag/$lef"; $mag=~s/\.lef$/\.mag/;
  print STDERR "origlef: $origlef\n lef: $lef\n mag:$mag\n";
  my $obs="";



  if(open(MAGIN,"<$mag"))
  {
    print "Extracting Obstruction information from $mag\n";	  
    my $active=0;
    my $factor=100.0;
    while(<MAGIN>)
    {
      if(m/magscale (\d+) (\d+)/)
      {
        $factor=100.0*$2;
      }
      if(m/<< (\w+) >>/)
      {
        $active=defined($layersToDo{$1});
	$obs.="    LAYER $1 ;\n" if($active);
      }
      if(m/rect (-?\d+) (-?\d+) (-?\d+) (-?\d+)/ && $active)
      {
        $obs.="      RECT ( ".($1/$factor)." ".($2/$factor)." ) ( ".($3/$factor)." ".($4/$factor)." ) ;\n";
      }
    }
    close MAGIN;
  }
  else
  {
     print "ERROR: Could not open magic file $mag : $!\n";
  }

  #print "$mag\n$obs\n";
  #next;
  
  my $content=readfile("orig/$lef");
  $content=~s/\sOBS\s.*?\sEND\s//sg;
  open OUT,">$lef.temp";
  print OUT $content;
  close OUT;

  my $cell=$lef; $cell=~s/\.lef//;
  print "$lef\n";
  #  open LEFIN,"<orig/$lef";
  open LEFOUT,">$lef";
  our $pin="";
  my $filled=0;
  our $macro="NOTTOBEFOUND";

  #print "$obs\n";
  foreach(split "\n",$content) # while(<LEFIN>)
  {
    $_.="\n";	  
    $macro=$1 if(m/MACRO\s+(\w+)/);
    $pin=$1 if(m/PIN\s+(\w+)/);
    #s/SYMMETRY X Y R90/SITE unit/;
    #s/SITE CORE/SYMMETRY X Y R90/;
    #s/SITE unit.*//;
    s/metal2/met1/;
    s/VDD/vdd/;
    s/GND/gnd/;
    s/USE SIGNAL/USE POWER/ if($pin eq "VDD");
    s/USE POWER/USE GROUND/ if($pin eq "GND"); # GND braucht USE GROUND statt USE POWER

    if(m/^\s*END\s+$macro/ && !$filled) # Inject the obstructions here
    {
      print LEFOUT "\n  OBS\n$obs\n  end\n";
      $filled=1;
    }
    #print $_;
    print LEFOUT $_;	   
    #print "$macro\n";
    #print $_;
    if(m/FOREIGN/)
    {
      if(open(MAG,"<$mag"))
      {
        my $layer="";
        while(<MAG>)
        {
          if(m/<< (\w+) >>/)
	  {
            $layer=$1;
	  }
          if(m/rect 0 0 (\d+) (\d+)/)
          {
            next if($layer eq "checkpaint");
            my $h=$1;
            my $w=$2;
            my $factor=0.01;
	    #print "$lef -> ".($1*$factor)." ".($2*$factor)."\n";
	    #print LEFOUT " SIZE ".($1*$factor)." BY ".($2*$factor)." ;\n";
          }
          if(m/string FIXED_BBOX 0 0 (\d+) (\d+)/)
          {
            my $h=$1;
            my $w=$2;
            my $factor=0.01;
	    #print "$lef -> ".($1*$factor)." ".($2*$factor)."\n";
	    #print LEFOUT " SIZE ".($1*$factor)." BY ".($2*$factor)." ;\n";
          }

	}
        close MAG;
      }
    }
  }
  close LEFOUT;
  #close LEFIN;

  system "cp $lef $lef.beforemagic";

  open MAGIC,"|magic -dnull -noconsole -T sky130A";
  print MAGIC "lef read $lef\n";
  print MAGIC "load $cell\n";
  print MAGIC "lef write $lef\n";
  print MAGIC "quit\n";
  close MAGIC;
}
