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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224 | ###############################################################################
# Copyright (c) 2015-2024 by Altair Engineering, Inc.
# All rights reserved.
#
# Altair Engineering, Inc. makes this software available as part of the Vision
# tool platform. As long as you are a licensee of the Vision tool platform
# you may make copies of the software and modify it to be used within the
# Vision tool platform, but you must include all of this notice on any copy.
# Redistribution without written permission to any third party, with or
# without modification, is not permitted.
# Altair Engineering, Inc. does not warrant that this software is error free
# or fit for any purpose. Altair Engineering, Inc. disclaims any liability for
# all claims, expenses, losses, damages and costs any user may incur as a
# result of using, copying or modifying the software.
# =============================================================================
# @script
# Resistor Protection of MOS devices
#
# Algorithm
# 1. Identify all MOS devices in the design.
# 2. Create paths through resistor less than 100 Ohm.
# 3. Check whether gate pins are connected to Power or
# Ground nets (direct/Indirect).
# 4. Add the devices without proper ESD protection to the
# result list.
#
# Example
# demo/api/esd/testcase03.sp
###############################################################################
# -----------------------------------------------------------------------------
# check03Pin - Check whether the pin connects to a resistor connected to.
# -----------------------------------------------------------------------------
#
proc ESD:check03Pin {db mosInst gate what resultListVar} {
upvar 1 $resultListVar resultList
##
# get connected net
#
set net [ESD:connectedNet $db $gate]
if {$net == {}} {
return
}
##
# Check and report direct connection to power nets.
#
if {[$db flag $net is $what]} {
set msg "direct connection of '[$db oid print $gate]' to $what"
ESD:appendResult resultList $mosInst [list $gate] $msg
return
}
##
# loop over all connected pins
#
$db foreach pin $net pin {
##
# Ignore ports
#
if {[$db oid type $pin] eq "port"} {
continue
}
##
# Ignore start pin
#
if {[$db oid isequal $pin $gate]} {
continue
}
##
# Get instance of pin
#
set inst [$db oid convertTo inst $pin]
##
# Get primitive func
#
set func [$db primFuncOf $inst]
##
# skip all non resistors
#
if {$func ne "RES"} {
continue
}
##
# get other pin of resistor
#
set other [ESD:oppositePin $db $pin]
if {$other == {}} {
continue
}
##
# get connected pin of other pin
#
set otherNet [ESD:connectedNet $db $other]
if {$otherNet == {}} {
continue
}
##
# Skip non power ground connections of resistor's other pin
#
if {![$db flag $otherNet is $what]} {
continue
}
##
# get resistor value
#
set value [$db attr $inst getValue "R"]
##
# if value is to low report this mosInst
#
set oids [list $gate $pin $other]
if {$value < 100} {
set msg "resistor '[$db oid print $inst]' value $value too small"
ESD:appendResult resultList $mosInst $oids $msg
} else {
ESD:appendResult resultList $mosInst $oids ""
}
}
}
# -----------------------------------------------------------------------------
# check03Inst - Process NMOS/PMOS instances
# -----------------------------------------------------------------------------
#
proc ESD:check03Inst {db inst resultListVar} {
upvar 1 $resultListVar resultList
##
# Get function of each inst.
#
set func [$db primFuncOf $inst]
##
# Set net type for MOS instances, skip all others
#
switch -- $func {
"NMOS" {
set what "power"
}
"PMOS" {
set what "ground"
}
default {
continue
}
}
##
# Get gate pin
#
set gate [$db getFuncPort $inst -name gate]
##
# Check pin
#
ESD:check03Pin $db $inst $gate $what resultList
}
# =============================================================================
# Check03 - Resistor Protection of MOS devices.
# =============================================================================
#
proc ESD:Check03 {db} {
##
# Initialize the result list.
#
set resultList {}
##
# Get top module.
#
set top [$db get_top_design]
##
# Flag all MOS devices
#
zprogress push "flag devices" 0.3
ESD:flagDevices $db {NMOS PMOS}
zprogress pop
##
# Count insts
#
zprogress push "count" 0.6
set count 0
$db flat foreach instOfCell green $top inst {
incr count
}
zprogress pop
##
# loop over all flat MOS devices
#
zprogress push "check" 1.0
set i 0
$db flat foreach instOfCell green $top inst {
zprogress push "" [expr {double([incr i]) / $count}]
ESD:check03Inst $db $inst resultList
if {[zprogress pop]} {
break
}
}
zprogress pop
##
# Return the calculated result.
#
return $resultList
}
|