#!/usr/local/bin/perl -w $VERSION = 1.0; use strict; require 5.006; use strict; use File::Basename; use Getopt::Long qw(GetOptions); use GDS2; $|++; $\="\n"; ## subs used sub printUsage(); sub printVersion(); BEGIN { use constant TRUE => 1; use constant FALSE => 0; } ## process command line... my $convertType4Paths=1; ## TODO GetOptions( 'help|?' => \&printUsage, 'version' => \&printVersion, ) || printUsage(); my $fileNameIn = ''; my $fileNameOut = ''; $fileNameIn = shift if ($#ARGV >= 0); $fileNameOut = shift if ($#ARGV >= 0); printUsage() if ($#ARGV >= 0); ## take care of things we need from user that were not ## supplied on command line if ($fileNameIn eq '') { my $notDone = 9; #limit for how many times we will ask while ($notDone) { printf("GDS2 file to read: "); $fileNameIn = ; chomp $fileNameIn; $notDone = 0 if ($fileNameIn ne ''); } printUsage() if ($fileNameIn eq ''); } if ($fileNameOut eq '') { my $notDone = 9; #limit for how many times we will ask while ($notDone) { printf("GDS2 file to create: "); $fileNameOut = ; chomp $fileNameOut; $notDone = 0 if ($fileNameOut ne ''); } printUsage() if ($fileNameOut eq ''); } if ($fileNameIn eq $fileNameOut) { print "ERROR: *** input and output files can not be the same."; print " For safety this program does not support edit-in-place."; printUsage(); } ############################################################################### ######## OK we are finally ready to go to work... :-) my $gds2FileIn = new GDS2(-fileName => $fileNameIn); my $gds2FileOut = new GDS2(-fileName => ">$fileNameOut"); my $fileSize = (stat $fileNameIn)[7]; my $G_percentDone = 0; printf STDERR " 0%% done-",$G_percentDone; my $cnt=0; my @spinner=('-','\\','|','/'); my $spinCnt=0; my $numConverted=0; while (my $record = $gds2FileIn -> readGds2Record()) { if ($gds2FileIn -> isPath) { # ::= PATH [ELFLAGS] [PLEX] LAYER DATATYPE [PATHTYPE] # # [WIDTH] [BGNEXTN] [ENDEXTN] [XY] # my @records=(); my $layer = 0; my $dataType = 0; my $pathType = 0; my $width = 0; my $bgnExtn = 0; ## type 4 PATHS my $endExtn = 0; ## type 4 PATHS my @xyArray=(); until ($gds2FileIn -> isEndel) { $layer = $gds2FileIn -> returnLayer if ($gds2FileIn -> isLayer); $dataType = $gds2FileIn -> returnDatatype if ($gds2FileIn -> isDatatype); $pathType = $gds2FileIn -> returnPathtype if ($gds2FileIn -> isPathtype); $width = $gds2FileIn -> returnWidth if ($gds2FileIn -> isWidth); @xyArray = $gds2FileIn -> returnXyAsArray(-asInteger => 1) if ($gds2FileIn -> isXy); if ($convertType4Paths) { $bgnExtn = $gds2FileIn -> returnBgnextn if ($gds2FileIn -> isBgnextn); $endExtn = $gds2FileIn -> returnEndextn if ($gds2FileIn -> isEndextn); } $record = $gds2FileIn -> readGds2Record(); } $numConverted++ if ($bgnExtn || $endExtn); $gds2FileOut -> printPath( -layer => $layer, -dataType => $dataType, -pathType => 0,#TODO -width => $width, -bgnExtn => $bgnExtn, -endExtn => $endExtn, -xyInt => \@xyArray, ); } else { $gds2FileOut -> printGds2Record(-type=>'record',-data=>$record); } if ((++$cnt % 150) == 0) { $spinCnt++; $G_percentDone = int($gds2FileIn -> tellSize * 100 / $fileSize); printf STDERR "\b\b\b\b\b\b\b\b\b\b%3s%% done%s",$G_percentDone,$spinner[$spinCnt % 4]; } } printf STDERR "\b\b\b\b\b\b\b\b\b\bDONE. Converted $numConverted path%s.\n",$numConverted==1?'':'s'; ## subroutines... ################################################################################ sub printVersion() { print $main::VERSION; exit 1; } ################################################################################ sub printUsage() { print <