Arrays


Every pattern you wish to expose on a wafer must be part of an array your define in your Job Deck File (.jdf). Even if you only expose a single pattern in the middle of your wafer, it must be part of a defined array, even though in this case it will be simply a 1 x 1 array.


Array Points

Key to understanding the array syntax is the “Array Point” -- this is just the geometric point at the node of each location in the defined array. Note that the relationship of each Array Point to actual location of the pattern might have some offsets, or an Array Point might have more than one pattern assigned to it, but in all cases, each element is specified relative to an array point.

This figure shows a simple array:



The array is specified by 6 quantities; the first three for the X axis, and the latter three for the Y axis. In each case, the numbers specify:

  • Location offset of Array Point (1,1), in microns, relative to the substrate center (or to the higher-level array point in the case of hierarchical arrays which I haven’t discussed yet). Note that positive values for X and Y shift to the RIGHT, and UPWARD respectively.
  • The number of Array Points in that axis. The X-axis value specifies the number of Columns, while the Y-axis value specified the number of Rows.
  • The spacing between the Array Points in that Axis. So the X-Axis spacing is the spacing between columns, the Y-Axis spacing is the spacing between rows. Both are in microns.

Now, all that we’ve defined so far is a conceptual array of point locations. We haven’t populated any of those points. For that, you use the ASSIGN command.


ASSIGN command

With the assign command, you can assign a pattern to each array point. But you don’t actually assign a pattern directly, instead you assign a “virtual pattern number”, basically an integer index between 1 and 99. So if I want to put the same pattern at each of the 12 Array Points in the above array example, I’d use the two commands:

First, in the COMMON block:

ASSIGN P(3) -> ((*,*))

and then later in the LAYER block:

P(3) ‘MYPATTERN.v30’(0,0)


This will give you 12 placements of your pattern data in the file: MYPATTERN.v30, located as in the above array.

ARRAY definitions can be more complex. You can assign different patterns to different array points:

ASSIGN P(1) -> ((1,*))
ASSIGN P(3) -> ((2,*))
ASSIGN P(1) -> ((3,*))
ASSIGN P(3) -> ((4,2-3))
ASSIGN P(1) -> ((4,1))
ASSIGN P(4) -> ((3,3))
SKIP (2,1)

and then later in the LAYER block:

P(1) ‘RED_PATTERN.v30’(0,0)
P(3) ‘BLUE_PATTERN.v30’(0,0)
P(4) ‘GREEN_PATTERN.v30’(500,200)



This example shows several more complicated features of ARRAY and ASSIGN commands:

  • The first ASSIGN command places Pattern # 1 in all rows of column # 1 - the wildcard asterisk (*) is used to indicate all rows.
  • The next two ASSIGNs are similar, putting Pattern #3 in column 2 all rows, and then pattern #1 into all rows of column 3 (but see below.)
  • The fourth ASSIGN specifies that Pattern # 3 be written at sites (4,2) and (4,3); the hyphen in ( 2-3 ) indicates an inclusive range of array points.
  • The next ASSIGN command puts Pattern # 1 in site (4,1).
  • The final ASSIGN command assigns Pattern # 4 to site (3,3). This is a re-assignment, because the third assign command had previously put pattern #1 in this same site. This is a replacement, not an addition, so only Pattern # 4 will be assigned at this site.
  • The SKIP (2,1) command removes any pattern already assigned to this array point; in this case, Array Point (2,1) will have no pattern written there.

With ASSIGN and SKIP commands, order of the commands is significant. If a statement assigns a pattern or a skip to an array point that already has a definition, then the new definition OVERRIDES, or replaces, the earlier assignment.

The pattern #4 definition "P(#)" above demonstrates an additional feature. The coordinates after the pattern file name are an additional offset to be applied to placements of that pattern file. For pattern #s 1 and 3, the pattern center will be placed at the location of the array point, but in this case, pattern #4 will be written with the pattern center shifted to the right by 500 um and up by 200 um from the location of the Array Point.


SubArrays

And it gets more complicated. Array definitions can be hierarchical. In addition to assigning a pattern to each location in an array as shown above, you can also assign another array to one or more array point.




The commands to define this two-level layout are:

In the COMMON Block

ARRAY ( -3500, 2, 8000 )/( 3000, 2, 6000 )
ASSIGN A(1) -> ((*,*))
1: ARRAY ( -1500,3,1500 )/( 0,1,1000 )
ASSIGN P(1) -> ((1,1),DOS1)
ASSIGN P(1) -> ((2,1),DOS2)
ASSIGN P(1) -> ((3,1),DOS3)
AEND

In the LAYER block:

P(1) 'slottest.v30'(0,0)

DOS1: MODULAT ((0,-10))
DOS2: MODULAT ((0,0))
DOS3: MODULAT ((0,10))

Here’s what’s going on:

  • We define the main array, in this case, a 2x2 array spaced by 8000 x 6000 um. We are placing the location of the first array point away from the substrate center by 3500 um to the left, and 3000 um upward (the green vector arrow.)
  • To each location in this array, we assign not a pattern, but another array, a sub-array. This first ASSIGN command assigns A(1), rather than P(n).
  • The second ARRAY command, preceded by the “1:”, defines the sub-array with the label #1, in this example, a 3 x 1 array, spaced by 1500 um in X, y spacing is irrelevant when the Y repeat count is 1. The location of the first array point of this subarray will be 1500 um to the left of each array point defined by the higher-level, main array.
  • Then, to each site in this subarray, we define a Pattern File # 1 be placed at that site.
  • An additional feature demonstrated in this case is that each of the 3 placements has a different dose assignment, as indicated by the DOSn, and later MODULAT table definitions. In this case, the same pattern is written at each of the 3 sites within each of the subarray placements, but with Base Dose, 10% lower and then 10% higher.

Subarrays can be nested up to 10 levels of definition depth, but cannot be circular in definition.

You can see a few more examples of ARRAY assignments in the Example JobFiles.