forked from KLayout/klayout
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsi4all.lvs
128 lines (99 loc) · 3.34 KB
/
si4all.lvs
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
127
# Hierarchical mode
deep
# Print details
verbose
# Output generation (dialog only)
report_lvs
# Enable this to produce a L2N database
# report_netlist("extracted.l2n")
# True to write the extracted netlist
if false
# true: use net names instead of numbers
# false: use numbers for nets
spice_with_net_names = true
# true: put in comments with details
# false: no comments
spice_with_comments = false
# Extracted netlist
target_netlist(File.join(File.dirname(File.absolute_path(source.path || ".")), source.cell_name + "_extracted.cir"), write_spice(spice_with_net_names, spice_with_comments), "Extracted by KLayout on : #{Time.now.strftime("%d/%m/%Y %H:%M")}")
end
# Specify the schematic netlist
# (looks for a file called <cell name>.cir where <cell name>
# is the current cell name). The file is looked up relative to
# the layout file name.
schematic(File.join(File.dirname(File.absolute_path(source.path || ".")), source.cell_name + ".cir"))
# layers definitions
########################
nwell = input(1, 0)
diff = input(2, 0)
pplus = input(3, 0)
nplus = input(4, 0)
poly = input(5, 0)
thickox = input(6, 0)
polyres = input(7, 0)
contact = input(8, 0)
metal1 = input(9, 0)
via = input(10, 0)
metal2 = input(11, 0)
pad = input(12, 0)
border = input(13, 0)
# Special layer for bulk terminals
bulk = make_layer
# Computed layers
diff_in_nwell = diff & nwell
pdiff = diff_in_nwell - nplus
ntie = diff_in_nwell & nplus
pgate = pdiff & poly
psd = pdiff - pgate
hv_pgate = pgate & thickox
lv_pgate = pgate - hv_pgate
hv_psd = psd & thickox
lv_psd = psd - thickox
diff_outside_nwell = diff - nwell
ndiff = diff_outside_nwell - pplus
ptie = diff_outside_nwell & pplus
ngate = ndiff & poly
nsd = ndiff - ngate
hv_ngate = ngate & thickox
lv_ngate = ngate - hv_ngate
hv_nsd = nsd & thickox
lv_nsd = nsd - thickox
# PMOS transistor device extraction
hvpmos_ex = RBA::DeviceExtractorMOS4Transistor::new("HVPMOS")
extract_devices(hvpmos_ex, { "SD" => psd, "G" => hv_pgate, "P" => poly, "W" => nwell })
lvpmos_ex = RBA::DeviceExtractorMOS4Transistor::new("LVPMOS")
extract_devices(lvpmos_ex, { "SD" => psd, "G" => lv_pgate, "P" => poly, "W" => nwell })
# NMOS transistor device extraction
lvnmos_ex = RBA::DeviceExtractorMOS4Transistor::new("LVNMOS")
extract_devices(lvnmos_ex, { "SD" => nsd, "G" => lv_ngate, "P" => poly, "W" => bulk })
hvnmos_ex = RBA::DeviceExtractorMOS4Transistor::new("HVNMOS")
extract_devices(hvnmos_ex, { "SD" => nsd, "G" => hv_ngate, "P" => poly, "W" => bulk })
# Define connectivity for netlist extraction
# Inter-layer
connect(contact, ntie)
connect(contact, ptie)
connect(nwell, ntie)
connect(psd, contact)
connect(nsd, contact)
connect(poly, contact)
connect(contact, metal1)
connect(metal1, via)
connect(via, metal2)
# Make "must-connect" connections between NWELL and VDD and BULK and VSS
connect_explicit(["NWELL", "VDD"])
connect_explicit(["BULK", "VSS"])
# Global connections
connect_global(ptie, "BULK")
connect_global(bulk, "BULK")
# Actually performs the extraction
netlist
# Flatten cells which are present in one netlist only
align
# Simplication of the netlist
netlist.simplify
# LVS compare
if compare
puts "Congratulations! Netlists match."
else
puts "LVS ERROR: netlists do not match!"
end