-
Notifications
You must be signed in to change notification settings - Fork 0
/
03 generate_alignment_markers_sqgrid.lym
126 lines (102 loc) · 3.07 KB
/
03 generate_alignment_markers_sqgrid.lym
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?xml version="1.0" encoding="utf-8"?>
<klayout-macro>
<description/>
<version/>
<category>pymacros</category>
<prolog/>
<epilog/>
<doc/>
<autorun>false</autorun>
<autorun-early>false</autorun-early>
<shortcut/>
<show-in-menu>false</show-in-menu>
<group-name/>
<menu-path/>
<interpreter>python</interpreter>
<dsl-interpreter-name/>
<text>import pya
import math
from string import ascii_uppercase
print("-----------------------------------")
#INFO: To be run after using "generate_alignment_marker_base". Requires existance of certain layers/cells.
# Get layout view, if no layout create one.
lv = pya.LayoutView.current()
# Get cell view, if not existing, then create one.
cv = pya.CellView.active()
layout = cv.layout()
#Select "TOP" Cell
top = layout.cell("TOP")
AM = layout.cell("Alignment Markers")
#Create cell for grid
GRD = layout.create_cell("Grid")
cv.cell = GRD #set to current selection.
# Ensure there is a layer existing
layl = []
layi = []
li = lv.begin_layers()
while not li.at_end():
node = li.current()
ly = lv.cellview(node.cellview()) #layout object
lj = node.layer_index() #layer index
layl += [ly]
layi += [lj]
li.next()
alg_layer_ind = layl[0]
alg_layer = pya.LayerInfo(1,0)
box_layer_ind = layl[1]
box_layer = pya.LayerInfo(2,0)
# Add extra layer for text
txt_layer_ind = layout.insert_layer(pya.LayerInfo().new(3,0,"text"))
txt_layer = pya.LayerInfo(3,0)
# Put layers in list:
lv.add_missing_layers()
lv.layer = txt_layer #select layer
#Writing Layer info
#Create Cell for Alignment markers.
cv.cell = GRD #set to current selection.
# Get TEXT object
lib=pya.Library.library_by_name("Basic")
txt=lib.layout().pcell_declaration("TEXT")
#Specify grid
dx = 1000e3 #um spacing between sets of boxes
dy2 = 150e3 #um spacing between centre of boxes
dy = 1000e3 #um spacing between sets of boxes
#Spacing allowed for 4.5mm chips with gold pads:
#rows = math.ceil(2700e3 / dx)
#cols = math.ceil(2700e3 / dy)
#Spacing allowed for 1cm chips
#rows = math.ceil(10000e3 / dx)
#cols = math.ceil(10000e3 / dy)
#Spacing allowed for 4.5mm chips
rows = math.ceil(4500e3 / dx)
cols = math.ceil(4500e3 / dy)
for row in range(rows):
for col in range(cols):
x = (col - 0.5 * (cols-1))*dx
y = (-row + 0.5 * (rows-1))*dy
#Create instances of Alignment markers
inst = pya.CellInstArray(AM.cell_index(), pya.Trans(pya.Point(x,y)))
GRD.insert(inst)
# #TEXT
#text_ij = ascii_uppercase[row] + "%2.2i" % col #TextLabel
text_ij = "X%2.2iY%2.2i" % (col,row) #TextLabel
param = {
"layer":txt_layer,
"text":text_ij,
"mag": 28
}
#Generate defaults for all other parameters
pv = txt.get_parameters()
for p in pv:
if not p.name in param.keys():
param[p.name] = p.default
#print(p.name,p.default)
#Make Cell
pvar = layout.add_pcell_variant(lib, txt.id(), param)
t = pya.Trans(pya.Trans.R0,x-0.3*dx,y+0.39*dy) #pya.Trans(pya.Trans.R90,0,30e3)
#instantiate
pinst = GRD.insert(pya.CellInstArray(pvar, t))
#Properly fit area
lv.zoom_fit()
</text>
</klayout-macro>