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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 | ###############################################################################
# Copyright (c) 2017-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.
# =============================================================================
# @plugin
# Show IC Value
# @namespace
# ShowICValue
# @section
# Miscellaneous Userware Examples
# @description
# Display IC values coming from the `.IC`, `.DCVOLT` or `.NODESET` Spice
# commands as net attributes in the schematic view.
# @configuration
# @license
# permit spice
# @non-interactive
# @files
# showICValues.tcl
# @example
# demo/spice/aquarius.sp
# demo/spice/aquarius.ic
# @cmdline
# -userware @files[0]
# -hspice @example[0]
# @tag
# spice gui
###############################################################################
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc ShowICValue:Init {} {
global ShowICValue
##
# Add the option to configure the name of the initial condition.
#
gui plugin addConfig ShowICValue icName "IC" text \
"Name of the initial condition attribute"
##
# Add the option to configure the threshold value.
#
gui plugin addConfig ShowICValue icThreshold "1.0" text \
"Threshold value"
##
# Add the option to configure the on/off colors.
#
gui plugin addConfig ShowICValue icOnColor "#FF0000" text \
"On Color"
gui plugin addConfig ShowICValue icOnColorBg "#7F0000" text \
"On Color (background)"
gui plugin addConfig ShowICValue icOffColor "#00FF00" text \
"Off Color"
gui plugin addConfig ShowICValue icOffColorBg "#007F00" text \
"Off Color (background)"
##
# Initialize the default value to show the IC value colors.
#
set ShowICValue(showColors) 1
##
# Add menu entry.
#
gui menu command {"Userware" "Load IC Values"} \
[list ShowICValue:_loadFile]
gui menu checkbutton \
{"Userware" "Show IC Value Colors"} \
[list ShowICValue:_showColors] \
ShowICValue(showColors)
##
# Register ShowICValue:Start to be run on database changes,
# and immediately if there's already is a database.
#
gui database runAndRegisterChangedCallback [list ShowICValue:Start]
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc ShowICValue:Finit {} {
##
# Undo modifications of the GUI.
#
gui menu removeEntry {"Userware" "Load IC Values"}
gui menu removeEntry {"Userware" "Show IC Value Colors"}
##
# Remove the callback registration.
#
gui database removeChangedCallback "ShowICValue:Start"
}
# =============================================================================
# Start - Add a meta attribute to the database to display the .IC value.
# =============================================================================
#
proc ShowICValue:Start {db} {
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# Get the initial condition attribute name.
#
set icName [gui plugin getConfigValue ShowICValue icName]
##
# Configure the displayed value: IC=<IC-VALUE>.
#
$db attr -db set "@nlv:net=IC=%\{\$.$icName\}"
##
# Call the _showColors procedure to apply highlights.
#
ShowICValue:_showColors
##
# Configure the display position of the attribute.
#
gui settings set "nlv:netattrwire" 1
gui settings set "nlv:netattrpin" 0
gui settings changed
##
# Inform the GUI that the attributes has changed.
#
gui attribute changed
}
# -----------------------------------------------------------------------------
# _loadFile - Load a Spice file that contains only commands for IC values.
# -----------------------------------------------------------------------------
#
proc ShowICValue:_loadFile {} {
set f [gui window fileDialog openFile "Open an IC Value File" \
{{"IC Value File" {".ic"}}}]
if {($f eq "") || (![file exists $f])} {
return
}
##
# Get the database.
#
set db [gui database get]
##
# Create a new database if the global tool database is empty.
#
if {$db == {}} {
set db [zdb new]
}
##
# Load the IC value file into the database.
#
if {[catch {zspice -into $db $f} msg]} {
zmessage print ERR $msg
return
}
##
# Start displaying the IC values.
#
ShowICValue:Start $db
}
# -----------------------------------------------------------------------------
# _showColors - Show IC Value colors.
# -----------------------------------------------------------------------------
#
proc ShowICValue:_showColors {} {
global ShowICValue Global
##
# Get the database and return if no database is loaded.
#
set db [gui database get]
if {$db == {}} {
return
}
$db foreach top top {
$db flathilight $top deleteAll -permanent
}
if {$ShowICValue(showColors)} {
set icName [gui plugin getConfigValue ShowICValue icName]
set icThreshold [gui plugin getConfigValue ShowICValue icThreshold]
set icOnColor [gui plugin getConfigValue ShowICValue icOnColor]
set icOnColorBg [gui plugin getConfigValue ShowICValue icOnColorBg]
set icOffColor [gui plugin getConfigValue ShowICValue icOffColor]
set icOffColorBg [gui plugin getConfigValue ShowICValue icOffColorBg]
set onColor 0
set colorIdx [expr {$onColor + $Global(permHiColorOffset)}]
set name objectHighlight$colorIdx
gui settings set "color:$name" $icOnColor
set name hicolorbg$colorIdx
gui settings set "color:$name" $icOnColorBg
set offColor 1
set colorIdx [expr {$offColor + $Global(permHiColorOffset)}]
set name objectHighlight$colorIdx
gui settings set "color:$name" $icOffColor
set name hicolorbg$colorIdx
gui settings set "color:$name" $icOffColorBg
$db foreach top top {
$db flat foreach signal $top signal {
$db flat foreach net $signal net {
set icValue [$db flatattr $net getMergedValue "\$.$icName"]
if {$icValue == ""} {
continue
}
if {![string is double $icValue]} {
zmessage print WAR "\$.$icName is not a double value."
continue
}
if {$icValue >= $icThreshold} {
$db flathilight $net set $onColor -permanent
} else {
$db flathilight $net set $offColor -permanent
}
}
}
}
}
gui highlight changed
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
ShowICValue:Init
|