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 | ###############################################################################
# Copyright (c) 2003-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.
# =============================================================================
# @userware
# Find Defined Resistors
# @section
# Analyze the Loaded Database
# @description
# Traverse the design hierarchy tree for all Rs, check the
# resistance value, and collect the objects bigger than the defined
# threshold value. The result is stored in the Mem window.
# @files
# cust1/heavyR.tcl
# @example
# demo/spice/amd2901.sp
# @cmdline
# -hspice @example[0]
# -userware @files[0]
# @tag
# spice parasitic dspf spf
###############################################################################
# -----------------------------------------------------------------------------
# threshPopup - Show a popup window to define resistance threshold value.
# -----------------------------------------------------------------------------
#
proc HeavyR:threshPopup {} {
toplevel .tr
wm title .tr "Enter threshold."
label .tr.l -text "Resistance threshold: "
ttk::entry .tr.e -textvariable thresh
label .tr.u -text " Ohm"
ttk::frame .tr.f
ttk::button .tr.f.cancel -text "Cancel" -command "destroy .tr"
ttk::button .tr.f.ok -text "OK" -command "destroy .tr; HeavyR:heavyR"
bind .tr.e <Key-Return> ".tr.f.ok invoke"
grid .tr.f.cancel -row 0 -column 0 -padx 5 -pady 5 -sticky e
grid .tr.f.ok -row 0 -column 1 -padx 5 -pady 5 -sticky e
grid .tr.l -row 0 -column 0 -padx 5 -pady 5
grid .tr.e -row 0 -column 1 -padx 5 -pady 5
grid .tr.u -row 0 -column 2 -padx 5 -pady 5
grid .tr.f -row 1 -column 0 -columnspan 3
}
# -----------------------------------------------------------------------------
# heavyR - The heavyR procedure traverses the design hierarchy tree for all Rs
# and checks the resistance value and collects the objects bigger than
# the defined threshold value. The Result is stored into the Mem
# window.
# -----------------------------------------------------------------------------
#
proc HeavyR:heavyR {} {
global thresh RESList
if {$thresh == ""} {
return
}
##
# Get the main visualizer and a pointer to the database.
#
set db [gui database get]
set RESList {}
##
# loop over top modules
#
set thresh [zdb formatvalue fromspice $thresh]
$db foreach top mod {
HeavyR:traverseRt $db $mod $thresh
}
##
# Sort the result list: heaviest resistance first.
#
set sortedList [lsort -real -decreasing -index 0 $RESList]
set RESList {}
foreach elem $sortedList {
lappend RESList [lindex $elem 1]
}
##
# clear the "yellow" flag (used in traverseRt)
#
$db foreach module mod {$db flag $mod clear yellow}
##
# Clear and activate the Mem Window
#
gui mem clear
gui window show Mem
##
# Store the result into the Mem Window.
#
gui mem append $RESList
gui console print "[llength $RESList] Rs with value > $thresh added to Mem"
}
# -----------------------------------------------------------------------------
# traverseRt - The traverseRt procedure actually traverses the design hierarchy
# tree by recursively calling itself for each down-module.
# It collects the Rs in global RESList.
# -----------------------------------------------------------------------------
#
proc HeavyR:traverseRt {db mod thresh} {
global RESList
$db foreach inst $mod inst {
##
# dive down into sub-modules
#
if {[$db isModule $inst]} {
set down [$db moduleOf $inst]
##
# we use the "yellow" flag to avoid traversing
# the same module multiple times (speedup).
#
if {![$db flag $down is yellow]} {
HeavyR:traverseRt $db $down $thresh
$db flag $down set yellow
}
continue
}
##
# skip everything except Rs
#
set func [$db primFuncOf $inst]
if {$func != "RES"} {
continue
}
##
# check attribute R (the Spice parser stores the value there).
#
set value [$db attr $inst getValue "R"]
if {$value == ""} {
continue
}
set value [zdb formatvalue fromspice $value]
if {$value == ""} {
continue
}
if {$value >= $thresh} {
lappend RESList [list $value $inst]
}
}
}
|