| #!/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; | 
 | } |