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

my $VERSION = "2026-04-27 06:51";
   $VERSION =~ s/ /-/;
   $VERSION =~ s/:/./;

package vernier;
# horizontal bar
my %HASH;
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);
    if ($HASH{$name}++) { return $name;}

    $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 Frame_4x3 {
    my ($args)		= @_;
    my ($frame_sizeX)	= $args -> {-frame_sizeX};
    my ($frame_sizeY)	= $args -> {-frame_sizeY};
    my ($width)		= $args -> {-width};
    my ($gds2File)	= $args -> {-gds2File};

    
    my $W		= $width;
    my $FX		= $frame_sizeX;
    my $FY		= $frame_sizeY;
    my ($name)		= sprintf("Frame_X%2.1f-Y%2.1f", $FX, $FY);

    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printBoundary(
	-xy => [ -$FX/2,         -$FY/2,
		  $FX/2,         -$FY/2,
		  $FX/2,          $FY/2,
		 -$FX/2,          $FY/2,
		 -$FX/2,         -$FY/2 + $W/2,
		 -$FX/2 + $W/2,  -$FY/2 + $W/2,
		 -$FX/2 + $W/2,   $FY/2 - $W/2,
		  $FX/2 - $W/2,   $FY/2 - $W/2,
		  $FX/2 - $W/2,  -$FY/2 + $W/2,
		  $FX/2 - $W/2,  -$FY/2 + $W/2,
		 -$FX/2	      ,  -$FY/2 + $W/2,
	]);
    $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);
    if ($HASH{$name}++) { return $name;}

    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printAref(
	-name => $unit,
	-columns => 1,
	-rows => 15,
	-xy => [ 0, -$span/2,
		 0,  $span/2,
		 0,  $span/2 ]
	);
    if ($label) {
	foreach my $i ( -4 .. 4) {
	    if ($text_size eq 'small') {
		text2gds::text_flat( -0.8, $i * 0.27 - 0.1,  2, 0.03, sprintf("%3d", $i * 5), $gds2File);
	    } elsif ($text_size eq 'large') {
		text2gds::text_flat(  -10, $i * 3.9  + 0.05, 2, 0.3,  sprintf("%4.1f",$i/2), $gds2File);
	    } else {
	}
    }
    }
    $gds2File -> printEndstr();
#	print STDERR  __LINE__ . ' ' . $name. "\n";
    return $name;
}
sub set_oneside {
    my ($args)		= @_;
    my ($unit01)	= $args -> {-unit01};
    my ($unit02)	= $args -> {-unit02};

    my ($span)		= $args -> {-span};
    my ($width)		= $args -> {-width};

    my ($count)		= $args -> {-count};
    my ($delta)		= $args -> {-delta};

    my ($label)		= $args -> {-label};
    my ($text_size)	= $args -> {-text_size};
    my ($gds2File)	= $args -> {-gds2File};

    my ($name)		= sprintf("set_oneside%2.2f-10x-%s", $span, $unit01);
    if ($HASH{$name}++) { return $name;}
    
    
    $gds2File -> printBgnstr(-name => $name);

    my $bottomC  =    int($count/2) + 1 ;
    my $topC     =    int($count/2) + 1 ;

    my $bottom  =  - $bottomC  * ( ($width ) * 2 + $delta  ) ;
    my $top     =    $topC     *   ($width ) * 2 + $delta ;
    my $oneStep =    ($width + $delta ) * 2;

    foreach my $i ( - $bottomC .. $topC ) {
	$gds2File -> printSref(
	    -name => $unit01,
	    -xy => [ -0.15, $i * ($width) * 2 ]
	    );
	$gds2File -> printSref(
	    -name => $unit02,
	    -xy => [ +0.15,   $i * $width  * 2 + $delta * $i ]
	    );
    }
    if ($label) {
	foreach my $i ( - $bottomC .. $topC ) {
	    if ($text_size eq 'small') {
		text2gds::text_flat( -0.5, $i * 0.2,         2, 0.015, sprintf("%3d", $i * 5), $gds2File);
	    } elsif ($text_size eq 'large') {
		text2gds::text_flat(  -10, $i * 0.2  + 0.05, 2, 0.015,  sprintf("%4.1f",$i/2), $gds2File);
	    } else {
	}
    }
    }

    $gds2File -> printEndstr();
#	print STDERR  __LINE__ . ' ' . $name. "\n";
    return $name;
}


# --------------------------------------------------------------------
# (8 - 7.8) / 20 = 0.01
sub small_seg  {
    my ($args)		= @_;
    my ($L)		= $args -> {-L};
    my ($W)		= $args -> {-W};
#    my ($span)		= $args -> {-span};
#    my ($spanS)		= $args -> {-spanS};
    my ($count)		= $args -> {-count};   # number of shapes from the center
    my ($gds2File)	= $args -> {-gds2File};

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

    my $span  = ($W * 2) * $count        * 4;
    my $spanS = ($W * 2) * $count * 0.9  * 4;
    my $small_set =   set_oneside({ -unit01 => $small01, -unit02 => $small02, -span => $span, -width => 0.1,  -count => 13,
					-delta    => 0.005, -label => 1,
					-gds2File => $gds2File, -text_size =>'small'});

#    my $small_set19 = set_oneside({ -unit01 => $small03, -unit02 => $small04, -span => $spanS, -width => 0.1, -count => 13,
#					-delta    => 0, -label => 1,
#					-gds2File => $gds2File, -text_size =>'small'});


$gds2File -> printBgnstr(-name => 'small_seg');
$gds2File -> printSref(-name => $small_set,   -xy => [  0.15,    0]);
#$gds2File -> printSref(-name => $small_set19, -xy => [ -0.15,   -0.0033]);
	foreach my $i ( -($count + 1) .. $count) {
#		text2gds::text_flat( -0.8,  $i * 0.3 - 0.15, 2, 0.02,  sprintf("%2d",$ i * 5), $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 small_set {

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

    my $smallspan = 2.5; my $VHrate = 0.5;    

    small_seg ({-L => 0.3, -W => 0.1, -span => 8, -spanS => 7.8, -count => 5, -gds2File => $gds2File });
    $gds2File -> printBgnstr(-name => 'small_set');
    

    $gds2File -> printSref(-name => 'small_seg' ,  -xy => [  -$smallspan,                    0 ], -angle =>     0);
    $gds2File -> printSref(-name => 'small_seg' ,  -xy => [   $smallspan,                    0 ], -angle =>   180);
    $gds2File -> printSref(-name => 'small_seg' ,  -xy => [   0,           $smallspan * $VHrate], -angle =>   -90);
    $gds2File -> printSref(-name => 'small_seg' ,  -xy => [   0,          -$smallspan * $VHrate], -angle =>  -270);

    my $seg = 0.2;
$gds2File -> printBoundary ( -xy => [0,0,   -$seg, 0, -$seg,  $seg,  0,  $seg]);
$gds2File -> printBoundary ( -xy => [0,0,    $seg, 0,  $seg, -$seg,  0, -$seg]);
    
   
    $gds2File -> printEndstr();
}
sub vernierx3 {
# --------------------------------------------------------------------
    my ($args)		= @_;
    my ($smallFrame)	= $args -> {-smallFrame};
    my ($bigFrame)	= $args -> {-bigFrame};
    my ($gds2File)	= $args -> {-gds2File};


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

    $gds2File -> printBgnstr(-name => 'vernierx3');
    my $smallspan = 3; my $VHrate = 0.8;


    $gds2File -> printSref(-name => 'small_set' ,  -xy => [ 0, 0]);

    $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 =>   $bigFrame, -xy => [0,0]);
    $gds2File -> printSref(-name => $smallFrame, -xy => [0,0]);

#$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
