#!/usr/pkg/bin/perl
use strict;
use GDS2;
require "../Perl_GDSII_Tutorial/code/arc.pm";

my($VERSION);
$VERSION = "2021-08-27 01:33" ; # written by emacs time-stamp
## $VERSION .= ' UTC';
my %HASH;

sub vert {
    my ($args)    = @_;
    my $length    = $args -> { -length };
    my $width     = $args -> { -width };
    my $layer	  = $args -> { -layer };
    my $gds2File  = $args -> { -gds2File };

    my $name = sprintf("L%05.3f-W%05.3f-L%02d", $length, $width, $layer);

    if ($HASH{$name}) { return $name ;}
    $HASH{$name}++;   # avoid duplication
    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printBoundary(
	-xy => [ -$width/2, -$length/2,
		  $width/2, -$length/2,
		  $width/2,  $length/2,
		 -$width/2,  $length/2,],
	...$layer);
    $gds2File -> printEndstr();
    return $name ;
}
# ---------------------------------------------------------
#   M A I N 
# ---------------------------------------------------------
sub main  {
my $filename = $0;
   $filename =~ s/\.txt$//;
   $filename .= '.gds';

my $gds2File = new GDS2(-fileName => '>'. $filename);
$gds2File -> printInitLib (-name => 'libname');

my @NAMES;
foreach my $layer (1 .. 20) {
    my $name =  vert ({-layer => $layer, -length => 5000, -width => 64, -gds2File => $gds2File});
    push(@NAMES, $name);
}

my $columns = 16;
my $span    = $columns *  96;

$gds2File -> printBgnstr (-name => 'top');
foreach my $layer ( 0 .. 19) {
    $gds2File -> printSref ( -name => $NAMES[$layer], 
			     -xy => [  64 * $layer * 2, 0]);
}
$gds2File -> printEndstr ();
$gds2File -> printEndlib ();
}

main();
__END__

See perldoc GDS2 for help

perl DrieCondPerl
; please note I have copy in ~/.emacs-sub/time-stamp-setup.el
(require 'time-stamp)
(add-hook 'write-file-hooks 'time-stamp)
(setq time-stamp-active t)
;; (setq time-stamp-time-zone "UTC")
(setq time-stamp-time-zone nil)
(setq time-stamp-format "%04y-%02m-%02d %02H:%02M");
(setq time-stamp-start "$VERSION = \"") ;
(setq time-stamp-end "\"") ;
(setq time-stamp-line-limit 20) ; ; default is 8
