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 | ###############################################################################
# Copyright (c) 2010-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
# Voltage Zones
# @namespace
# VoltageZones
# @section
# Miscellaneous Userware Examples
# @description
# Highlight power nets with different names or different voltage values
# in a different color.
# @configuration
# @license
# permit spice
# @files
# voltageZones.tcl
# @example
# demo/spice/multivolt.sp
# @cmdline
# -hspice @example[0]
# -userware @files[0]
# @tag
# gui spice
###############################################################################
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc VoltageZones:Init {} {
##
# Add a menu entry.
#
gui menu command {"Userware" "Highlight Voltage Zones"} \
[list VoltageZones:_highlightFromMenu]
gui plugin addConfig VoltageZones useVoltage 0 bool \
"Use voltage value instead of supply node name."
##
# Use gui database runOrRegisterChangedCallback to immediately run
# VoltageZones:Highlight if we have a database, or otherwise register the
# procedure to be executed after the database is available.
#
gui database runOrRegisterChangedCallback VoltageZones:Highlight
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc VoltageZones:Finit {} {
##
# Undo modifications of the GUI.
#
gui menu removeEntry {"Userware" "Highlight Voltage Zones"}
##
# Remove the callback registration.
#
gui database removeChangedCallback "VoltageZones:Highlight"
}
# =============================================================================
# Highlight - Loop over all nets in all modules and apply the same highlight
# color for each power net with the same name.
# =============================================================================
#
proc VoltageZones:Highlight {db} {
global Global
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# Initialize the next color value.
# This is also used to count the number of different power nodes.
#
set nextColor 0
##
# Get the configuration.
#
set useVoltage [gui plugin getConfigValue VoltageZones useVoltage]
##
# Loop over all power nets in all modules.
#
set powerList {}
$db foreach module mod {
$db foreach net $mod net {
##
# Skip normal and ground nets.
#
if {(![$db flag $net is power]) && (![$db flag $net is negpower])} {
continue
}
##
# Get the key (net name or voltage value) and assign a color
# for each different key.
#
if {$useVoltage} {
set key [$db attr $net getValue "#VOLTAGE"]
} else {
set key [$db oid oname $net]
}
if {![info exists color($key)]} {
lappend powerList $net
set color($key) $nextColor
##
# Check if the maximum number of available colors is reached.
#
if {[incr nextColor] > $Global(hiColorMax)} {
set msg "Found more than $Global(hiColorMax) different "
append msg "power nets. Running out of colors."
zmessage print ERR $msg
break
}
}
##
# Set the highlight color defined for this net key.
#
$db hilight $net set $color($key)
}
##
# Check if the maximum number of available colors is reached.
#
if {$nextColor > $Global(hiColorMax)} {
set nextColor $Global(hiColorMax)
break
}
}
##
# Load one representative of each power net to the Mem window.
#
gui mem append $powerList
gui window show Mem
##
# Print the summary to the Console window.
#
gui console print "Finished coloring of $nextColor power nets."
##
# Update the GUI.
#
gui highlight changed
}
# -----------------------------------------------------------------------------
# _highlightFromMenu - Call Highlight with a database.
# -----------------------------------------------------------------------------
#
proc VoltageZones:_highlightFromMenu {} {
VoltageZones:Highlight [gui database get]
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
VoltageZones:Init
|