use strict;
use GDS2;
use strict;
use Getopt::Std;
use Math::Trig;

require './MaskArea.pm';
require "../p5_gdsii/pm/text2gds.pm";

package round_track;
my($VERSION);
$VERSION = "2026-06-17 05:46" ; # written by emacs time-stamp
## $VERSION .= ' UTC';
my $PI = 3.1415926535;
# -----------------------------------------------------------------

use POSIX qw(floor ceil);

sub arc($$ $$ $$$){
    my ($x)		= shift; # center coordinate x
    my ($y)		= shift; # center coordinate y

    my ($start_angle)	= shift; # in degree, counter clockwise,
    my ($end_angle)	= shift; # in degree, counter clockwise

    my ($radius)	= shift; # in micron
    my ($polygon_count)	= shift; # default 12;

    my ($direction)	= shift; # 0 counter clockwise, 1 clockwise

    if ($polygon_count eq '') { $polygon_count = 12;}
    my ($gds2File)	= shift;

    my (@PTR);
    if ($end_angle < $start_angle ) {
	my $t = $end_angle;
	$end_angle = $start_angle;
	$start_angle = $t;
	$direction = 1 - $direction; # toggle in this case
    }
    if ($end_angle == $start_angle) { $start_angle = 0; $end_angle = 360;}
    my ($step)		= 
    ($end_angle - $start_angle)/$polygon_count;
    my ($count)		= ceil((abs($end_angle - $start_angle))/$step);

    my (@seq);
#    if ($start_angle > $end_angle)  { @seq = reverse (0 .. $count);}
#    else 			    { @seq =          0 .. $count; }
#    print $count,"\n";
    foreach my $i (0 .. $count ){
	my $radian = ($start_angle + $i * $step) * $PI/180;
	push(@PTR, [
	     $x + $radius * cos($radian),
	     $y + $radius * sin($radian)]);
    }
    if ($direction){ @PTR = reverse @PTR ;}
    my @COORDS;
    foreach my $i (0 .. $count){    
	push(@COORDS, ($PTR[$i]->[0],
	               $PTR[$i]->[1] ) );
    }
    return @COORDS
}
1;
# -----------------------------------------------------------------	


#  argument for arc subroutine

#     my ($x)		= shift; # center coordinate x
#     my ($y)		= shift; # center coordinate y
# 
#     my ($start_angle)	= shift; # in degree, counter clockwise,
#     my ($end_angle)	= shift; # in degree, counter clockwise
# 
#     my ($radius)	= shift; # in micron
#     my ($polygon_count)	= shift; # default 12;
# 
#     my ($direction)	= shift; # 0 counter clockwise, 1 clockwise
# 
#     if ($polygon_count eq '') { $polygon_count = 12;}
#     my ($gds2File)	= shift;

sub segment_block($$$$$ $$$ $$) {
    my $start	= shift;
    my $end	= shift;
    my $diameter= shift;
    my $width	= shift;
    my $rate    = shift;

    my $L10     = shift;
    my $box_layer = shift;
    my $frame    = shift; 
    my $text_layer = shift;

    my $gds2File = shift;

    my $polygon  = 12;

    my $F2        =  $frame/2 * $rate;
# --------------------------------------------------
#           this format is important
# --------------------------------------------------
    $width = 0.5;  # XXXXXXXXXXXXXXXXX
    my $name	= sprintf("segment-%05.1f-%05.1f-%03.1f-%3.1f", $start, $end,
			  $diameter, $width);
#    printf("%04d %s\n ", __LINE__, $name);
    my $radius = $diameter/2 * $rate;

    $gds2File -> printBgnstr(-name => $name.'-perf');
# -----------------------------------------------
    $gds2File -> printBoundary( -xy =>
  [ 
  arc (0, 0, $start, $end, $radius + $width/2, $polygon, 1),
  arc (0, 0, $start, $end, $radius - $width/2, $polygon, 0),
  ],
  -layer => $L10
	);
   $gds2File -> printEndstr;

    # set the coords of center:
    # original coordinate origin is the center of the arch, but it should 
    # be shifted (located) in the center of the shape)

    my $angle		= ($start + $end) / 2;
    my ($x) =   $radius * cos($angle * $PI/180);
    my ($y) =   $radius * sin($angle * $PI/180);
    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printSref  (-name => $name. '-perf',
			     -xy =>[ -$x, -$y]);
    text2gds::text_flat(0, 0, $text_layer, 0.005 * $rate, sprintf("%03.1f-%03.1f",$start, $end),  $gds2File);
#   text2gds::text_flat(0.2, 0, 10, 0.005, $start,  $gds2File);
#   text2gds::text_flat(0.4, 0, 10, 0.005, $end,    $gds2File);
    $gds2File -> printBoundary(-xy => [-$F2,-$F2,
					    $F2,-$F2,
					    $F2, $F2,
					   -$F2, $F2],
				   -layer=> $box_layer);

   $gds2File -> printEndstr;
#    text2gds::text_flat( $x, $y - $radius * 2.2 - 0.1, 3, 0.005, $name, $gds2File);    
#    my($x, $y, $layer, $dotsize, $text, $gds2File) = @_;
#    print __LINE__. ' ', $name, "\n";

    return $name;
}

sub main ($$$ $$$ $) {
    my $L10      = shift;
    my $box_layer = shift;
    my $text_layer = shift;

    my $box_name    = shift;
    my $cross_name  = shift;
    my $S1234       = shift;

    my $gds2File = shift;

my $rate = 1;
my ($delta_theta) = 18;  # degree (pitch) 
my ($polygons)    = 360 / $delta_theta;
my ($DIAMETER)      = 10 ;  # micron
my ($WIDTH)       = 0.5 ;# micron

# ---------------------------------------------------------------------
my (@NAMES10);
# ---------------------------------------------------------------------
    my $box_size = 2;
foreach my $i ( 0 .. $polygons - 1 ) {
    my $start = $i * $delta_theta;
    push (@NAMES10,
	  segment_block( $start, $start + $delta_theta, $DIAMETER, $WIDTH, $rate,
			 $L10, $box_layer, $box_size, $text_layer,
			 $gds2File));}
# ---------------------------------------------------------------------

# ---------------------------------------------------------------------
 my @NAMES05;
# ---------------------------------------------------------------------
    $polygons     = 56;
    $delta_theta  = (360/ $polygons);  # degree (pitch)
    $DIAMETER     =   5 ;  # micron
    $WIDTH        = 0.5 ;# micron
    my $box_size = 0.53;
foreach my $i ( 0 .. $polygons - 1 ) {
    my $start = $i * $delta_theta;
    push (@NAMES05, segment_block( $start, $start + $delta_theta, $DIAMETER, $WIDTH, $rate, 
		    $L10, $box_layer, $box_size,$text_layer,
		    $gds2File));}
# ---------------------------------------------------------------------
 my @NAMES75;
# ---------------------------------------------------------------------
    $polygons     = 44;    # 44
    $delta_theta  = (360/ $polygons);  # degree (pitch)
    $DIAMETER     = 7.5 ;  # micron
    $WIDTH        = 0.5 ;# micron

foreach my $i ( 0 .. $polygons - 1 ) {
    my $start = int ( ($i * $delta_theta + ($delta_theta/3)) * 2 ) / 2 - 2.5;
    push (@NAMES75, segment_block( $start, $start + $delta_theta, $DIAMETER, $WIDTH, $rate, 
			 $L10, $box_layer, $box_size, $text_layer,
				   $gds2File));}
#		  print __LINE__. ' '. $#NAMES75. "\n";

# ----------------------------------------------------------------
#                         10 um
# ----------------------------------------------------------------
$gds2File -> printBgnstr(-name => 'Example_10um');  # 4 degree x 90 pcs

my $radius = 5 * $rate;
my $angle_step = 360/18;

foreach my $i (0..$#NAMES10){
    my $angle = ($i * 18 );
    my $name = $NAMES10[$i];
                        my $radian = ($angle + 9)  /180 * $PI;
    my $x = $radius * cos ($radian);
    my $y = $radius * sin ($radian);
	$gds2File -> printSref(-name => $name, -xy => [$x, $y]);
    text2gds::text_flat(-0.8,-6.2, 10, 0.05, '0.4/10um', $gds2File);
 }
$gds2File -> printEndstr;

# ----------------------------------------------------------------
#                          5 um  90/14  step
# ----------------------------------------------------------------
$gds2File -> printBgnstr(-name => 'Example_5um');   # 8 degree x 45 pcs
$radius = 2.5 * $rate;
    my $angle_step = 360/56;
    my $width = 0.5;

foreach my $i (0..$#NAMES05){
    my $angle = $i * $angle_step;
    my $start = $angle;
    my $end   = $angle + $angle_step;
    my $name = sprintf("segment-%05.1f-%05.1f-5.0-%2.1f", $start, $end, $width);
                        my $radian = ($angle + $angle_step/2) / 180  * $PI;
    my $x = $radius * cos ($radian);
    my $y = $radius * sin ($radian);
	$gds2File -> printSref(-name => $name, -xy => [$x, $y]);
    text2gds::text_flat(-0.8,-6.2, 10, 0.05, '0.4/5um', $gds2File);
 }
$gds2File -> printEndstr;
# ----------------------------------------------------------------
#                          7.5 um
# ----------------------------------------------------------------
$gds2File -> printBgnstr(-name => 'Example_7.5um');   # 7.5 degree x 48 pcs
$radius = 3.75 * $rate;

foreach my $i (0..43){
    my $angle_step = 360/44;
    my $angle = $i * $angle_step;
    my $start = $angle;
    my $end   = $angle + $angle_step;
    my $name = sprintf("segment-%05.1f-%05.1f-7.5-%2.1f", $start, $end, $width);
       $name = $NAMES75[$i];
	my $radian = ($angle + 3.75) /180 * $PI;
	my $x = $radius * cos ($radian);
	my $y = $radius * sin ($radian);
	$gds2File -> printSref(-name => $name, -xy => [$x, $y]);
		  }
	text2gds::text_flat(-0.8,-6.2, 10, 0.05, '0.4/7.5um', $gds2File);

$gds2File -> printEndstr;
# ----------------------------------------------------------------


# get the coordinate to place
 my $pitch = 27;
my @COORDS = MaskArea::MaskArea($pitch, 1);
		  
$gds2File -> printBgnstr(-name => 'CP_Area_11_round-track-10');
my $i = 0;
foreach my $i ( 0..$#NAMES10){
            my $H = $COORDS[$i + 1 ] -> [0];
            my $W = $COORDS[$i + 1 ] -> [1];
#           print __LINE__ . ' ' . ($LIST[$i]) . 'H: ', $H, ' W:', $W, "\n";
            $gds2File -> printSref(
                -name => $NAMES10[$i],
                -xy   => [$H, $W],
                );
            $i++;
   }
    $gds2File -> printSref( -name =>$box_name,   -xy =>[0,0 ]);
    $gds2File -> printSref( -name =>$cross_name, -xy =>[0,0 ]);
    $gds2File -> printSref( -name => $S1234,      -xy =>[10.75,10.75 ]);

$gds2File -> printEndstr;

$gds2File -> printBgnstr(-name => 'CP_Area_12_round-track-05-75');

foreach my $i ( 0..$#NAMES05){
            my $H = $COORDS[$i + 1 ] -> [0];
            my $W = $COORDS[$i + 1 ] -> [1];
#           print __LINE__ . ' ' . ($LIST[$i]) . 'H: ', $H, ' W:', $W, "\n";
            $gds2File -> printSref(
                -name => $NAMES05[$i],
                -xy   => [$H, $W],
                );
   }


my $j = 0;
    my $start =          $#NAMES05 + 1;
    my $end   = $start + $#NAMES75;
foreach my $i ( $start.. $end) {
            my $H = $COORDS[$i + 1 ] -> [0];
            my $W = $COORDS[$i + 1 ] -> [1];
#           print __LINE__ . ' ' . ($LIST[$i]) . 'H: ', $H, ' W:', $W, "\n";
            $gds2File -> printSref(
                -name => $NAMES75[$j++],
                -xy   => [$H, $W],
                );
   }
    $gds2File -> printSref( -name =>$box_name,   -xy =>[0,0 ]);
    $gds2File -> printSref( -name =>$cross_name, -xy =>[0,0 ]);
    $gds2File -> printSref( -name => $S1234,      -xy =>[10.75,10.75 ]);

$gds2File -> printEndstr;

}
1;
__END__

面積比(開口比) は 25% とのことです。

0.8um x 0.8um x 0.25 = 0.16 um^2

幅 0.4um の round track を作るとして、その面積の場合の長さは

(およそ)
0.16/0.4 -> 0.40um

半径 5 um の円の円周の長さは、2 π r で 31.4um
この長さを上記 0.40 で割ると 31.4/0.40  = 78.5

きりのいいところで 90 角形で 4 度となります。
