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

my($VERSION);
$VERSION = "2023-01-06 06:36" ; # written by emacs time-stamp
$VERSION =~ s/ /-/;
$VERSION =~ s/:/./;
## $VERSION .= ' UTC';
my %HASH;
sub scribeCorner {                                                        
    my ($args) = @_;
    my ($E   ) =  $args -> {-E};        #
    my ($L   ) =  $args -> {-L};        #
    my ($W   ) =  $args -> {-W};        # 
    my ($G   ) =  $args -> {-G};        # gap
    my ($gds2File   ) =  $args -> {-gds2File};  # gap
    
    my $name = 'Corner';
    $gds2File -> printBgnstr ( -name => $name);
    $gds2File -> printBoundary
        ( -xy => [ $G/2,      $G/2,  $G/2 + $E, $G/2, $G/2 + $E, $G/2 + $W, , 
                   $G/2 + $W, $G/2 +$W, 
                   $G/2 + $W, $G/2 +$L, 
                   $G/2     , $G/2 +$L, ]);
    $gds2File -> printEndstr ();
    return $name;
}

sub array {
    my ($args)    = @_;
    my $pitch     = $args -> { -pitch };
    my $width     = $args -> { -width };
    my $span      = $args -> { -span };
    my $ratio      = $args -> { -ratio };
#   my $unit      = $args -> { -unit };
    my $length    = $args -> { -length };
    my $unit       = sprintf("L%3.1fmm-W%03d", $length/1000, $width * 1000);

    my $gds2File  = $args -> { -gds2File };
    my $name = sprintf("P%3.2f-R%02d-%s", $pitch, $ratio, $unit);
#    if ($HASH{$name}) { print STDERR $name,"\n"; return $name ;}
    $HASH{$name}++;
    $gds2File -> printBgnstr(-name => $name);

    my $columns  = int ($span/ $pitch);
    my $realSpan  = $columns * $pitch;
    $gds2File -> printAref(
	-name => $unit,
	-columns => $columns,
	-row     =>  1,
	-xy => [
	     -$realSpan/2, 0,
	      $realSpan/2, 0,
	      0, 0
	]
	);
    my $label = sprintf("%4.2f 1:%d", $width, $ratio);
    my $text_layer = 0;
    text2gds::text_flat( 0,   $length/2 + 5, $text_layer, 0.4,   $label, $gds2File);
    text2gds::text_flat( 0, - $length/2 - 5, $text_layer, 0.4,   $label, $gds2File);
    text2gds::text_flat( 0, - $length/2 - 50, $text_layer, 3.2,   $label, $gds2File);
    $gds2File -> printEndstr();
    return $name ;
}
sub vert_rect {
    my ($args)    = @_;
    my $length    = $args -> { -length };
    my $width     = $args -> { -width };
    my $gds2File  = $args -> { -gds2File };

    my $name = sprintf("L%3.1fmm-W%03d", $length/1000, $width * 1000);
    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,]);
		 
    $gds2File -> printEndstr();
    return $name ;
}
# ---------------------------------------------------------
#   M A I N 
# ---------------------------------------------------------
sub main  {
my $filename = $0;
   $filename =~ s/\.txt$//;
   $filename .= '-'.$VERSION ;
   $filename .= '.gds';

print $filename,"\n";

my $gds2File = new GDS2(-fileName => '>'. $filename);
    $gds2File -> printInitLib(
        -name=>'SampleLibrary',  # can be any name
        -uUnit =>  0.00025,
        -dbUnit => 0.00025/1000000);

my @TOP;
my $maxSpan = 500;
my $length = 3000;
foreach my $ratio ( 1, 2, 5, 10) {
    foreach my $width ( qw(0.05 0.1 0.2, 1, 10, 100)){
	my $pitch = $width * $ratio * 2;
	my $span = $pitch * 20;
	if ($span > $maxSpan - 50) { $span = $maxSpan - 50;}
	my $unit = 
	    vert_rect ({-length => $length, -width => $width, -gds2File => $gds2File});

	push (@TOP,
	      array ({     -unit => $unit,
			   -span => $span,
			   -pitch => $pitch,
			   -width => $width,
			   -length => $length,
			   -ratio => $ratio,
			   -gds2File => $gds2File})
	    );
    }
}
#   push (@TOP,
#    vert_rect ({-length => $length, -width => 50, -gds2File => $gds2File})
#    );
    my $corner = 
    scribeCorner ({ -L => 200, -W => 20, -G => 110, -E => 100, -gds2File => $gds2File});

my $spacing = $maxSpan;
my $shift  = $#TOP * $spacing / 2;

$gds2File -> printBgnstr (-name => 'box');
$gds2File -> printBoundary ( -xy => [ -200, -50, 200, -50, 200, 50, -200, 50]);
$gds2File -> printEndstr ();

$gds2File -> printBgnstr (-name => 'top');
foreach my $i (0..$#TOP) {
    $gds2File -> printSref( -name => $TOP[$i], -xy => [ $spacing * $i - $shift, 0]);
}
    my $text_layer = 0;
    text2gds::text_flat( 0, -1600, $text_layer, 4.8,   $VERSION, $gds2File);

my $D = 10000;
    $gds2File -> printSref ( -name => $corner, -xy => [-$D, -$D], -reflect => '0');
    $gds2File -> printSref ( -name => $corner, -xy => [-$D,  $D], -reflect => '1');
    $gds2File -> printSref ( -name => $corner, -xy => [ $D, -$D], -reflect => '1', -angle => 180);
    $gds2File -> printSref ( -name => $corner, -xy => [ $D,  $D], -reflect => '0', -angle => 180);

    $gds2File -> printSref ( -name => 'box',   -xy => [ $D - 300,  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") ;; office
(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
