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

my($VERSION);
$VERSION = "2026-04-04 10:56" ; # written by emacs time-stamp
## $VERSION .= ' UTC';
$VERSION =~ s/ /-/g;
$VERSION =~ s/:/./g;
 
push(@INC, '.');
# new one, text_flat_r, for rotated cw90, 
push(@INC, '../Perl_GDSII_Tutorial/code');
require "text2gds.pm";

sub Lshape  {
    my ($args)	   = @_;
    my ($W)	   = $args -> { -width };
    my ($L)        = $args -> { -length };
    my ($gap)      = $args -> { -gap };
    my ($gds2File) = $args -> { -gds2File };

    my $name	   = sprintf("W%2.2fxL%2.1fum-g%03.1f", $W, $L, $gap);
    $gds2File -> printBgnstr( -name=> $name);		# --- Start new structure
    $gds2File -> printBoundary( -xy => [
				 $gap/2,       $gap/2,
				 $gap/2 + $L,  $gap/2,
				 $gap/2 + $L,  $gap/2 + $W,
				 $gap/2 + $W,  $gap/2 + $W,
				 $gap/2 + $W,  $gap/2 + $L,
				 $gap/2     ,  $gap/2 + $L,

				]);
    $gds2File -> printEndstr();				# --- End of this new structure
    return $name;					#  呼出元に、名前を返します	 (渡します)
}

sub LshapeSet {    
    my ($args)	   = @_;
    my $W	   = $args -> { -W };
    my $L	   = $args -> { -L };
    my $G	   = $args -> { -G };  # gap
    my $N	   = $args -> { -N };  # number of one angle
    my $gds2File   = $args -> { -gds2File };

    my $name	   = sprintf("L-%dxL%02d-W%2.2f-G%2.f", $N, $L, $W, $G);

    my @CONF = (
	         # W        L                                G
		 [$W      , $L + $W * $G * 4,                       $G     ],
	         [$W 	  , $L + $W * $G * 2	      ,       $W  + $G * 2 + 0.7 * $W ],
		 [$W * 0.7, $L + $W * $G     + 0.7 * 3,       $W  + $G * 4 ],
		 [$W * 0.7, $L               + 0.7 * 3,       $W  + $G * 6 ],

	);

    my @LIST;
    foreach my $index (0..$N - 1) {
	push(@LIST,
	Lshape ({
	    -width  => $CONF[$index] -> [0],
	    -length => $CONF[$index] -> [1],
	    -gap    => $CONF[$index] -> [2],
	     -gds2File => $gds2File})
	    );
    }

    $gds2File -> printBgnstr( -name => $name);
        foreach my $index (0..$#LIST) {
	    $gds2File -> printSref  ( -name => $LIST[$index],
				      -xy   => [0, 0]);
	}
    $gds2File -> printEndstr();
    return $name;
}
sub LocalMark {
    my ($args) 		= @_;
    my $W	   = $args -> { -W };
    my $L	   = $args -> { -L };
    my $G	   = $args -> { -G };  # gap
    my $N	   = $args -> { -N };  # number of one angle

    my $gds2File	= $args -> {-gds2File};

    my @LIST;
my $corner = 
    LshapeSet ({ -W => $W, -L => $L, -G => $G, -N=> $N, -gds2File => $gds2File});
    push(@LIST, $corner);
                                    my $markName = sprintf("%dxL%02d-W%2.2f-G%02.1f", $N, $L, $W, $G);
    $gds2File -> printBgnstr( -name => $markName);
    foreach my $i (0..3){
	$gds2File -> printSref  ( -name => $corner, -xy => [0,0], -angle => $i * 90);
	    }
    #                           x           y layer dotsize
    text2gds::text_flat(        0 , - $L - 15, 10, 0.3, $markName, $gds2File);
    $gds2File -> printEndstr();
    return $markName;
}


## --------------------------------------------
##	    M A I N  R O U T I N E 
## --------------------------------------------
sub main () {

    my $filename = $0;					# ---  set filename with the same as this script
       $filename =~ s/\.txt$//;				# ---  Strip '.txt' part
							#      単に dot(.) と書くと、「何でも文字一つ」にー致するので、
							#      「本当に . の文字」の意味で \. としています
							#      $ は行末を意味します
    $filename .=  '-'. $VERSION;			#  modify outpu name with time stamp (of this file)
    $filename .= '.gds';				# ---  Add '.gds' to (output) filename

    
    print $filename,"\n";
    my $gds2File = new GDS2(-fileName=> '>'. $filename);

    $gds2File -> printInitLib(
	-name=>'Sample Implementation',  # can be any name
	-uUnit =>  0.001,
        -dbUnit => 0.001/1000000);
    my @MARKS;
    my @CONFIG = (
#        W     L    G  count/corner
	[1,   26,   2,  4],
	[0.5, 10,  1.5, 2],
	[0.3,  5,  0.5, 2],
	);
    foreach my $index (0..$#CONFIG) {
	my $W = $CONFIG[$index] -> [0];
	my $L = $CONFIG[$index] -> [1];
	my $G = $CONFIG[$index] -> [2];
	my $N = $CONFIG[$index] -> [3];
	push(@MARKS,
	LocalMark ({ -W => $W, -L => $L, -G => $G, -N=> $N, -gds2File => $gds2File})
	    );
    }
    $gds2File -> printBgnstr ( -name => 'sample');
      foreach my $index (0..$#MARKS) {
	  $gds2File -> printSref ( -name => $MARKS[$index], -xy => [0, 70 * $index]);
      }
    $gds2File -> printEndstr ();
    $gds2File -> printEndlib();
}
## --------------------------------------------
##     E N D  O F   M A I N  R O U T I N E 
## --------------------------------------------

main();
__END__

See perldoc GDS2 for help

; 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
