Newer
Older
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
#!/usr/bin/env python3
import gdspy
lib = gdspy.GdsLibrary('Lib')
pi = 3.1416
p = {-1:'r',1:'l'}
def make_resonator(length, width, trench, coupling_length, coupling_radius, turn_length, turn_radius, n_turns=0):
res = gdspy.Path(width)
res.segment(coupling_length,'+x')
res.turn(coupling_radius,'r')
if n_turns == 0:
res.segment(length, '-y')
else:
_p = 1
ext_length = (n_turns+1)*pi
length = length - ext_length
res.segment(length/2,'-y')
res.turn(turn_radius,'r')
for i in range(n_turns):
res.turn(turn_radius,p[_p])
res.turn(turn_radius,p[_p])
res.segment(turn_length)
_p *= -1
res.turn(turn_radius, p[_p])
res.segment(length/2,'-y')
res_poly = gdspy.boolean(res, res, 'or', max_points=10000)
tr = gdspy.offset(res_poly, trench)
res.segment(trench)
out = gdspy.boolean(tr, res, 'not', layer=1, max_points=10000)
#out.fracture(max_points=5)
return out
def _cpw(length, width, pad_length, pad_width, tapper_length):
cpw = gdspy.Path(pad_width)
cpw.segment(pad_length)
cpw.segment(tapper_length, final_width=width)
cpw.segment(length)
cpw.segment(tapper_length, final_width=pad_width)
cpw.segment(pad_length)
cpw = gdspy.boolean(cpw, cpw, 'or', layer=2)
return cpw
def make_cpw(length, width, pad_length, pad_width, tapper_length, trench):
cpw = _cpw(length, width, pad_length, pad_width, tapper_length)
cpw_tr = _cpw(length,width+2*trench,pad_length*2,pad_width*2,tapper_length+trench)
cpw_tr.translate(-(pad_length+trench), 0)
out = gdspy.boolean(cpw_tr, cpw, 'not', layer=2)
return out
# Construction of gds file
cell_res = gdspy.Cell('Resonator')
res = make_resonator(5e3,2,1,20,5,100,100,3)
cell_res.add(res)
lib.add(cell_res)
cell_cpw = gdspy.Cell('CPW')
cpw = make_cpw(5e3, 10, 350, 350, 100, 5)
cell_cpw.add(cpw)
lib.add(cell_cpw)
gdspy.LayoutViewer(lib)
lib.write_gds('example.gds')