;load("./SKILL/R0v1/r0.il") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ALL coordinates [um] are in the beam frame !!! ; ; Step 1: prepare strip at (0,0) in the beam frame ; LOOP: ; Step 2: slant strip by stero angle ; Step 3: slant strip by azimuthal angle ; Step 4: move strip to its position in the beam frame ; END LOOP ; Step 5: implement services (guard rings, bias ; network etc) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; naming convention ;-------------------------- ; a - array type ; g - general purpose ; n - integer or floating point ; constants ;-------------------------- quarter_pi = atan(1.0) ; 0.25 * pi half_pi = 2.0 * quarter_pi ; 0.5 * pi pi = 2.0 * half_pi ; pi two_pi = 2.0 * pi ; 2.0 * pi degrees = two_pi / 360.0 ; convert degrees to radians ; global variables ;-------------------------- aPres='() aPcap='() nPres = 0. nPcap = 0. gPitch = 79. gPres='() ; Design specs ;-------------------------- gZero = (0.:0.) ; Sensor's inner and outer ordinates [um] ;-------------------------- gRin = 384000. gRout = 489966. ; Centres of Bias rails ;-------------------------- gBiasRail01 = 404046. gBiasRail12 = 428071. gBiasRail23 = 457047. ; Test rails between radial segments [um] ;-------------------------- gBiasI = 442. gBiasM = 450. gBiasW = 220. gBiasWoffset = 17. gBiasRoffset = 54. gBiasIgap = 20. ; Implant's inner ordinates [um] ;-------------------------- gRin0 = 385000. gRin1 = gBiasRail01 + gBiasI / 2. + gBiasIgap gRin2 = gBiasRail12 + gBiasI / 2. + gBiasIgap gRin3 = gBiasRail23 + gBiasI / 2. + gBiasIgap ; Implant's outer ordinates [um] ;-------------------------- gRout0 = gBiasRail01 - gBiasI / 2. - gBiasIgap gRout1 = gBiasRail12 - gBiasI / 2. - gBiasIgap gRout2 = gBiasRail23 - gBiasI / 2. - gBiasIgap gRout3 = 488966. ; Centre of Wafer in the beam frame [um] ;-------------------------- gRmid = (gRin0 + gRout3) / 2. ; Stereo angle [rad] ;-------------------------- gStereoAngle = 0.02 gArcPoints = 500 ; Focal point [um] for strips ;-------------------------- gYfocus = 2 * gRmid * sin(gStereoAngle/2.) * sin(gStereoAngle/2.) gXfocus = sqrt(gRmid * gRmid - (gRmid - gYfocus) * (gRmid - gYfocus)) gF = (gXfocus : gYfocus) ; R0 sensor coverage in Phi [rad] ;-------------------------- gPhi = 0.2009 ; initial angle in Phi [rad] ;-------------------------- gPhiInit = gStereoAngle - gPhi/2. ; Number of channels ;-------------------------- gN01 = 1026 gN23 = 1154 ; Polysilicon resistor ;-------------------------- gNzigzag = 8 gZigzag = 25. ; R0 sensor's pitch in Phi [rad] ;-------------------------- gPhiPitch01 = gPhi / (gN01 - 1) gPhiPitch23 = gPhi / (gN23 - 1) ; Guard structure ;-------------------------- gRingI0 = 224. gRingM0 = 232. gRingW0 = 110. gRingI = 22. gRingS = 6. gRingE = 300. gRingM1 = 30. gRingM2 = 36. gRingM3 = 42. gRingM4 = 48. gRingM5 = 56. gRingM6 = 64. gRingM7 = 72. gRingM8 = 82. gMetWing = 4. gStopGap = 6. gOffI0 = gBiasIgap + gRingI0/2. gOffI1 = gOffI0 + gRingI0/2. + gRingI/2. + 20. gOffI2 = gOffI1 + gRingI + 26. gOffI3 = gOffI2 + gRingI + 32. gOffI4 = gOffI3 + gRingI + 40. gOffI5 = gOffI4 + gRingI + 50. gOffI6 = gOffI5 + gRingI + 60. gOffI7 = gOffI6 + gRingI + 70. gOffI8 = gOffI7 + gRingI + 80. gOffM0 = gOffI0 gOffM1 = gOffI1 - gRingM1/2. + gRingI/2. + gMetWing gOffM2 = gOffI2 - gRingM2/2. + gRingI/2. + gMetWing gOffM3 = gOffI3 - gRingM3/2. + gRingI/2. + gMetWing gOffM4 = gOffI4 - gRingM4/2. + gRingI/2. + gMetWing gOffM5 = gOffI5 - gRingM5/2. + gRingI/2. + gMetWing gOffM6 = gOffI6 - gRingM6/2. + gRingI/2. + gMetWing gOffM7 = gOffI7 - gRingM7/2. + gRingI/2. + gMetWing gOffM8 = gOffI8 - gRingM8/2. + gRingI/2. + gMetWing gOffS1 = gOffI0 + gRingI0/2. + gRingS/2. + gStopGap gOffS2 = gOffI1 + gRingI/2. + gRingS/2. + gStopGap gOffS3 = gOffI2 + gRingI/2. + gRingS/2. + gStopGap gOffS4 = gOffI3 + gRingI/2. + gRingS/2. + gStopGap gOffS5 = gOffI4 + gRingI/2. + gRingS/2. + gStopGap gOffS6 = gOffI5 + gRingI/2. + gRingS/2. + gStopGap gOffS7 = gOffI6 + gRingI/2. + gRingS/2. + gStopGap gOffS8 = gOffI7 + gRingI/2. + gRingS/2. + gStopGap gOffW0 = 60. gVia0 = 32. gWallOffset = 37.5 gViaInterval = 150. gRbend = 15. gZoom = 1.25 gDelta = gBiasIgap - gRbend gGap = 100.;20.; 10.;3. gCurfOffset = 2600. gCurfWidth = 120. gFieldOff = 1600. gFieldM = 1550. ;-------------------------- ;-------------------------- ; Select cells ;-------------------------- gCV=dbOpenCellViewByType("Infineon_141v1" "tmp" "layout" "" "a") gActContact = dbOpenCellViewByType("Infineon_141v1" "m1_act" "layout") gPolyContact = dbOpenCellViewByType("Infineon_141v1" "m1_poly" "layout") gBondPath = dbOpenCellViewByType("Infineon_141v1" "bondpath" "layout") gBondPad = dbOpenCellViewByType("Infineon_141v1" "bondpad" "layout") g7X = dbOpenCellViewByType("Infineon_141v1" "7cross" "layout") gNumP='( (10 25) (9.877 26.564) (9.511 28.09) (8.91 29.54) (8.09 30.878) (7.071 32.071) (5.878 33.09) (4.54 33.91) (3.09 34.511) (1.564 34.877) (0 35) (-1.564 34.877) (-3.09 34.511) (-4.54 33.91) (-5.878 33.09) (-7.071 32.071) (-8.09 30.878) (-8.91 29.54) (-9.511 28.09) (-9.877 26.564) (-10 25) (-9.877 23.436) (-9.511 21.91) (-8.91 20.46) (-8.09 19.122) (-7.071 17.929) (-5.878 16.91) (-4.54 16.09) (-3.09 15.489) (-1.564 15.123) (0 15) (1.564 15.123) (3.09 15.489) (4.54 16.09) (5.878 16.91) (7.071 17.929) (8.09 19.122) (8.91 20.46) (9.511 21.91) (9.877 23.436) ) gNum0='( (10 0) (0 10) (0 40) (10 50) (23.333 50) (33.333 40) (33.333 25) (25 25) (25 37.5) (20.833 41.667) (12.5 41.667) (8.333 37.5) (8.333 12.5) (12.5 8.333) (20.833 8.333) (25 12.5) (25 25) (33.333 25) (33.333 10) (23.333 0) ) gNum1='( (29.167 8.333) (20.833 8.333) (20.833 50) (8.333 50) (8.333 41.667) (12.5 41.667) (12.5 8.333) (4.167 8.333) (4.167 0) (29.167 0) ) gNum2='( (33.333 8.333) (8.333 8.333) (8.333 16.667) (10.417 18.75) (24.167 18.75) (33.333 27.917) (33.333 40.833) (24.167 50) (10 50) (0 40) (0 34.167) (8.333 34.167) (8.333 37.5) (12.5 41.667) (20.833 41.667) (25 37.5) (25 31.25) (20.833 27.083) (7.083 27.083) (0 20) (0 0) (33.333 0) ) gNum3='( (33.333 22.083) (30.417 25) (33.333 27.917) (33.333 40.833) (24.167 50) (10 50) (0 40) (0 34.167) (8.333 34.167) (8.333 37.5) (12.5 41.667) (20.833 41.667) (25 37.5) (25 31.25) (22.917 29.167) (12.5 29.167) (12.5 20.833) (22.917 20.833) (25 18.75) (25 12.5) (20.833 8.333) (12.5 8.333) (8.333 12.5) (8.333 15.833) (0 15.833) (0 10) (10 0) (24.167 0) (33.333 9.167) ) gNum4='( (33.333 23.333) (29.167 23.333) (29.167 50) (20.833 50) (20.833 23.333) (8.333 23.333) (8.333 26.667) (20.833 39.167) (20.833 50) (0 29.167) (0 15) (20.833 15) (20.833 0) (29.167 0) (29.167 15) (33.333 15) ) gNum5='( (33.333 41.667) (8.333 41.667) (8.333 33.333) (10.417 31.25) (24.167 31.25) (33.333 22.083) (33.333 9.167) (24.167 0) (10 0) (0 10) (0 15.833) (8.333 15.833) (8.333 12.5) (12.5 8.333) (20.833 8.333) (25 12.5) (25 18.75) (20.833 22.917) (7.083 22.917) (0 30) (0 50) (33.333 50) ) gNum6='( (33.333 22.083) (26.25 29.167) (25 29.167) (25 12.5) (20.833 8.333) (12.5 8.333) (8.333 12.5) (8.333 18.75) (10.417 20.833) (22.917 20.833) (25 18.75) (25 29.167) (10.417 29.167) (8.333 31.25) (8.333 37.5) (12.5 41.667) (22.917 41.667) (26.25 38.333) (33.333 38.333) (33.333 43.333) (26.667 50) (9.167 50) (0 40.833) (0 9.167) (9.167 0) (24.167 0) (33.333 9.167) ) gNum7='( (31.667 50) (1.667 50) (1.667 42.5) (23.333 42.5) (23.333 30.833) (4.167 11.667) (4.167 0) (12.5 0) (12.5 8.333) (31.667 27.5) ) gNum8='( (33.333 22.083) (30.417 25) (33.333 27.917) (33.333 40.833) (25 49.167) (25 12.5) (20.833 8.333) (12.5 8.333) (8.333 12.5) (8.333 18.75) (10.417 20.833) (22.917 20.833) (25 18.75) (25 31.25) (22.917 29.167) (10.417 29.167) (8.333 31.25) (8.333 37.5) (12.5 41.667) (20.833 41.667) (25 37.5) (25 49.167) (24.167 50) (9.167 50) (0 40.833) (0 27.917) (2.917 25) (0 22.083) (0 9.167) (9.167 0) (24.167 0) (33.333 9.167) ) gNum9='( (0 27.917) (7.083 20.833) (8.333 20.833) (8.333 37.5) (12.5 41.667) (20.833 41.667) (25 37.5) (25 31.25) (22.917 29.167) (10.417 29.167) (8.333 31.25) (8.333 20.833) (22.917 20.833) (25 18.75) (25 12.5) (20.833 8.333) (10.417 8.333) (7.083 11.667) (0 11.667) (0 6.667) (6.667 0) (24.167 0) (33.333 9.167) (33.333 40.833) (24.167 50) (9.167 50) (0 40.833) ) gNumOff = 42. ; Zero Angle implant geometries [um] ;-------------------------- gImplant='( (-5 0) (-5.782 0.062) (-6.545 0.245) (-7.27 0.545) (-7.939 0.955) (-8.536 1.464) (-9.045 2.061) (-9.455 2.73) (-9.755 3.455) (-9.938 4.218) (-10 5) (-10 15) (-9.938 15.782) (-9.755 16.545) (-9.455 17.27) (-9.045 17.939) (-8.536 18.536) (-7.939 19.045) (-7.27 19.455) (-6.545 19.755) (-5.782 19.938) (-5 20) (5 20) (5.782 19.938) (6.545 19.755) (7.27 19.455) (7.939 19.045) (8.536 18.536) (9.045 17.939) (9.455 17.27) (9.755 16.545) (9.938 15.782) (10 15) (10 5) (9.938 4.218) (9.755 3.455) (9.455 2.73) (9.045 2.061) (8.536 1.464) (7.939 0.955) (7.27 0.545) (6.545 0.245) (5.782 0.062) (5 0) ) gPstop='( (-15. -10.) (-10. -10.) (-8.436 -9.877) (-6.91 -9.511) (-5.46 -8.91) (-4.122 -8.09) (-2.929 -7.071) (-1.91 -5.878) (-1.09 -4.54) (-0.489 -3.09) (-0.123 -1.564) (0. 0.) (0. 20.) (-0.123 21.564) (-0.489 23.09) (-1.09 24.54) (-1.91 25.878) (-2.929 27.071) (-4.122 28.09) (-5.46 28.91) (-6.91 29.511) (-8.436 29.877) (-10. 30.) (-15. 30.) ) ; Zero Angle via padstacks [um] ;-------------------------- gTabDCres='( (14 59.919) (13.822 62.187) (13.822 62.192) (13.31 64.321) (12.468 66.354) (11.32 68.227) (9.896 69.896) (8.228 71.32) (6.354 72.468) (4.321 73.31) (2.192 73.821) (0 73.994) (-2.191 73.821) (-4.321 73.31) (-6.353 72.468) (-8.227 71.32) (-9.895 69.896) (-11.319 68.228) (-12.468 66.354) (-13.31 64.321) (-13.821 62.192) (-14 59.919) (-14 0.081) (-13.822 -2.187) (-13.822 -2.192) (-13.31 -4.321) (-12.468 -6.354) (-11.32 -8.227) (-9.896 -9.896) (-8.228 -11.32) (-6.354 -12.468) (-4.321 -13.31) (-2.192 -13.821) (0 -13.994) (2.191 -13.821) (4.321 -13.31) (6.353 -12.468) (8.227 -11.32) (9.895 -9.896) (11.319 -8.228) (12.468 -6.354) (13.31 -4.321) (13.821 -2.192) (14 0.081) ) gTabDCend='( (-14 -39.919) (-13.822 -42.187) (-13.822 -42.192) (-13.31 -44.321) (-12.468 -46.354) (-11.32 -48.227) (-9.896 -49.896) (-8.228 -51.32) (-6.354 -52.468) (-4.321 -53.31) (-2.192 -53.821) (0 -53.994) (2.191 -53.821) (4.321 -53.31) (6.353 -52.468) (8.227 -51.32) (9.895 -49.896) (11.319 -48.228) (12.468 -46.354) (13.31 -44.321) (13.821 -42.192) (14 -39.919) (14 -5) (13.889 -3.592) (13.56 -2.219) (13.019 -0.914) (12.281 0.29) (11.364 1.364) (10.29 2.281) (9.086 3.019) (7.781 3.56) (6.408 3.889) (5 4) (-5 4) (-6.408 3.889) (-7.781 3.56) (-9.086 3.019) (-10.29 2.281) (-11.364 1.364) (-12.281 0.29) (-13.019 -0.914) (-13.56 -2.219) (-13.889 -3.592) (-14 -5) ) ; Zero Angle capacitor and airways [um] ;-------------------------- gAirWay='( (14 1.919) (13.822 4.187) (13.822 4.192) (13.31 6.321) (12.468 8.354) (11.32 10.227) (9.896 11.896) (8.228 13.32) (6.354 14.468) (4.321 15.31) (2.192 15.821) (0 15.994) (-2.191 15.821) (-4.321 15.31) (-6.353 14.468) (-8.227 13.32) (-9.895 11.896) (-11.319 10.228) (-12.468 8.354) (-13.31 6.321) (-13.821 4.192) (-14 1.919) (-14 0.081) (-13.822 -2.187) (-13.822 -2.192) (-13.31 -4.321) (-12.468 -6.354) (-11.32 -8.227) (-9.896 -9.896) (-8.228 -11.32) (-6.354 -12.468) (-4.321 -13.31) (-2.192 -13.821) (0 -13.994) (2.191 -13.821) (4.321 -13.31) (6.353 -12.468) (8.227 -11.32) (9.895 -9.896) (11.319 -8.228) (12.468 -6.354) (13.31 -4.321) (13.821 -2.192) (14 0.081) ) ; Zero Angle nitride [um] ;-------------------------- gNitride='( (18 2.076) (17.822 4.341) (17.822 4.666) (17.126 7.562) (16.043 10.176) (14.566 12.585) (12.734 14.733) (10.586 16.566) (8.175 18.043) (5.561 19.126) (2.82 19.784) (0 20.006) (-2.819 19.784) (-5.561 19.126) (-8.175 18.043) (-10.585 16.566) (-12.732 14.733) (-14.565 12.586) (-16.043 10.176) (-17.126 7.561) (-17.784 4.82) (-18 2.076) (-18 -0.076) (-17.822 -2.341) (-17.822 -2.666) (-17.126 -5.562) (-16.043 -8.176) (-14.566 -10.585) (-12.734 -12.733) (-10.586 -14.566) (-8.175 -16.043) (-5.561 -17.126) (-2.82 -17.784) (0 -18.006) (2.819 -17.784) (5.561 -17.126) (8.175 -16.043) (10.585 -14.566) (12.732 -12.733) (14.565 -10.586) (16.043 -8.176) (17.126 -5.561) (17.784 -2.82) (18 -0.076) ) ; Zero Angle bias structure [um] ;-------------------------- gBiasBondW='( (55 960) (54.938 960.782) (54.755 961.545) (54.455 962.27) (54.045 962.939) (53.536 963.536) (52.939 964.045) (52.27 964.455) (51.545 964.755) (50.782 964.938) (50 965) (-50 965) (-50.782 964.938) (-51.545 964.755) (-52.27 964.455) (-52.939 964.045) (-53.536 963.536) (-54.045 962.939) (-54.455 962.27) (-54.755 961.545) (-54.938 960.782) (-55 960) (-55 34) (-54.938 33.218) (-54.755 32.455) (-54.455 31.73) (-54.045 31.061) (-53.536 30.464) (-52.939 29.955) (-52.27 29.545) (-51.545 29.245) (-50.782 29.062) (-50 29) (50 29) (50.782 29.062) (51.545 29.245) (52.27 29.545) (52.939 29.955) (53.536 30.464) (54.045 31.061) (54.455 31.73) (54.755 32.455) (54.938 33.218) (55 34) ) gBiasShuntI='( (0 236) (-112 236) (-112.185 233.653) (-112.734 231.365) (-113.635 229.19) (-114.865 227.183) (-116.393 225.393) (-118.183 223.865) (-120.19 222.635) (-122.365 221.734) (-124.653 221.185) (-127 221) (-127 -221) (-124.653 -221.185) (-122.365 -221.734) (-120.19 -222.635) (-118.183 -223.865) (-116.393 -225.393) (-114.865 -227.183) (-113.635 -229.19) (-112.734 -231.365) (-112.185 -233.653) (-112 -236) (0 -236) ;(0 236) (-75 236) (-75.185 233.653) (-75.734 231.365) (-76.635 229.19) (-77.865 227.183) (-79.393 225.393) (-81.183 223.865) (-83.19 222.635) (-85.365 221.734) (-87.653 221.185) (-90 221) (-90 -221) (-87.653 -221.185) (-85.365 -221.734) (-83.19 -222.635) (-81.183 -223.865) (-79.393 -225.393) (-77.865 -227.183) (-76.635 -229.19) (-75.734 -231.365) (-75.185 -233.653) (-75 -236) (0 -236) ) gBiasShuntM='( (0 236) (-116 236) (-116.135 234.279) (-116.538 232.601) (-117.199 231.006) (-118.101 229.534) (-119.222 228.222) (-120.534 227.101) (-122.006 226.199) (-123.601 225.538) (-125.279 225.135) (-127 225) (-127 -225) (-125.279 -225.135) (-123.601 -225.538) (-122.006 -226.199) (-120.534 -227.101) (-119.222 -228.222) (-118.101 -229.534) (-117.199 -231.006) (-116.538 -232.601) (-116.135 -234.279) (-116 -236) (0 -236) ;(0 236) (-79 236) (-79.135 234.279) (-79.538 232.601) (-80.199 231.006) (-81.101 229.534) (-82.222 228.222) (-83.534 227.101) (-85.006 226.199) (-86.601 225.538) (-88.279 225.135) (-90 225) (-90 -225) (-88.279 -225.135) (-86.601 -225.538) (-85.006 -226.199) (-83.534 -227.101) (-82.222 -228.222) (-81.101 -229.534) (-80.199 -231.006) (-79.538 -232.601) (-79.135 -234.279) (-79 -236) (0 -236) ) ;Zero Angle resistor ziz-zag [um] ;-------------------------- gRzigzag='( (-28.75 32.25) (-28.642 30.881) (-28.322 29.546) (-27.796 28.278) (-27.079 27.107) (-26.187 26.063) (-25.143 25.171) (-23.972 24.454) (-22.704 23.928) (-21.369 23.608) (-20 23.5) (0 23.5) (0 28.5) (-20 28.5) (-20.587 28.546) (-21.159 28.684) (-21.702 28.909) (-22.204 29.216) (-22.652 29.598) (-23.034 30.046) (-23.341 30.548) (-23.566 31.091) (-23.704 31.663) (-23.75 32.25) (-23.704 32.837) (-23.566 33.409) (-23.341 33.952) (-23.034 34.454) (-22.652 34.902) (-22.204 35.284) (-21.702 35.591) (-21.159 35.816) (-20.587 35.954) (-20 36) (20 36) (21.369 36.108) (22.704 36.428) (23.972 36.954) (25.143 37.671) (26.187 38.563) (27.079 39.607) (27.796 40.778) (28.322 42.046) (28.642 43.381) (28.75 44.75) (28.642 46.119) (28.322 47.454) (27.796 48.722) (27.079 49.893) (26.187 50.937) (25.143 51.829) (23.972 52.546) (22.704 53.072) (21.369 53.392) (20 53.5) (0 53.5) (0 48.5) (20 48.5) (20.587 48.454) (21.159 48.316) (21.702 48.091) (22.204 47.784) (22.652 47.402) (23.034 46.954) (23.341 46.452) (23.566 45.909) (23.704 45.337) (23.75 44.75) (23.704 44.163) (23.566 43.591) (23.341 43.048) (23.034 42.546) (22.652 42.098) (22.204 41.716) (21.702 41.409) (21.159 41.184) (20.587 41.046) (20 41) (-20 41) (-21.369 40.892) (-22.704 40.572) (-23.972 40.046) (-25.143 39.329) (-26.187 38.437) (-27.079 37.393) (-27.796 36.222) (-28.322 34.954) (-28.642 33.619) ) ;Zero Angle resistor endcap [um] ;-------------------------- gRendcap='( (16 19.75) (15.892 21.119) (15.572 22.454) (15.046 23.722) (14.329 24.893) (13.437 25.937) (12.393 26.829) (11.222 27.546) (11 27.638) (11 27.618) (9.904 28.072) (8.569 28.392) (7.2 28.5) (0 28.5) (0 23.5) (7.2 23.5) (7.787 23.454) (8.359 23.316) (8.902 23.091) (9.404 22.784) (9.852 22.402) (10.234 21.954) (10.541 21.452) (10.766 20.909) (10.904 20.337) (10.95 19.75) (10.904 19.163) (10.766 18.591) (10.541 18.048) (10.234 17.546) (9.852 17.098) (9.404 16.716) (8.902 16.409) (8.359 16.184) (7.787 16.046) (7.2 16) (0 16) (-2.503 15.803) (-4.944 15.217) (-7.264 14.256) (-9.405 12.944) (-11.314 11.314) (-12.944 9.405) (-14.256 7.264) (-15.217 4.944) (-15.803 2.503) (-16 0) (-15.803 -2.503) (-15.217 -4.944) (-14.256 -7.264) (-12.944 -9.405) (-11.314 -11.314) (-9.405 -12.944) (-7.264 -14.256) (-4.944 -15.217) (-2.503 -15.803) (0 -16) (2.503 -15.803) (4.944 -15.217) (7.264 -14.256) (9.405 -12.944) (11.314 -11.314) (12.944 -9.405) (14.256 -7.264) (15.217 -4.944) (15.803 -2.503) (16 0) ) ;-------------------------- ; OFFSETS ;-------------------------- ; Offset between stagged pads [um] ;-------------------------- gPadStack = 250. ; Length of bond pad block [um] ;-------------------------- gBondPathLength = 988. ; Length of the airway at zero angle ;-------------------------- gAirWayLength = 500. ; Offset for resistor's 1st via ; with respect to the implant edge [um] ;-------------------------- gResVia = 250. gBiasVia = gVia0 ; Offset for endcap via with respect ; to the implant edge [um] ;-------------------------- gEndVia = 10. ; Offset between vias in array [um] ;-------------------------- gViaStack = 30. ; Offset for resistor's poly dope [um] ;-------------------------- gBiasDope = 32. procedure( aOffset(aShape aShift) ;-------------------------- ; offset figure let( (aResult nXoff nYoff aPoint nXval nYval nXnew nYnew) aResult = '( ) nXoff = car(aShift) nYoff = car(cdr(aShift)) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr(aPoint)) nXnew = nXval + nXoff nYnew = nYval + nYoff aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** procedure aOffset ** procedure( aRotate(aShape nAngle) ;-------------------------- ; rotate figure around 0:0 let( (aResult aPoint nXval nYval nXnew nYnew) aResult = '( ) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr( aPoint)) nXnew = nXval * cos(nAngle) - nYval * sin(nAngle) nYnew = nXval * sin(nAngle) + nYval * cos(nAngle) aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** procedure aRotate ** procedure( aStretch(aShape aThreshold aScale) ;-------------------------- ; stretch up and right by the scale factor ; all those points on the shape which are ; above the threshold line ; vThreshold combines slope and intercept; ; vScale combines horizontal and vertical ; stretch factors let( (aResult nXmag nYmag nSlope nIntercept aPoint nXval nYval nXnew nYnew) aResult = '( ) nXmag = car(aScale) nYmag = car(cdr( aScale)) nSlope = car(aThreshold) nIntercept = car(cdr( aThreshold)) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr(aPoint)) if( (nYval > nXval * nSlope + nIntercept) then nXnew = nXval + nXmag nYnew = nYval + nYmag else nXnew = nXval nYnew = nYval ) ; ** if nYval ** aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** aStretch ** procedure( aXmirror(aShape) ;-------------------------- ; vertical flip around Y=0. let( (aResult aPoint nXval nYval nXnew nYnew) aResult = '( ) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr(aPoint)) nXnew = nXval nYnew = -nYval aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** aXmirror ** procedure( aYmirror(aShape) ;-------------------------- ; horizontal flip around X=0. let( (aResult aPoint nXval nYval nXnew nYnew) aResult = '( ) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr(aPoint)) nXnew = -nXval nYnew = nYval aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** aYmirror ** procedure( aXskew(aShape nAngle) ;-------------------------- ; skew object at its lowest point . let( (aResult aPoint nXval nYval nXnew nYnew) aResult = '( ) for(i 1 length(aShape) aPoint = nthelem(i aShape) nXval = car(aPoint) nYval = car(cdr(aPoint)) nXnew = nXval - nYval * tan(nAngle) nYnew = nYval aResult = cons((nXnew:nYnew) aResult) ) ; ** for i ** aResult) ; ** let ** ) ; ** aXskew ** procedure( aFocusLine(aPoint nAngle) ;-------------------------- ; calculate slope and intercept of ; a line crossing (focus) point at ; (azimuthal) angle let( (nXval nYval nSlope nIntercept) nXval = car(aPoint) nYval = car(cdr( aPoint)) nSlope = tan(half_pi + nAngle) nIntercept = nYval + nXval * tan(half_pi - nAngle) (nSlope:nIntercept)) ; ** let ** ) ; ** aFocusLine ** procedure( aSquare(aLine aPoint) ;-------------------------- ; calculate slope and intercept of ; a line square to the known line ; and crossing it at the given point let( (nSlope nIntercept nXval nYval) nSlope = car(aLine) nIntercept = car(cdr(aLine)) nXval = car(aPoint) nYval = car(cdr(aPoint)) nSlope = -1./nSlope nIntercept = nYval - nSlope * nXval (nSlope:nIntercept)) ; ** let ** ) ; ** aSquare ** procedure( aParallel(aLine nOffset) ;-------------------------- ; calculate slope and intercept of ; a line parallel to the known line ; at the given offset let( (nSlope nIntercept) nSlope = car(aLine) nIntercept = car(cdr(aLine)) nIntercept = nIntercept - nOffset / cos(atan(nSlope)) (nSlope:nIntercept)) ; ** let ** ) ; ** aParallel ** procedure( aSlideUp(aLine aPoint nOffset) ;-------------------------- ; calculate point on a line ; offset from the given point ; on the same line let( (nSlope nSign nXval nYval nXnew nYnew) nSlope = car(aLine) nSign = nSlope / abs(nSlope) nXval = car(aPoint) nYval = car(cdr(aPoint)) nXnew = nXval + nOffset * cos(atan(nSlope)) * nSign nYnew = nYval + nOffset * sin(atan(nSlope)) * nSign (nXnew:nYnew)) ; ** let ** ) ; ** aSlideUp ** procedure( aDestination(nRadius aLine) ;-------------------------- ; calculate crossing point of radial line ; with arcs (centered at 0:0 in the beam ; frame) in the northern hemisphere ; "aLine" combines slope and intercept let( (nSlope nIntercept nTmp1 nTmp2 nYnew nXnew) nSlope = car(aLine) nIntercept = car(cdr(aLine)) nTmp1 = (nIntercept + nSlope * sqrt(nRadius * nRadius * (nSlope * nSlope + 1.) - nIntercept * nIntercept)) / (nSlope * nSlope + 1.) nTmp2 = (nIntercept - nSlope * sqrt(nRadius * nRadius * (nSlope * nSlope + 1.) - nIntercept * nIntercept)) / (nSlope * nSlope + 1.) if( (nTmp1 > 0.) then nYnew = nTmp1 else nYnew = nTmp2 ) ; ** if ** nXnew = (nYnew - nIntercept) / nSlope (nXnew:nYnew)) ; ** let ** ) ; ** aDestination ** procedure( aSegment(aPoint1 aPoint2) ;-------------------------- ; calculate slope and intercept of ; a line defined by two points let( (nXval1 nYval1 nXval2 nYval2 nSlope nIntercept) nXval1 = car(aPoint1) nYval1 = car(cdr(aPoint1)) nXval2 = car(aPoint2) nYval2 = car(cdr(aPoint2)) nSlope = (nYval1 - nYval2) / (nXval1 - nXval2) nIntercept = nYval2 - nXval2 * nSlope (nSlope:nIntercept)) ; ** let ** ) ; ** aSegment ** procedure( aCross(aLine1 aLine2) ;-------------------------- ; calculate crossing point of ; two lines let( (nSlope1 nInter1 nSlope2 nInter2 nXval nYval) nSlope1 = car(aLine1) nInter1 = car(cdr(aLine1)) nSlope2 = car(aLine2) nInter2 = car(cdr(aLine2)) nXval = (nInter1 - nInter2) / (nSlope2 - nSlope1) nYval = (nSlope2*nInter1 - nSlope1*nInter2) / (nSlope2 - nSlope1) (nXval:nYval)) ; ** let ** ) ; ** aCross ** procedure( nLength(aStart aEnd) ;-------------------------- ; calculate distance between two points let( (nResult nXstart nYstart nXend nYend) nXstart = car(aStart) nYstart = car(cdr(aStart)) nXend = car(aEnd) nYend = car(cdr( aEnd)) nResult = sqrt((nXstart - nXend) * (nXstart - nXend) + (nYstart - nYend) * (nYstart - nYend)) nResult) ; ** let ** ) ; ** nLength ** procedure( nAngle2H(aA aB) ;-------------------------- ; calculate angle AB(xB+inf:yB) ; between segment AB and horizon let( (nXdif nYdif nResult) nXdif = car(aA) - car(aB) nYdif = car(cdr(aA)) - car(cdr(aB)) nResult = atan(nYdif / nXdif) if( (nXdif < 0.) then nResult = nResult + pi else nil ) ; ** if ** if( nResult < 0. then nResult = two_pi + nResult else nil ) ; ** if ** nResult) ; ** let ** ); ** nAngle2H ** procedure( nAngleABC(aA aB aC) ;-------------------------- ; calculate ABC angle let( (nResult) nResult = nAngle2H(aC aB) - nAngle2H(aA aB) nResult) ; ** let ** ) ; ** nAngleABC ** procedure( gMakeObject(aFigure aPlace nAngle aShift gCV sLayer) ;-------------------------- let( (aShape) ; Origin aShape = aOffset(aFigure aPlace) ; Rotate aShape = aRotate(aShape nAngle) ; Translate aShape = aOffset(aShape aShift) ; Create polygon dbCreatePolygon(gCV sLayer aShape) ) ; ** let ** ) ; ** gMakeObject ** procedure( gPlaceObject(gCell aPlace nAngle aShift gCV) ;-------------------------- let( (aShape aPoint) aShape = '() ; Origin aShape = cons(aPlace aShape) ; Rotate aShape = aRotate(aShape nAngle) ; Translate aShape = aOffset(aShape aShift) aPoint = nthelem(1 aShape) dbCreateInst(gCV gCell nil aPoint "R0") ) ; ** let ** ) ; ** gPlaceObject ** procedure( aFindPoint(aPlace nAngle aShift) ;-------------------------- let( (aShape) aShape = '() ; Origin aShape = cons(aPlace aShape) ; Rotate aShape = aRotate(aShape nAngle) ; Translate aShape = aOffset(aShape aShift) nthelem(1 aShape) ) ; ** let ** ) ; ** aFindPoint ** procedure( gDrawR0() let( (nAngle aLine aStart aEnd aScale aShape nOpt nXval nYval aCon1 aCon2 aCap1 aCap2 nR aPoint) ; Calculate pitch for bond ; pads on capacitor side (bottom) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRin0 + nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRin0 + nOpt)) aLine) nPcap = nLength(aStart aEnd) / (gN01-1) nOpt = car(aStart) - (nPcap - 75.) * gN01 / 2. aPcap = (nOpt:car(cdr(aStart))) nPcap = 75. aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") ; Calculate pitch for bond ; pads on resistor side (top) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nOpt = nOpt + gBondPathLength nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRout0 - nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRout0 - nOpt)) aLine) nPres = nLength(aStart aEnd) / (gN01-1) nOpt = car(aStart) - (nPres - gPitch) * gN01 / 2. aPres = (nOpt:car(cdr(aStart))) nPres = gPitch gPres = aPres aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") printf("Contact pitch on capacitor side for R0 segment %11.3f\n" nPcap) printf("Contact pitch on resistor side for R0 segment %11.3f\n" nPres) ; Reset Initial angle ;-------------------------- nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN01 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin0) aLine) aEnd = aCross((0.:gRout0) aLine) ; Implants ;-------------------------- ; Calculate implant stretch factor aScale = (0.:(nLength(aStart aEnd) - 20.)) aThreshold = (0.:10.) ; Stretch implant aShape = aStretch(gImplant aThreshold aScale) gMakeObject(aShape (0.:0.) nAngle aStart gCV "IMPL") ; Contact padstacks (capacitor side) ;-------------------------- aShape = aXmirror(gTabDCend) gMakeObject(aShape (0.:0.) nAngle aStart gCV "MET1") ; Resistor endcap ;-------------------------- aShape = aYmirror(gRendcap) aShape = aXmirror(aShape) gMakeObject(aShape (0.:gBiasDope) nAngle aEnd gCV "POLY") ; Resistor zig-zags ;-------------------------- aShape = aYmirror(gRzigzag) aShape = aXmirror(aShape) for( j 1 gNzigzag nOpt = (j - 1) * gZigzag gMakeObject(aShape (0.:(gBiasDope-nOpt)) nAngle aEnd gCV "POLY") ) ; ** for j ** ; Resistor endcap ;-------------------------- nOpt = gBiasDope - nOpt - 77. gMakeObject(gRendcap (0.:nOpt) nAngle aEnd gCV "POLY") ; Contact padstacks (resistor side) ;-------------------------- aShape = aXmirror(gTabDCres) gMakeObject(aShape (0.:nOpt) nAngle aEnd gCV "MET1") ; Poly contacts ;-------------------------- gPlaceObject(gPolyContact (0.:nOpt) nAngle aEnd gCV) gPlaceObject(gPolyContact (0.:gBiasDope) nAngle aEnd gCV) ; Implant contacts ;-------------------------- gPlaceObject(gActContact (0.:gEndVia) nAngle aStart gCV) gPlaceObject(gActContact (0.:gEndVia+gViaStack) nAngle aStart gCV) nOpt = nOpt - gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aEnd gCV) nOpt = nOpt - gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aEnd gCV) aCon1 = aFindPoint((0.:nOpt) nAngle aEnd) ; Routing for bond contacts ; on resistor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPres gCV) ; DC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AirWays for DC pads on resistor side ;-------------------------- ; nOpt = car(cdr(aPres)) + gBondPathLength + gAirWayLength ; aCon1 = aCross((0.:nOpt) aLine) nOpt = car(cdr(aPres)) + gBondPathLength aCon2 = (car(aPres):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on resistor side ;-------------------------- aCon1 = aPres nOpt = car(cdr(aPres)) - gAirWayLength aCon2 = aCross((0.:nOpt) aLine) aCap1 = aCon2 aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on resistor side ;-------------------------- aPres = ((car(aPres)-nPres):car(cdr(aPres))) ; Routing for bond contacts ; on capacitor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPcap gCV) ; AC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; DC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; AirWays for DC pads on capacitor side ;-------------------------- aCon1 = aPcap nOpt = gRin0 + gEndVia + gViaStack aCon2 = aCross((0.:nOpt) aLine) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on capacitor side ;-------------------------- nOpt = car(cdr(aPcap)) + gBondPathLength + gAirWayLength aCon1 = aCross((0.:nOpt) aLine) aCap2 = aCon1 nOpt = car(cdr(aPcap)) + gBondPathLength aCon2 = (car(aPcap):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on capacitor side ;-------------------------- aPcap = ((car(aPcap)-nPcap):car(cdr(aPcap))) ; Capacitors ;-------------------------- aScale = (0.:(nLength(aCap1 aCap2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "MET1") ; Nitride openings ;-------------------------- aShape = aStretch(gNitride aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "NITR") ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ; Reset Initial angle ;-------------------------- nAngle = gPhiInit - gPhiPitch01/2. ; Loop over strips ;-------------------------- for( i 1 gN01+1 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin0) aLine) aEnd = aCross((0.:gRout0) aLine) ; Pstop implants ;-------------------------- aScale = (0.:(nLength((0.:car(cdr(aStart))) (0.:car(cdr(aEnd)))) - 20.)) aThreshold = (0.:10.) aShape = aStretch(gPstop aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i < gN01+1 dbCreatePath(gCV "STOP" aShape 6.)) aShape = aYmirror(gPstop) aShape = aStretch(aShape aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i > 1 dbCreatePath(gCV "STOP" aShape 6.)) ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawR0 ** procedure( gPlace7X(aPoint nStrips) let( (nX nY) nX = car(aPoint) - (nStrips-1+46)*gPitch nY = car(cdr(aPoint)) dbCreateInst(gCV g7X nil aPoint "R180") dbCreateInst(gCV g7X nil (nX:nY) "R0") ) ; ** let ** ) ; ** gPlace7X ** procedure( gDrawR1() let( (nAngle aLine aStart aEnd aScale aShape nOpt nXval nYval aCon1 aCon2 aCap1 aCap2) ; Calculate pitch for bond ; pads on resistor side (bottom) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRin1 + nOpt)) aLine) aPres = (car(gPres):car(cdr(aStart))) nPres = gPitch aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") ; Calculate pitch for bond ; pads on capacitor side (top) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nOpt = nOpt + gBondPathLength nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRout1 - nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRout1 - nOpt)) aLine) nPcap = nLength(aStart aEnd) / (gN01-1) nOpt = car(aStart) - (nPcap - 83.8) * gN01 / 2. aPcap = (nOpt:car(cdr(aStart))) nPcap = 83.8 aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") printf("Contact pitch on resistor side for R1 segment %11.3f\n" nPres) printf("Contact pitch on capacitor side for R1 segment %11.3f\n" nPcap) ; Reset Initial angle ;-------------------------- nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN01 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin1) aLine) aEnd = aCross((0.:gRout1) aLine) ; Implants ;-------------------------- ; Calculate implant stretch factor aScale = (0.:(nLength(aStart aEnd) - 20.)) aThreshold = (0.:10.) ; Stretch implant aShape = aStretch(gImplant aThreshold aScale) gMakeObject(aShape (0.:0.) nAngle aStart gCV "IMPL") ; Contact padstacks (capacitor side) ;-------------------------- gMakeObject(gTabDCend (0.:0.) nAngle aEnd gCV "MET1") ; Resistor endcap ;-------------------------- gMakeObject(gRendcap (0.:-gBiasDope) nAngle aStart gCV "POLY") ; Resistor zig-zags ;-------------------------- for( j 1 gNzigzag nOpt = (j - 1) * gZigzag gMakeObject(gRzigzag (0.:(nOpt - gBiasDope)) nAngle aStart gCV "POLY") ) ; ** for j ; Resistor endcap ;-------------------------- nOpt = nOpt + 77. - gBiasDope aShape = aXmirror(gRendcap) aShape = aYmirror(aShape) gMakeObject(aShape (0.:nOpt) nAngle aStart gCV "POLY") ; Contact padstacks (resistor side) ;-------------------------- gMakeObject(gTabDCres (0.:nOpt) nAngle aStart gCV "MET1") ; Poly contacts ;-------------------------- gPlaceObject(gPolyContact (0.:nOpt) nAngle aStart gCV) gPlaceObject(gPolyContact (0.:-gBiasDope) nAngle aStart gCV) ; Implant contacts ;-------------------------- gPlaceObject(gActContact (0.:-gEndVia) nAngle aEnd gCV) gPlaceObject(gActContact (0.:-gEndVia-gViaStack) nAngle aEnd gCV) nOpt = nOpt + gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aStart gCV) nOpt = nOpt + gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aStart gCV) aCon2 = aFindPoint((0.:nOpt) nAngle aStart) ; Routing for bond contacts ; on resistor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPres gCV) ; DC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AirWays for DC pads on resistor side ;-------------------------- aCon1 = aPres ; nOpt = car(cdr(aPres)) - gAirWayLength ; aCon2 = aCross((0.:nOpt) aLine) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on resistor side ;-------------------------- nOpt = car(cdr(aPres)) + gBondPathLength + gAirWayLength aCon1 = aCross((0.:nOpt) aLine) aCap2 = aCon1 nOpt = car(cdr(aPres)) + gBondPathLength aCon2 = (car(aPres):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on resistor side ;-------------------------- aPres = ((car(aPres)-nPres):car(cdr(aPres))) ; Routing for bond contacts ; on capacitor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPcap gCV) ; AC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; DC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; AirWays for DC pads on capacitor side ;-------------------------- nOpt = gRout1 - gEndVia - gViaStack aCon1 = aCross((0.:nOpt) aLine) nOpt = car(cdr(aPcap)) + gBondPathLength aCon2 = (car(aPcap):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on capacitor side ;-------------------------- aCon1 = aPcap nOpt = car(cdr(aPcap)) - gAirWayLength aCon2 = aCross((0.:nOpt) aLine) aCap1 = aCon2 aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on capacitor side ;-------------------------- aPcap = ((car(aPcap)-nPcap):car(cdr(aPcap))) ; Capacitors ;-------------------------- aScale = (0.:(nLength(aCap1 aCap2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "MET1") ; Nitride openings ;-------------------------- aShape = aStretch(gNitride aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "NITR") ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ; Reset Initial angle ;-------------------------- nAngle = gPhiInit - gPhiPitch01/2. ; Loop over strips ;-------------------------- for( i 1 gN01+1 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin1) aLine) aEnd = aCross((0.:gRout1) aLine) ; Pstop implants ;-------------------------- aScale = (0.:(nLength((0.:car(cdr(aStart))) (0.:car(cdr(aEnd)))) - 20.)) aThreshold = (0.:10.) aShape = aStretch(gPstop aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i < gN01+1 dbCreatePath(gCV "STOP" aShape 6.)) aShape = aYmirror(gPstop) aShape = aStretch(aShape aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i > 1 dbCreatePath(gCV "STOP" aShape 6.)) ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawR1 ** procedure( gDrawR2() let( (nAngle aLine aStart aEnd aScale aShape nOpt nXval nYval aCon1 aCon2 aCap1 aCap2) ; Calculate pitch for bond ; pads on capacitor side (bottom) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRin2 + nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRin2 + nOpt)) aLine) nPcap = nLength(aStart aEnd) / (gN23-1) nOpt = car(aStart) - (nPcap - 75.) * gN23 / 2. aPcap = (nOpt:car(cdr(aStart))) nPcap = 75. aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") ; Calculate pitch for bond ; pads on resistor side (top) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nOpt = nOpt + gBondPathLength nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRout2 - nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRout2 - nOpt)) aLine) nPres = nLength(aStart aEnd) / (gN23-1) nOpt = car(aStart) - (nPres - gPitch) * gN23 / 2. aPres = (nOpt:car(cdr(aStart))) nPres = gPitch gPres = aPres aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") printf("Contact pitch on capacitor side for R2 segment %11.3f\n" nPcap) printf("Contact pitch on resistor side for R2 segment %11.3f\n" nPres) ; Reset Initial angle ;-------------------------- nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN23 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin2) aLine) aEnd = aCross((0.:gRout2) aLine) ; Implants ;-------------------------- ; Calculate implant stretch factor aScale = (0.:(nLength(aStart aEnd) - 20.)) aThreshold = (0.:10.) ; Stretch implant aShape = aStretch(gImplant aThreshold aScale) gMakeObject(aShape (0.:0.) nAngle aStart gCV "IMPL") ; Contact padstacks (capacitor side) ;-------------------------- aShape = aXmirror(gTabDCend) gMakeObject(aShape (0.:0.) nAngle aStart gCV "MET1") ; Resistor endcap ;-------------------------- aShape = aYmirror(gRendcap) aShape = aXmirror(aShape) gMakeObject(aShape (0.:gBiasDope) nAngle aEnd gCV "POLY") ; Resistor zig-zags ;-------------------------- aShape = aYmirror(gRzigzag) aShape = aXmirror(aShape) for( j 1 gNzigzag nOpt = (j - 1) * gZigzag gMakeObject(aShape (0.:(gBiasDope-nOpt)) nAngle aEnd gCV "POLY") ) ; ** for j ** ; Resistor endcap ;-------------------------- nOpt = gBiasDope - nOpt - 77. gMakeObject(gRendcap (0.:nOpt) nAngle aEnd gCV "POLY") ; Contact padstacks (resistor side) ;-------------------------- aShape = aXmirror(gTabDCres) gMakeObject(aShape (0.:nOpt) nAngle aEnd gCV "MET1") ; Poly contacts ;-------------------------- gPlaceObject(gPolyContact (0.:nOpt) nAngle aEnd gCV) gPlaceObject(gPolyContact (0.:gBiasDope) nAngle aEnd gCV) ; Implant contacts ;-------------------------- gPlaceObject(gActContact (0.:gEndVia) nAngle aStart gCV) gPlaceObject(gActContact (0.:gEndVia+gViaStack) nAngle aStart gCV) nOpt = nOpt - gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aEnd gCV) nOpt = nOpt - gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aEnd gCV) aCon1 = aFindPoint((0.:nOpt) nAngle aEnd) ; Routing for bond contacts ; on resistor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPres gCV) ; DC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AirWays for DC pads on resistor side ;-------------------------- ; nOpt = car(cdr(aPres)) + gBondPathLength + gAirWayLength ; aCon1 = aCross((0.:nOpt) aLine) nOpt = car(cdr(aPres)) + gBondPathLength aCon2 = (car(aPres):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on resistor side ;-------------------------- aCon1 = aPres nOpt = car(cdr(aPres)) - gAirWayLength aCon2 = aCross((0.:nOpt) aLine) aCap1 = aCon2 aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on resistor side ;-------------------------- aPres = ((car(aPres)-nPres):car(cdr(aPres))) ; Routing for bond contacts ; on capacitor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPcap gCV) ; AC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; DC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; AirWays for DC pads on capacitor side ;-------------------------- aCon1 = aPcap nOpt = gRin2 + gEndVia + gViaStack aCon2 = aCross((0.:nOpt) aLine) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on capacitor side ;-------------------------- nOpt = car(cdr(aPcap)) + gBondPathLength + gAirWayLength aCon1 = aCross((0.:nOpt) aLine) aCap2 = aCon1 nOpt = car(cdr(aPcap)) + gBondPathLength aCon2 = (car(aPcap):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on capacitor side ;-------------------------- aPcap = ((car(aPcap)-nPcap):car(cdr(aPcap))) ; Capacitors ;-------------------------- aScale = (0.:(nLength(aCap1 aCap2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "MET1") ; Nitride openings ;-------------------------- aShape = aStretch(gNitride aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "NITR") ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ; Reset Initial angle ;-------------------------- nAngle = gPhiInit - gPhiPitch23/2. ; Loop over strips ;-------------------------- for( i 1 gN23+1 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin2) aLine) aEnd = aCross((0.:gRout2) aLine) ; Pstop implants ;-------------------------- aScale = (0.:(nLength((0.:car(cdr(aStart))) (0.:car(cdr(aEnd)))) - 20.)) aThreshold = (0.:10.) aShape = aStretch(gPstop aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i < gN23+1 dbCreatePath(gCV "STOP" aShape 6.)) aShape = aYmirror(gPstop) aShape = aStretch(aShape aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i > 1 dbCreatePath(gCV "STOP" aShape 6.)) ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawR2 ** procedure( gDrawR3() let( (nAngle aLine aStart aEnd aScale aShape nOpt nXval nYval aCon1 aCon2 aCap1 aCap2) ; Calculate pitch for bond ; pads on resistor side (bottom) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRin3 + nOpt)) aLine) aPres = (car(gPres):car(cdr(aStart))) nPres = gPitch aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPres)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") ; Calculate pitch for bond ; pads on capacitor side (top) ;-------------------------- nOpt = (gNzigzag - 1) * gZigzag + 77. + 2. * gViaStack + gAirWayLength - gBiasDope nOpt = nOpt + gBondPathLength nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aStart = aCross((0.:(gRout3 - nOpt)) aLine) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aEnd = aCross((0.:(gRout3 - nOpt)) aLine) nPcap = nLength(aStart aEnd) / (gN23-1) nOpt = car(aStart) - (nPcap - 83.8) * gN23 / 2. aPcap = (nOpt:car(cdr(aStart))) nPcap = 83.8 aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset+gBiasWoffset) nR = car(cdr(aPcap)) aPoint = aCross((0.:nR) aLine) gMakeObject(gBiasBondW (0.:0.) nAngle aPoint gCV "OPEN") printf("Contact pitch on resistor side for R3 segment %11.3f\n" nPres) printf("Contact pitch on capacitor side for R3 segment %11.3f\n" nPcap) ; Reset Initial angle ;-------------------------- nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN23 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin3) aLine) aEnd = aCross((0.:gRout3) aLine) ; Implants ;-------------------------- ; Calculate implant stretch factor aScale = (0.:(nLength(aStart aEnd) - 20.)) aThreshold = (0.:10.) ; Stretch implant aShape = aStretch(gImplant aThreshold aScale) gMakeObject(aShape (0.:0.) nAngle aStart gCV "IMPL") ; Contact padstacks (capacitor side) ;-------------------------- gMakeObject(gTabDCend (0.:0.) nAngle aEnd gCV "MET1") ; Resistor endcap ;-------------------------- gMakeObject(gRendcap (0.:-gBiasDope) nAngle aStart gCV "POLY") ; Resistor zig-zags ;-------------------------- for( j 1 gNzigzag nOpt = (j - 1) * gZigzag gMakeObject(gRzigzag (0.:(nOpt - gBiasDope)) nAngle aStart gCV "POLY") ) ; ** for j ; Resistor endcap ;-------------------------- nOpt = nOpt + 77. - gBiasDope aShape = aXmirror(gRendcap) aShape = aYmirror(aShape) gMakeObject(aShape (0.:nOpt) nAngle aStart gCV "POLY") ; Contact padstacks (resistor side) ;-------------------------- gMakeObject(gTabDCres (0.:nOpt) nAngle aStart gCV "MET1") ; Poly contacts ;-------------------------- gPlaceObject(gPolyContact (0.:nOpt) nAngle aStart gCV) gPlaceObject(gPolyContact (0.:-gBiasDope) nAngle aStart gCV) ; Implant contacts ;-------------------------- gPlaceObject(gActContact (0.:-gEndVia) nAngle aEnd gCV) gPlaceObject(gActContact (0.:-gEndVia-gViaStack) nAngle aEnd gCV) nOpt = nOpt + gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aStart gCV) nOpt = nOpt + gViaStack gPlaceObject(gActContact (0.:nOpt) nAngle aStart gCV) aCon2 = aFindPoint((0.:nOpt) nAngle aStart) ; Routing for bond contacts ; on resistor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPres gCV) ; DC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AC pads on resistor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPres gCV) ; AirWays for DC pads on resistor side ;-------------------------- aCon1 = aPres ; nOpt = car(cdr(aPres)) - gAirWayLength ; aCon2 = aCross((0.:nOpt) aLine) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on resistor side ;-------------------------- nOpt = car(cdr(aPres)) + gBondPathLength + gAirWayLength aCon1 = aCross((0.:nOpt) aLine) aCap2 = aCon1 nOpt = car(cdr(aPres)) + gBondPathLength aCon2 = (car(aPres):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on resistor side ;-------------------------- aPres = ((car(aPres)-nPres):car(cdr(aPres))) ; Routing for bond contacts ; on capacitor side ;-------------------------- gPlaceObject(gBondPath (0.:0.) 0. aPcap gCV) ; AC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = gPadStack else nOpt = 0. ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; DC pads on capacitor side ;-------------------------- if( (mod( i 2) > 0) then nOpt = 3.*gPadStack else nOpt = 2.*gPadStack ) ; ** if ** gPlaceObject(gBondPad (0.:nOpt) 0. aPcap gCV) ; AirWays for DC pads on capacitor side ;-------------------------- nOpt = gRout3 - gEndVia - gViaStack aCon1 = aCross((0.:nOpt) aLine) nOpt = car(cdr(aPcap)) + gBondPathLength aCon2 = (car(aPcap):nOpt) aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; AirWays for AC pads on capacitor side ;-------------------------- aCon1 = aPcap nOpt = car(cdr(aPcap)) - gAirWayLength aCon2 = aCross((0.:nOpt) aLine) aCap1 = aCon2 aScale = (0.:(nLength(aCon1 aCon2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCon2 aCon1) - half_pi)) gMakeObject(aShape aCon1 0. (0.:0.) gCV "MET1") ; Increment bond pad position ; on capacitor side ;-------------------------- aPcap = ((car(aPcap)-nPcap):car(cdr(aPcap))) ; Capacitors ;-------------------------- aScale = (0.:(nLength(aCap1 aCap2) - 2.)) aThreshold = (0.:1.) aShape = aStretch(gAirWay aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "MET1") ; Nitride openings ;-------------------------- aShape = aStretch(gNitride aThreshold aScale) aShape = aRotate(aShape (nAngle2H(aCap2 aCap1) - half_pi)) gMakeObject(aShape aCap1 0. (0.:0.) gCV "NITR") ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ; Reset Initial angle ;-------------------------- nAngle = gPhiInit - gPhiPitch23/2. ; Loop over strips ;-------------------------- for( i 1 gN23+1 ; Parameters common to all geometries ;-------------------------- ; Calculate radial line parameters aLine = aFocusLine(gF nAngle) ; Calculate strip end points aStart = aCross((0.:gRin3) aLine) aEnd = aCross((0.:gRout3) aLine) ; Pstop implants ;-------------------------- aScale = (0.:(nLength((0.:car(cdr(aStart))) (0.:car(cdr(aEnd)))) - 20.)) aThreshold = (0.:10.) aShape = aStretch(gPstop aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i < gN23+1 dbCreatePath(gCV "STOP" aShape 6.)) aShape = aYmirror(gPstop) aShape = aStretch(aShape aThreshold aScale) aShape = aXskew(aShape nAngle) aShape = aOffset(aShape aStart) if( i > 1 dbCreatePath(gCV "STOP" aShape 6.)) ; Increment strip rotation angle ;-------------------------- nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawR3 ** procedure( gDrawBias0() ;-------------------------- let( (aRing nAngle nR aLine aPoint) aRing = '() nR = gRin0 - gOffI0 nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi; aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "IMPL" aRing gRingI0) dbCreatePath(gCV "MET1" aRing gRingM0) aRing = '() nR = gRin0 - gOffI0 - gBiasRoffset nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "OPEN" aRing gRingW0) nAngle = gPhiInit + gPhiPitch01 / 2. nR = gRin0 - gBiasVia for( i 1 gN01-1 aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBias0 ** procedure( gDrawBias01() ;-------------------------- let( (aRing nAngle nR aLine aPoint aShape) aRing = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail01) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntI nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntM nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "MET1") nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail01) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntI) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntM) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "MET1") dbCreatePath(gCV "IMPL" aRing gBiasI) dbCreatePath(gCV "MET1" aRing gBiasM) aRing = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail01) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail01) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "OPEN" aRing gBiasW) nAngle = gPhiInit + gPhiPitch01 / 2. for( i 1 gN01-1 aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:(gRout0+gBiasVia)) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) aPoint = aCross((0.:(gRin1-gBiasVia)) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBias01 ** procedure( gDrawBias12() ;-------------------------- let( (aRing nAngle nR aLine aPoint) aRing = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail12) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntI nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntM nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "MET1") nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail12) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntI) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntM) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "MET1") dbCreatePath(gCV "IMPL" aRing gBiasI) dbCreatePath(gCV "MET1" aRing gBiasM) aRing = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail12) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail12) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "OPEN" aRing gBiasW) nAngle = gPhiInit + gPhiPitch23 / 2. for( i 1 gN23-1 aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:(gRin2-gBiasVia)) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) aPoint = (car(aPoint):(gRout1+gBiasVia)) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBias12 ** procedure( gDrawBias23() ;-------------------------- let( (aRing nAngle nR aLine aPoint) aRing = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail23) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntI nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aXskew(gBiasShuntM nAngle) gMakeObject(aShape (-nR:0.) 0. aPoint gCV "MET1") nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine gOffI0+gWallOffset) aPoint = aCross((0.:gBiasRail23) aLine) aRing = cons(aPoint aRing) nR = gRingI0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntI) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "IMPL") nR = gRingM0 / 2. * (1./ cos(nAngle) - 1.) aShape = aYmirror(gBiasShuntM) aShape = aXskew(aShape nAngle) gMakeObject(aShape (nR:0.) 0. aPoint gCV "MET1") dbCreatePath(gCV "IMPL" aRing gBiasI) dbCreatePath(gCV "MET1" aRing gBiasM) aRing = '() nAngle = gPhiInit - gPhiPitch23 / 2. aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail23) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi + gPhiPitch23 / 2. aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:gBiasRail23) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "OPEN" aRing gBiasW) nAngle = gPhiInit + gPhiPitch23 / 2. for( i 1 gN23-1 aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:(gRout2+gBiasVia)) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) aPoint = aCross((0.:(gRin3-gBiasVia)) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBias23 ** procedure( gDrawBias3() ;-------------------------- let( (aRing nAngle nR aLine aPoint) aRing = '() nR = gRout3 + gOffI0 nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "IMPL" aRing gRingI0) dbCreatePath(gCV "MET1" aRing gRingM0) aRing = '() nR = gRout3 + gOffI0 + gBiasRoffset nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) aRing = cons(aPoint aRing) dbCreatePath(gCV "OPEN" aRing gRingW0) nAngle = gPhiInit + gPhiPitch23 / 2. nR = gRout3 + gBiasVia for( i 1 gN23-1 aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nR) aLine) gPlaceObject(gActContact (0.:0.) nAngle aPoint gCV) nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBias3 ** procedure( gDrawGuard0N(nOffI nOffS nOffM nRingI nRingS nRingM) ;-------------------------- let( (aRingI aRingS aRingM nRI nRS nRM nAngle aLine aPointI aPointS aPointM) aRingI = '() aRingM = '() aRingS = '() nRI = gRin0 - nOffI nRS = gRin0 - nOffS nRM = gRin0 - nOffM nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN01 aLine = aFocusLine(gF nAngle) aPointI = aCross((0.:nRI) aLine) aPointS = aCross((0.:nRS) aLine) aPointM = aCross((0.:nRM) aLine) aRingI = cons(aPointI aRingI) aRingS = cons(aPointS aRingS) aRingM = cons(aPointM aRingM) nAngle = nAngle + gPhiPitch01 ) ; ** for i ** dbCreatePath(gCV "IMPL" aRingI nRingI) dbCreatePath(gCV "STOP" aRingS nRingS) dbCreatePath(gCV "MET1" aRingM nRingM) nAngle = gPhiInit + gPhiPitch01/2. ; Loop over strips ;-------------------------- for( i 1 gN01-1 aLine = aFocusLine(gF nAngle) aPointI = aCross((0.:nRI) aLine) if( (mod( (i-1) 2) > 0) then nil else gPlaceObject(gActContact (0.:0.) nAngle aPointI gCV) ) ; ** if ** nAngle = nAngle + gPhiPitch01 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawGuard0N ** procedure( gDrawGuard3N(nOffI nOffS nOffM nRingI nRingS nRingM) ;-------------------------- let( (aRingI aRingS aRingM nRI nRS nRM nAngle aLine aPointI aPointS aPointM) aRingI = '() aRingS = '() aRingM = '() nRI = gRout3 + nOffI nRS = gRout3 + nOffS nRM = gRout3 + nOffM nAngle = gPhiInit ; Loop over strips ;-------------------------- for( i 1 gN23 aLine = aFocusLine(gF nAngle) aPointI = aCross((0.:nRI) aLine) aPointS = aCross((0.:nRS) aLine) aPointM = aCross((0.:nRM) aLine) aRingI = cons(aPointI aRingI) aRingS = cons(aPointS aRingS) aRingM = cons(aPointM aRingM) nAngle = nAngle + gPhiPitch23 ) ; ** for i ** dbCreatePath(gCV "IMPL" aRingI nRingI) dbCreatePath(gCV "STOP" aRingS nRingS) dbCreatePath(gCV "MET1" aRingM nRingM) nAngle = gPhiInit + gPhiPitch23/2. ; Loop over strips ;-------------------------- for( i 1 gN23-1 aLine = aFocusLine(gF nAngle) aPointI = aCross((0.:nRI) aLine) if( (mod( (i-1) 2) > 0) then nil else gPlaceObject(gActContact (0.:0.) nAngle aPointI gCV) ) ; ** if ** nAngle = nAngle + gPhiPitch23 ) ; ** for i ** ) ; ** let ** ) ; ** gDrawGuard3N ** procedure( gDrawWall(nAngle nOffI nOffS nOffM nRingI nRingS nRingM nViaOffset) ;-------------------------- let( (aWall nRH nRL aLine aPointH aPointL nDots nTail) nRH = gRout3-gRbend nRL = gRin0+gRbend aWall = '() aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nOffM+gWallOffset) aPointH = aCross((0.:nRH) aLine) aPointL = aCross((0.:nRL) aLine) aWall = cons(aPointH aWall) aWall = cons(aPointL aWall) dbCreatePath(gCV "MET1" aWall nRingM) aWall = '() aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nOffS+gWallOffset) aPointH = aCross((0.:nRH) aLine) aPointL = aCross((0.:nRL) aLine) aWall = cons(aPointH aWall) aWall = cons(aPointL aWall) dbCreatePath(gCV "STOP" aWall nRingS) aWall = '() aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nOffI+gWallOffset) aPointH = aCross((0.:nRH) aLine) aPointL = aCross((0.:nRL) aLine) aWall = cons(aPointH aWall) aWall = cons(aPointL aWall) dbCreatePath(gCV "IMPL" aWall nRingI) aLine = aParallel(aLine nViaOffset) aPointH = aCross((0.:nRH) aLine) aPointL = aCross((0.:nRL) aLine) nDots = (floor nLength(aPointH aPointL) / gViaInterval) nTail = (nLength(aPointH aPointL) - gViaInterval * nDots) / 2. aPointL = aSlideUp(aLine aPointL nTail) for( i 0 nDots gPlaceObject(gActContact (0.:0.) nAngle aPointL gCV) aPointL = aSlideUp(aLine aPointL gViaInterval) ) ; ** for ** ) ; ** let ** ) ; ** gDrawWall ** procedure( gFindABCD() ;-------------------------- let( (nR nAngle aLine aTMP) nAngle = gPhiInit nR = gWallOffset + gDelta aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRin0 - gDelta gPointA = aCross((0.:nR) aLine) nR = gRout3 + gDelta gPointB = aCross((0.:nR) aLine) nAngle = gPhiInit + gPhi nR = gWallOffset + gDelta aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRout3 + gDelta gPointC = aCross((0.:nR) aLine) nR = gRin0 - gDelta gPointD = aCross((0.:nR) aLine) printf("AX:AY %11.3f : %11.3f\n" car(gPointA) car(cdr(gPointA))) printf("BX:BY %11.3f : %11.3f\n" car(gPointB) car(cdr(gPointB))) printf("CX:CY %11.3f : %11.3f\n" car(gPointC) car(cdr(gPointC))) printf("DX:DY %11.3f : %11.3f\n" car(gPointD) car(cdr(gPointD))) ) ; ** let ** ) ; ** gFindABCD ** procedure( gDrawCornerA(nOffset nWidth tLayer) ;-------------------------- let( (nR nPar nAngle aLine aPointR1 aPointR2 aPointW1 aPointW2 nX0 nY0 nXval nYval aShape1 aShape2 aTMP) aShape1 = '() aShape2 = '() nX0 = car(gPointA) nY0 = car(cdr(gPointA)) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRin0 - nOffset - nWidth/2. nAngle = gPhiInit + gGap/gRin0 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) aTMP = aPointR1 nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset + nWidth/2. aLine = aParallel(aLine nR) nR = gRin0 + gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRin0 + gRbend + gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset - nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset + nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointA - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointA) nR = (two_pi + nAngleABC(aPointR2 gPointA aPointW2)) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 2 18 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape1 = cons((nXval:nYval) aShape1) ) ; ** for i ** aShape1 = cons(aPointW1 aShape1) aShape1 = cons(aPointR1 aShape1) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRin0 - nOffset + nWidth/2. nAngle = gPhiInit + gGap/gRin0 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset - nWidth/2. aLine = aParallel(aLine nR) nR = gRin0 + gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRin0 + gRbend + gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset + nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset - nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointA - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointA) nR = (two_pi + nAngleABC(aPointR2 gPointA aPointW2)) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 2 18 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape2 = cons((nXval:nYval) aShape2) ) ; ** for i ** aShape2 = cons(aPointW1 aShape2) aShape2 = cons(aPointR1 aShape2) for( i 1 length(aShape2) aShape1 = cons(nthelem(i aShape2) aShape1) ) ; ** for i ** aShape1 = cons(aTMP aShape1) dbCreatePolygon(gCV tLayer aShape1) ) ; ** let ** ) ; ** gDrawCornerA ** procedure( gDrawCornerB(nOffset nWidth tLayer) ;-------------------------- let( (nR nPar nAngle aLine aPointR1 aPointR2 aPointW1 aPointW2 nX0 nY0 nXval nYval aShape1 aShape2 aTMP) aShape1 = '() aShape2 = '() nX0 = car(gPointB) nY0 = car(cdr(gPointB)) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRout3 + nOffset + nWidth/2. nAngle = gPhiInit + gGap/gRout3 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) aTMP = aPointR1 nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset + nWidth/2. aLine = aParallel(aLine nR) nR = gRout3 - gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRout3 - gRbend - gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset + nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset + nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointB - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointB) nR = abs(nAngleABC(aPointR2 gPointB aPointW2)) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 19 nXval = nPar * cos(nAngle - i*nR) + nX0 nYval = nPar * sin(nAngle - i*nR) + nY0 aShape1 = cons((nXval:nYval) aShape1) ) ; ** for i ** aShape1 = cons(aPointW1 aShape1) aShape1 = cons(aPointR1 aShape1) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRout3 + nOffset - nWidth/2. nAngle = gPhiInit + gGap/gRout3 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset - nWidth/2. aLine = aParallel(aLine nR) nR = gRout3 - gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRout3 - gRbend - gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset - nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset - nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointB - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointB) nR = abs(nAngleABC(aPointR2 gPointB aPointW2)) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 19 nXval = nPar * cos(nAngle - i*nR) + nX0 nYval = nPar * sin(nAngle - i*nR) + nY0 aShape2 = cons((nXval:nYval) aShape2) ) ; ** for i ** aShape2 = cons(aPointW1 aShape2) aShape2 = cons(aPointR1 aShape2) for( i 1 length(aShape2) aShape1 = cons(nthelem(i aShape2) aShape1) ) ; ** for i ** aShape1 = cons(aTMP aShape1) dbCreatePolygon(gCV tLayer aShape1) ) ; ** let ** ) ; ** gDrawCornerB ** procedure( gDrawCornerC(nOffset nWidth tLayer) ;-------------------------- let( (nR nPar nAngle aLine aPointR1 aPointR2 aPointW1 aPointW2 nX0 nY0 nXval nYval aShape1 aShape2 aTMP) aShape1 = '() aShape2 = '() nX0 = car(gPointC) nY0 = car(cdr(gPointC)) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRout3 + nOffset + nWidth/2. nAngle = gPhiInit + gPhi - gGap/gRout3 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) aTMP = aPointR1 nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset + nWidth/2. aLine = aParallel(aLine nR) nR = gRout3 - gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRout3 - gRbend - gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset + nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset + nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointC - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointC) nR = nAngleABC(aPointR2 gPointC aPointW2) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 19 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape1 = cons((nXval:nYval) aShape1) ) ; ** for i ** aShape1 = cons(aPointW1 aShape1) aShape1 = cons(aPointR1 aShape1) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRout3 + nOffset - nWidth/2. nAngle = gPhiInit + gPhi - gGap/gRout3 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset - nWidth/2. aLine = aParallel(aLine nR) nR = gRout3 - gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRout3 - gRbend - gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset - nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset - nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointC - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointC) nR = nAngleABC(aPointR2 gPointC aPointW2) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 19 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape2 = cons((nXval:nYval) aShape2) ) ; ** for i ** aShape2 = cons(aPointW1 aShape2) aShape2 = cons(aPointR1 aShape2) for( i 1 length(aShape2) aShape1 = cons(nthelem(i aShape2) aShape1) ) ; ** for i ** aShape1 = cons(aTMP aShape1) dbCreatePolygon(gCV tLayer aShape1) ) ; ** let ** ) ; ** gDrawCornerC ** procedure( gDrawCornerD(nOffset nWidth tLayer) ;-------------------------- let( (nR nPar nAngle aLine aPointR1 aPointR2 aPointW1 aPointW2 nX0 nY0 nXval nYval aShape1 aShape2 aTMP) aShape1 = '() aShape2 = '() nX0 = car(gPointD) nY0 = car(cdr(gPointD)) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRin0 - nOffset - nWidth/2. nAngle = gPhiInit + gPhi - gGap/gRin0 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) aTMP = aPointR1 nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape1 = cons(aPointR1 aShape1) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset + nWidth/2. aLine = aParallel(aLine nR) nR = gRin0 + gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRin0 + gRbend + gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset - nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset + nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointD - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointD) nR = nAngleABC(aPointR2 gPointD aPointW2) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 3 18 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape1 = cons((nXval:nYval) aShape1) ) ; ** for i ** aShape1 = cons(aPointW1 aShape1) aShape1 = cons(aPointR1 aShape1) ; Find aPointR1 ; initial point on the radial path ;-------------------------- nR = gRin0 - nOffset + nWidth/2. nAngle = gPhiInit + gPhi - gGap/gRin0 aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPointR1 = aCross((0.:nR) aLine) aShape2 = cons(aPointR1 aShape2) ; Find aPointW1 ; initial point on the wall path ;-------------------------- nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset - nWidth/2. aLine = aParallel(aLine nR) nR = gRin0 + gRbend aPointW1 = aCross((0.:nR) aLine) nR = gRin0 + gRbend + gGap aPointR1 = aCross((0.:nR) aLine) ; re-use variable ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset + nWidth/2. aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- nR = gWallOffset + nOffset - nWidth/2. aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointD - W2 ;-------------------------- nAngle = nAngle2H(aPointR2 gPointD) nR = nAngleABC(aPointR2 gPointD aPointW2) / 20. ; printf("C: %11.3f degrees\n" nR * 20./degrees) nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 3 18 nXval = nPar * cos(nAngle + i*nR) + nX0 nYval = nPar * sin(nAngle + i*nR) + nY0 aShape2 = cons((nXval:nYval) aShape2) ) ; ** for i ** aShape2 = cons(aPointW1 aShape2) aShape2 = cons(aPointR1 aShape2) for( i 1 length(aShape2) aShape1 = cons(nthelem(i aShape2) aShape1) ) ; ** for i ** aShape1 = cons(aTMP aShape1) dbCreatePolygon(gCV tLayer aShape1) ) ; ** let ** ) ; ** gDrawCornerD ** procedure( gDrawAvias(nOffset) ;-------------------------- let( (nR nPar nAngle aLine aPointR2 aPointW2 nX0 nY0 nXval nYval nDots nTail) nAngle = gPhiInit nX0 = car(gPointA) nY0 = car(cdr(gPointA)) ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointA - W2 ;-------------------------- ; length of segment nR = (two_pi + nAngleABC(aPointR2 gPointA aPointW2)) * nOffset ; number of Vias nDots = (floor (nR - gViaInterval) / gViaInterval) nTail = (nR - gViaInterval * nDots) / 2. nAngle = nAngle2H(aPointR2 gPointA) + nTail / nOffset nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 nDots nXval = nPar * cos(nAngle + i * gViaInterval / nOffset) + nX0 nYval = nPar * sin(nAngle + i * gViaInterval / nOffset) + nY0 gPlaceObject(gActContact (0.:0.) 0. (nXval:nYval) gCV) ) ; ** for i ** ) ; ** let ** ) ; ** gDrawAvias ** procedure( gDrawBvias(nOffset) ;-------------------------- let( (nR nPar nAngle aLine aPointR2 aPointW2 nX0 nY0 nXval nYval nDots nTail) nAngle = gPhiInit nX0 = car(gPointB) nY0 = car(cdr(gPointB)) ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointB - W2 ;-------------------------- ; length of segment nR = abs(nAngleABC(aPointR2 gPointB aPointW2)) * nOffset ; number of Vias nDots = (floor (nR - gViaInterval) / gViaInterval) nTail = (nR - gViaInterval * nDots) / 2. nAngle = nAngle2H(aPointR2 gPointB) - nTail / nOffset nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 nDots nXval = nPar * cos(nAngle - i * gViaInterval / nOffset) + nX0 nYval = nPar * sin(nAngle - i * gViaInterval / nOffset) + nY0 gPlaceObject(gActContact (0.:0.) 0. (nXval:nYval) gCV) ) ; ** for i ** ) ; ** let ** ) ; ** gDrawBvias ** procedure( gDrawCvias(nOffset) ;-------------------------- let( (nR nPar nAngle aLine aPointR2 aPointW2 nX0 nY0 nXval nYval nDots nTail) nAngle = gPhiInit + gPhi nX0 = car(gPointC) nY0 = car(cdr(gPointC)) ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRout3 + nOffset aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset aLine = aParallel(aLine nR) nR = gRout3 + gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointC - W2 ;-------------------------- ; length of segment nR = nAngleABC(aPointR2 gPointC aPointW2) * nOffset ; number of Vias nDots = (floor (nR - gViaInterval) / gViaInterval) nTail = (nR - gViaInterval * nDots) / 2. nAngle = nAngle2H(aPointR2 gPointC) + nTail / nOffset nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 nDots nXval = nPar * cos(nAngle + i * gViaInterval / nOffset) + nX0 nYval = nPar * sin(nAngle + i * gViaInterval / nOffset) + nY0 gPlaceObject(gActContact (0.:0.) 0. (nXval:nYval) gCV) ) ; ** for i ** ) ; ** let ** ) ; ** gDrawCvias ** procedure( gDrawDvias(nOffset) ;-------------------------- let( (nR nPar nAngle aLine aPointR2 aPointW2 nX0 nY0 nXval nYval nDots nTail) nAngle = gPhiInit + gPhi nX0 = car(gPointD) nY0 = car(cdr(gPointD)) ; Find aPointR2 ; next point on the radial path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + gDelta aLine = aParallel(aLine nR) nR = gRin0 - nOffset aPointR2 = aCross((0.:nR) aLine) ; Find aPointW2 ; next point on the wall path ;-------------------------- aLine = aFocusLine(gF nAngle) nR = gWallOffset + nOffset aLine = aParallel(aLine nR) nR = gRin0 - gDelta aPointW2 = aCross((0.:nR) aLine) ; Find angle R2 - gPointD - W2 ;-------------------------- ; length of segment nR = abs(nAngleABC(aPointR2 gPointD aPointW2)) * nOffset ; number of Vias nDots = (floor (nR - gViaInterval) / gViaInterval) nTail = (nR - gViaInterval * nDots) / 2. nAngle = nAngle2H(aPointR2 gPointD) - nTail / nOffset nXval = (nX0-car(aPointR2))*(nX0-car(aPointR2)) nYval = (nY0-car(cdr(aPointR2)))*(nY0-car(cdr(aPointR2))) nPar = sqrt(nXval + nYval) for( i 0 nDots nXval = nPar * cos(nAngle - i * gViaInterval / nOffset) + nX0 nYval = nPar * sin(nAngle - i * gViaInterval / nOffset) + nY0 gPlaceObject(gActContact (0.:0.) 0. (nXval:nYval) gCV) ) ; ** for i ** ) ; ** let ** ) ; ** gDrawDvias ** procedure( gDrawHline(nOff nWidth tLayer) ;-------------------------- let( (aShape nAngle aLine aPoint) aShape = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nOff) aLine) aShape = cons(aPoint aShape) nAngle = gPhiInit + gPhi aLine = aFocusLine(gF nAngle) aPoint = aCross((0.:nOff) aLine) aShape = cons(aPoint aShape) dbCreatePath(gCV tLayer aShape nWidth) ) ; ** let ** ) ; ** gDrawHline ** procedure( gDrawVline(nAngle nOff nWidth tLayer) ;-------------------------- let( (aShape aLine aPoint) aShape = '() aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine nOff) aPoint = aCross((0.:gRin0) aLine) aShape = cons(aPoint aShape) aPoint = aCross((0.:gRout3) aLine) aShape = cons(aPoint aShape) dbCreatePath(gCV tLayer aShape nWidth) ) ; ** let ** ) ; ** gDrawVline ** procedure( gDrawSawCut() ;-------------------------- let( (aCurf nAngle aLine aPoint aTMP) aCurf = '() nAngle = gPhiInit aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine (gCurfOffset+gRingE/2.+gWallOffset)) ; Point A ;-------------------------- aPoint = aCross((0.:(gRin0-gCurfOffset-gRingE/2.)) aLine) aCurf = cons(aPoint aCurf) aTMP = aPoint ; Point B ;-------------------------- aPoint = aCross((0.:(gRout3+gCurfOffset+gRingE/2.)) aLine) aCurf = cons(aPoint aCurf) nAngle = gPhiInit+gPhi aLine = aFocusLine(gF nAngle) aLine = aParallel(aLine (gCurfOffset+gRingE/2.+gWallOffset)) ; Point C ;-------------------------- aPoint = aCross((0.:(gRout3+gCurfOffset+gRingE/2.)) aLine) aCurf = cons(aPoint aCurf) ; Point D ;-------------------------- aPoint = aCross((0.:(gRin0-gCurfOffset-gRingE/2.)) aLine) aCurf = cons(aPoint aCurf) aCurf = cons(aTMP aCurf) dbCreatePath(gCV "OPEN" aCurf gCurfWidth) gDrawCornerA(gCurfOffset+gRingE/2. gCurfWidth "OPEN") gDrawCornerB(gCurfOffset+gRingE/2. gCurfWidth "OPEN") gDrawCornerC(gCurfOffset+gRingE/2. gCurfWidth "OPEN") gDrawCornerD(gCurfOffset+gRingE/2. gCurfWidth "OPEN") gDrawHline(gRin0-gCurfOffset gRingE "EDGE") gDrawHline(gRout3+gCurfOffset gRingE "EDGE") gDrawHline(gRin0-gFieldOff gFieldM "MET1") gDrawHline(gRout3+gFieldOff gFieldM "MET1") gDrawVline(gPhiInit gCurfOffset+gWallOffset gRingE "EDGE") gDrawVline(gPhiInit+gPhi gCurfOffset+gWallOffset gRingE "EDGE") gDrawVline(gPhiInit gFieldOff+gWallOffset gFieldM "MET1") gDrawVline(gPhiInit+gPhi gFieldOff+gWallOffset gFieldM "MET1") gDrawCornerA(gCurfOffset gRingE "EDGE") gDrawCornerB(gCurfOffset gRingE "EDGE") gDrawCornerC(gCurfOffset gRingE "EDGE") gDrawCornerD(gCurfOffset gRingE "EDGE") gDrawCornerA(gFieldOff gFieldM "MET1") gDrawCornerB(gFieldOff gFieldM "MET1") gDrawCornerC(gFieldOff gFieldM "MET1") gDrawCornerD(gFieldOff gFieldM "MET1") ) ; ** let ** ) ; ** gDrawSawCut ** procedure( gDrawDigit(nValue aPoint tLayer) let( (aShape) aShape = gNum0 if( (nValue == 1) then aShape = gNum1) if( (nValue == 2) then aShape = gNum2) if( (nValue == 3) then aShape = gNum3) if( (nValue == 4) then aShape = gNum4) if( (nValue == 5) then aShape = gNum5) if( (nValue == 6) then aShape = gNum6) if( (nValue == 7) then aShape = gNum7) if( (nValue == 8) then aShape = gNum8) if( (nValue == 9) then aShape = gNum9) aShape = aOffset(aShape aPoint) dbCreatePolygon(gCV tLayer aShape) ) ; ** let ** ) ; ** gDrawDigit ** procedure( gDrawNumber(nValue aPoint tLayer) ;-------------------------- let( (nTMP aTMP nIndex) nTMP = nValue aTMP = aPoint ; Draw Pointer ;--- dbCreatePolygon(gCV tLayer aOffset(gNumP aTMP)) ; Draw Thousands ;--- nIndex = (nTMP - mod( nTMP 1000)) / 1000 aTMP = ((car(aTMP)+25.):0.) gDrawDigit( nIndex aTMP tLayer) ; Draw Hundreds ;--- nTMP = mod( nTMP 1000) nIndex = (nTMP - mod( nTMP 100)) / 100 aTMP = ((car(aTMP)+gNumOff):0.) gDrawDigit( nIndex aTMP tLayer) ; Draw Tens ;--- nTMP = mod( nTMP 100) nIndex = (nTMP - mod( nTMP 10)) / 10 aTMP = ((car(aTMP)+gNumOff):0.) gDrawDigit( nIndex aTMP tLayer) ; Draw Units ;--- nIndex = mod( nTMP 10) aTMP = ((car(aTMP)+gNumOff):0.) gDrawDigit( nIndex aTMP tLayer) ) ; ** let ** ) ; ** gDrawNumber ** procedure( gDrawContNum(nFirst nValue nPitch tLayer) ;-------------------------- let( (aPoint) aPoint = (0.:0.) ; 1st contact ;--- gDrawNumber(nFirst aPoint tLayer) ; Loop over contacts ;--- for( i nFirst nValue if( (mod( i 10) == 0) then gDrawNumber(i aPoint tLayer) ) ; ** if mod ** aPoint = ((car(aPoint)+nPitch):0.) ) ; ** for i ** ) ; ** let ** ) ; ** gDrawContNum ** procedure( gDrawMGR() ;-------------------------- gDrawGuard0N(gOffI1 gOffS1 gOffM1 gRingI gRingS gRingM1) gDrawGuard0N(gOffI2 gOffS2 gOffM2 gRingI gRingS gRingM2) gDrawGuard0N(gOffI3 gOffS3 gOffM3 gRingI gRingS gRingM3) gDrawGuard0N(gOffI4 gOffS4 gOffM4 gRingI gRingS gRingM4) gDrawGuard0N(gOffI5 gOffS5 gOffM5 gRingI gRingS gRingM5) gDrawGuard0N(gOffI6 gOffS6 gOffM6 gRingI gRingS gRingM6) gDrawGuard0N(gOffI7 gOffS7 gOffM7 gRingI gRingS gRingM7) gDrawGuard0N(gOffI8 gOffS8 gOffM8 gRingI gRingS gRingM8) gDrawGuard3N(gOffI1 gOffS1 gOffM1 gRingI gRingS gRingM1) gDrawGuard3N(gOffI2 gOffS2 gOffM2 gRingI gRingS gRingM2) gDrawGuard3N(gOffI3 gOffS3 gOffM3 gRingI gRingS gRingM3) gDrawGuard3N(gOffI4 gOffS4 gOffM4 gRingI gRingS gRingM4) gDrawGuard3N(gOffI5 gOffS5 gOffM5 gRingI gRingS gRingM5) gDrawGuard3N(gOffI6 gOffS6 gOffM6 gRingI gRingS gRingM6) gDrawGuard3N(gOffI7 gOffS7 gOffM7 gRingI gRingS gRingM7) gDrawGuard3N(gOffI8 gOffS8 gOffM8 gRingI gRingS gRingM8) gDrawWall(gPhiInit gOffI0 gOffS1 gOffM0 gRingI0 gRingS gRingM0 gVia0-gOffI0) gDrawWall(gPhiInit gOffI1 gOffS1 gOffM1 gRingI gRingS gRingM1 0.) gDrawWall(gPhiInit gOffI2 gOffS2 gOffM2 gRingI gRingS gRingM2 0.) gDrawWall(gPhiInit gOffI3 gOffS3 gOffM3 gRingI gRingS gRingM3 0.) gDrawWall(gPhiInit gOffI4 gOffS4 gOffM4 gRingI gRingS gRingM4 0.) gDrawWall(gPhiInit gOffI5 gOffS5 gOffM5 gRingI gRingS gRingM5 0.) gDrawWall(gPhiInit gOffI6 gOffS6 gOffM6 gRingI gRingS gRingM6 0.) gDrawWall(gPhiInit gOffI7 gOffS7 gOffM7 gRingI gRingS gRingM7 0.) gDrawWall(gPhiInit gOffI8 gOffS8 gOffM8 gRingI gRingS gRingM8 0.) gDrawWall(gPhiInit+gPhi gOffI0 gOffS1 gOffM0 gRingI0 gRingS gRingM0 gVia0-gOffI0) gDrawWall(gPhiInit+gPhi gOffI1 gOffS1 gOffM1 gRingI gRingS gRingM1 0.) gDrawWall(gPhiInit+gPhi gOffI2 gOffS2 gOffM2 gRingI gRingS gRingM2 0.) gDrawWall(gPhiInit+gPhi gOffI3 gOffS3 gOffM3 gRingI gRingS gRingM3 0.) gDrawWall(gPhiInit+gPhi gOffI4 gOffS4 gOffM4 gRingI gRingS gRingM4 0.) gDrawWall(gPhiInit+gPhi gOffI5 gOffS5 gOffM5 gRingI gRingS gRingM5 0.) gDrawWall(gPhiInit+gPhi gOffI6 gOffS6 gOffM6 gRingI gRingS gRingM6 0.) gDrawWall(gPhiInit+gPhi gOffI7 gOffS7 gOffM7 gRingI gRingS gRingM7 0.) gDrawWall(gPhiInit+gPhi gOffI8 gOffS8 gOffM8 gRingI gRingS gRingM8 0.) gDrawCornerA(gOffI0 gRingI0 "IMPL") gDrawCornerA(gOffI1 gRingI "IMPL") gDrawCornerA(gOffI2 gRingI "IMPL") gDrawCornerA(gOffI3 gRingI "IMPL") gDrawCornerA(gOffI4 gRingI "IMPL") gDrawCornerA(gOffI5 gRingI "IMPL") gDrawCornerA(gOffI6 gRingI "IMPL") gDrawCornerA(gOffI7 gRingI "IMPL") gDrawCornerA(gOffI8 gRingI "IMPL") gDrawCornerA(gOffM0 gRingM0 "MET1") gDrawCornerA(gOffM1 gRingM1 "MET1") gDrawCornerA(gOffM2 gRingM2 "MET1") gDrawCornerA(gOffM3 gRingM3 "MET1") gDrawCornerA(gOffM4 gRingM4 "MET1") gDrawCornerA(gOffM5 gRingM5 "MET1") gDrawCornerA(gOffM6 gRingM6 "MET1") gDrawCornerA(gOffM7 gRingM7 "MET1") gDrawCornerA(gOffM8 gRingM8 "MET1") gDrawCornerA(gOffS1 gRingS "STOP") gDrawCornerA(gOffS2 gRingS "STOP") gDrawCornerA(gOffS3 gRingS "STOP") gDrawCornerA(gOffS4 gRingS "STOP") gDrawCornerA(gOffS5 gRingS "STOP") gDrawCornerA(gOffS6 gRingS "STOP") gDrawCornerA(gOffS7 gRingS "STOP") gDrawCornerA(gOffS8 gRingS "STOP") gDrawCornerB(gOffI0 gRingI0 "IMPL") gDrawCornerB(gOffI1 gRingI "IMPL") gDrawCornerB(gOffI2 gRingI "IMPL") gDrawCornerB(gOffI3 gRingI "IMPL") gDrawCornerB(gOffI4 gRingI "IMPL") gDrawCornerB(gOffI5 gRingI "IMPL") gDrawCornerB(gOffI6 gRingI "IMPL") gDrawCornerB(gOffI7 gRingI "IMPL") gDrawCornerB(gOffI8 gRingI "IMPL") gDrawCornerB(gOffM0 gRingM0 "MET1") gDrawCornerB(gOffM1 gRingM1 "MET1") gDrawCornerB(gOffM2 gRingM2 "MET1") gDrawCornerB(gOffM3 gRingM3 "MET1") gDrawCornerB(gOffM4 gRingM4 "MET1") gDrawCornerB(gOffM5 gRingM5 "MET1") gDrawCornerB(gOffM6 gRingM6 "MET1") gDrawCornerB(gOffM7 gRingM7 "MET1") gDrawCornerB(gOffM8 gRingM8 "MET1") gDrawCornerB(gOffS1 gRingS "STOP") gDrawCornerB(gOffS2 gRingS "STOP") gDrawCornerB(gOffS3 gRingS "STOP") gDrawCornerB(gOffS4 gRingS "STOP") gDrawCornerB(gOffS5 gRingS "STOP") gDrawCornerB(gOffS6 gRingS "STOP") gDrawCornerB(gOffS7 gRingS "STOP") gDrawCornerB(gOffS8 gRingS "STOP") gDrawCornerC(gOffI0 gRingI0 "IMPL") gDrawCornerC(gOffI1 gRingI "IMPL") gDrawCornerC(gOffI2 gRingI "IMPL") gDrawCornerC(gOffI3 gRingI "IMPL") gDrawCornerC(gOffI4 gRingI "IMPL") gDrawCornerC(gOffI5 gRingI "IMPL") gDrawCornerC(gOffI6 gRingI "IMPL") gDrawCornerC(gOffI7 gRingI "IMPL") gDrawCornerC(gOffI8 gRingI "IMPL") gDrawCornerC(gOffM0 gRingM0 "MET1") gDrawCornerC(gOffM1 gRingM1 "MET1") gDrawCornerC(gOffM2 gRingM2 "MET1") gDrawCornerC(gOffM3 gRingM3 "MET1") gDrawCornerC(gOffM4 gRingM4 "MET1") gDrawCornerC(gOffM5 gRingM5 "MET1") gDrawCornerC(gOffM6 gRingM6 "MET1") gDrawCornerC(gOffM7 gRingM7 "MET1") gDrawCornerC(gOffM8 gRingM8 "MET1") gDrawCornerC(gOffS1 gRingS "STOP") gDrawCornerC(gOffS2 gRingS "STOP") gDrawCornerC(gOffS3 gRingS "STOP") gDrawCornerC(gOffS4 gRingS "STOP") gDrawCornerC(gOffS5 gRingS "STOP") gDrawCornerC(gOffS6 gRingS "STOP") gDrawCornerC(gOffS7 gRingS "STOP") gDrawCornerC(gOffS8 gRingS "STOP") gDrawCornerD(gOffI0 gRingI0 "IMPL") gDrawCornerD(gOffI1 gRingI "IMPL") gDrawCornerD(gOffI2 gRingI "IMPL") gDrawCornerD(gOffI3 gRingI "IMPL") gDrawCornerD(gOffI4 gRingI "IMPL") gDrawCornerD(gOffI5 gRingI "IMPL") gDrawCornerD(gOffI6 gRingI "IMPL") gDrawCornerD(gOffI7 gRingI "IMPL") gDrawCornerD(gOffI8 gRingI "IMPL") gDrawCornerD(gOffM0 gRingM0 "MET1") gDrawCornerD(gOffM1 gRingM1 "MET1") gDrawCornerD(gOffM2 gRingM2 "MET1") gDrawCornerD(gOffM3 gRingM3 "MET1") gDrawCornerD(gOffM4 gRingM4 "MET1") gDrawCornerD(gOffM5 gRingM5 "MET1") gDrawCornerD(gOffM6 gRingM6 "MET1") gDrawCornerD(gOffM7 gRingM7 "MET1") gDrawCornerD(gOffM8 gRingM8 "MET1") gDrawCornerD(gOffS1 gRingS "STOP") gDrawCornerD(gOffS2 gRingS "STOP") gDrawCornerD(gOffS3 gRingS "STOP") gDrawCornerD(gOffS4 gRingS "STOP") gDrawCornerD(gOffS5 gRingS "STOP") gDrawCornerD(gOffS6 gRingS "STOP") gDrawCornerD(gOffS7 gRingS "STOP") gDrawCornerD(gOffS8 gRingS "STOP") gDrawAvias(gVia0) gDrawAvias(gOffI1) gDrawAvias(gOffI2) gDrawAvias(gOffI3) gDrawAvias(gOffI4) gDrawAvias(gOffI5) gDrawAvias(gOffI6) gDrawAvias(gOffI7) gDrawAvias(gOffI8) gDrawBvias(gVia0) gDrawBvias(gOffI1) gDrawBvias(gOffI2) gDrawBvias(gOffI3) gDrawBvias(gOffI4) gDrawBvias(gOffI5) gDrawBvias(gOffI6) gDrawBvias(gOffI7) gDrawBvias(gOffI8) gDrawCvias(gVia0) gDrawCvias(gOffI1) gDrawCvias(gOffI2) gDrawCvias(gOffI3) gDrawCvias(gOffI4) gDrawCvias(gOffI5) gDrawCvias(gOffI6) gDrawCvias(gOffI7) gDrawCvias(gOffI8) gDrawDvias(gVia0) gDrawDvias(gOffI1) gDrawDvias(gOffI2) gDrawDvias(gOffI3) gDrawDvias(gOffI4) gDrawDvias(gOffI5) gDrawDvias(gOffI6) gDrawDvias(gOffI7) gDrawDvias(gOffI8) ) ; ** gDrawMGR ** ; Commands ;-------------------------- gDrawR0 gPlace7X(((car(gPres)+23*gPitch):gBiasRail01) gN01) gDrawR1 gDrawR2 gPlace7X(((car(gPres)+23*gPitch):gBiasRail23) gN23) gDrawR3 gDrawBias0 gDrawBias01 gDrawBias12 gDrawBias23 gDrawBias3 gFindABCD gDrawMGR gDrawSawCut gDrawContNum(2*gN01+gN23+1 2*gN01+2*gN23 83.8 "POLY") ; AX:AY = 39814.511 : 384995. ; BX:BY = 48197.474 : 488971. ; CX:CY = -50476.202 : 488971. ; DX:DY = -37891.373 : 384995.