#!/usr/pkg/bin/perl
use strict;
use warnings;
use GDS2;

my $VERSION = "2025-05-27 16:05";
   $VERSION =~ s/ /-/;
   $VERSION =~ s/:/./;

package vernier;
# horizontal bar
sub bar {
    my ($args)		= @_;
    my ($W)		= $args -> {-W};
    my ($L)		= $args -> {-L};
    my ($layer)		= $args -> {-layer};
    my ($gds2File)	= $args -> {-gds2File};

    my ($name)		= sprintf("bar-H%3.1f-W%3.1f-L%02d", $L, $W, $layer);
    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printBoundary(
	-xy => [ -$L/2, -$W/2,  $L/2, -$W/2, $L/2, $W/2, -$L/2, $W/2, ],
	-layer => $layer,
	);
    $gds2File -> printEndstr();
    return $name;

}

sub lines_20x{
    my ($args)		= @_;
    my ($unit)		= $args -> {-unit};
    my ($span)		= $args -> {-span};
    my ($label)		= $args -> {-label};
    my ($gds2File)	= $args -> {-gds2File};

    my ($name)		= sprintf("lines_10x-%s", $unit);

    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printAref(
	-name => $unit,
	-columns => 20,
	-xy => [ -$span/2, 0, $span/2, 0, $span/2, 0, ]
	);
    if ($label) {
	foreach my $i ( -9 .. 9) {
	    #text2gds::text_flat( $i * 0.39 + 0.05, -0.8, 2, 0.04, $i, $gds2File);
	    my $n = abs($i * 10);
	    $gds2File -> printSref(-name => sprintf("text_%02d", $n),
				   -xy   => [$i * 0.39 + 0.05, -0.8,],
		                   -angle => 90,
		);
	}
    }
    $gds2File -> printEndstr();
    return $name;
}
sub set_20x{
    my ($args)		= @_;
    my ($unit)		= $args -> {-unit};
    my ($span)		= $args -> {-span};
    my ($label)		= $args -> {-label};
    my ($text_size)	= $args -> {-text_size};
    my ($gds2File)	= $args -> {-gds2File};

    my ($name)		= sprintf("set_S%2.2f-10x-%s", $span, $unit);

    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printAref(
	-name => $unit,
	-columns => 1,
	-rows => 20,
	-xy => [ 0, -$span/2,
		 0,  $span/2,
		 0,  $span/2 ]
	);
    if ($label) {
	foreach my $i ( -9 .. 9) {
	    if ($text_size eq 'small') {
		text2gds::text_flat( -1.0, $i * 0.39 - 0.1, 2, 0.04, sprintf("%3d",$i*10), $gds2File);
	    } elsif ($text_size eq 'large') {
		text2gds::text_flat(  -10, $i * 3.9  + 0.05, 2, 0.4,  sprintf("%4.1f",$i/2), $gds2File);
	    } else {
	}
    }
    }
    $gds2File -> printEndstr();
#	print STDERR  __LINE__ . ' ' . $name. "\n";
    return $name;
}



# --------------------------------------------------------------------
# (8 - 7.8) / 20 = 0.01
sub small_set  {
    my ($args)		= @_;
    my ($gds2File)	= $args -> {-gds2File};

my $small01    = bar({-L => 1,  -W => 0.2,  -layer => 1, -gds2File => $gds2File});
my $small02    = bar({-L => 1,  -W => 0.2,  -layer => 2, -gds2File => $gds2File});

my $small_set =     set_20x ({ -unit => $small01,  -span => 8,   -gds2File => $gds2File, -text_size =>'small'});
my $small_set19 =   set_20x ({ -unit => $small02,  -span => 7.8, -gds2File => $gds2File, -text_size =>'small'});


$gds2File -> printBgnstr(-name => 'small');
$gds2File -> printSref(-name => $small_set,   -xy => [  0.5,  0]);
$gds2File -> printSref(-name => $small_set19, -xy => [ -0.5,  0]);
	foreach my $i ( -10 .. 9) {
		text2gds::text_flat( -1.7,   $i * 0.38, 2, 0.04,  sprintf("%2d",$i*10), $gds2File);
	}
$gds2File -> printEndstr();
    return 'small';
}
sub medium_set  {
    my ($args)		= @_;
    my ($gds2File)	= $args -> {-gds2File};

my $medium01    = bar({-L => 5, -W => 1 , -layer => 1, -gds2File => $gds2File});
my $medium02    = bar({-L => 5, -W => 1,  -layer => 2, -gds2File => $gds2File});


# (40 - 39 ) 20 = 0.05
my $medium_set =   set_20x ({ -unit => $medium01,  -span => 40, -gds2File => $gds2File, -text_size =>'medium'});
my $medium_set19 = set_20x ({ -unit => $medium02,  -span => 39, -gds2File => $gds2File, -text_size =>'medium'});

$gds2File -> printBgnstr(-name => 'medium');
$gds2File -> printSref(-name => $medium_set,   -xy => [ 2.5,  0]);
$gds2File -> printSref(-name => $medium_set19, -xy => [-2.5,  0]);
	foreach my $i ( -10 .. 9) {
		text2gds::text_flat( -6.5,   $i * 1.95, 2, 0.1,  sprintf("%4.2f",$i/20), $gds2File);
	}
$gds2File -> printEndstr();
}

sub large_set {
# --------------------------------------------------------------------
    my ($args)		= @_;
    my ($gds2File)	= $args -> {-gds2File};

# (200 - 190 )/20 = 0.5
my $large01    = bar({-L => 20, -W => 4 ,   -layer => 1, -gds2File => $gds2File});
my $large02    = bar({-L => 20, -W => 4 ,   -layer => 2, -gds2File => $gds2File});

my $large_set   = set_20x ({ -unit => $large01,  -span => 200, -gds2File => $gds2File, -text_size =>'large'});
my $large_set19 = set_20x ({ -unit => $large02,  -span => 190, -gds2File => $gds2File, -text_size =>'large'});

$gds2File -> printBgnstr(-name => 'large');
$gds2File -> printSref(-name => $large_set,   -xy => [ 10,  0]);
$gds2File -> printSref(-name => $large_set19, -xy => [-10,  0]);

	foreach my $i ( -10 .. 9) {
		text2gds::text_flat(  -26, $i * 9.5  + 0.05, 2, 0.4,  sprintf("%4.1f",$i/2), $gds2File);
	}
$gds2File -> printEndstr();
}
# --------------------------------------------------------------------

sub vernierx3 {
# --------------------------------------------------------------------
    my ($args)		= @_;
    my ($gds2File)	= $args -> {-gds2File};

small_set ({-gds2File => $gds2File });
medium_set ({-gds2File => $gds2File });
large_set  ({-gds2File => $gds2File });

    $gds2File -> printBgnstr(-name => 'vernierx3');

    $gds2File -> printSref(-name => 'small' ,  -xy => [  -10,   0 ], -angle =>   0);
    $gds2File -> printSref(-name => 'small' ,  -xy => [   0,  -10 ], -angle =>  -90);

    $gds2File -> printSref(-name => 'small' ,  -xy => [   10,   0 ], -angle =>   180);
    $gds2File -> printSref(-name => 'small' ,  -xy => [   0,   10 ], -angle =>    90);

    $gds2File -> printSref(-name => 'medium',  -xy => [  -40,   0 ], -angle =>   0);
    $gds2File -> printSref(-name => 'medium',  -xy => [   0,  -40], -angle =>  -90);

    $gds2File -> printSref(-name => 'medium',  -xy => [  40,   0 ], -angle =>   180);
    $gds2File -> printSref(-name => 'medium',  -xy => [   0,  40 ], -angle =>    90);

    $gds2File -> printSref(-name => 'large',   -xy => [ -150,   0 ], -angle =>   0);
    $gds2File -> printSref(-name => 'large',   -xy => [   10, -150 ], -angle =>  -90);

    $gds2File -> printSref(-name => 'large',   -xy => [ +150,   0 ], -angle =>   180);
    $gds2File -> printSref(-name => 'large',   -xy => [   10,  150 ], -angle =>    90);

my $seg = 1;
$gds2File -> printBoundary ( -xy => [0,0,   -$seg, 0, -$seg,  $seg,  0,  $seg]);
$gds2File -> printBoundary ( -xy => [0,0,    $seg, 0,  $seg, -$seg,  0, -$seg]);

#$gds2File -> printPath ( -xy => [ -1, 0, 1,  0], -width => 0.1);
#$gds2File -> printPath ( -xy => [  0, 1, 0, -1], -width => 0.1);
    $gds2File -> printEndstr();
}
1;
__END__

; 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") ; UTC at office
(setq time-stamp-time-zone nil)
(setq time-stamp-format "%Y-%02m-%02d %02H:%02M");
(setq time-stamp-start "$VERSION = \"") ;
(setq time-stamp-end "\"") ;
(setq time-stamp-line-limit 20) ; ; default is 8
