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
264
265
266
267
268
269
270
271
272
273
274
275
276
277 | ###############################################################################
# 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.
# =============================================================================
# @plugin
# Color Nets
# @namespace
# ColorNets
# @section
# Analyze the Loaded Database
# @description
# Color nets in the loaded database.
# @files
# cust27/colorNets.tcl
# @example
# demo/spice/parity1.sp
# @cmdline
# -hspice @example[0]
# -userware @files[0]
# @tag
# spice
###############################################################################
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc ColorNets:Init {} {
##
# Add a menu entry.
#
gui menu command {"Userware" "Color Nets"} \
[list ColorNets:Start]
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc ColorNets:Finit {} {
##
# Undo modifications of the GUI.
#
gui menu removeEntry {"Userware" "Color Nets"}
}
# =============================================================================
# Start - Color nets.
# =============================================================================
#
proc ColorNets:Start {} {
global Global
##
# Return if the database is empty.
#
set db [gui database get]
if {$db == {}} {
return
}
##
# Get supply nets, grouped by type and name.
#
array set ColorNets {}
$db foreach module module {
$db foreach net $module net {
set type {}
foreach type {power ground negpower} {
if {[$db flag $net is $type]} {
set name [$db attr $net getValue {$SUPPLYNAME}]
if {$name == {}} {
if {[$db isBusMember $net]} {
set bus [$db busOf $net]
set name [$db oid oname $bus]
} else {
set name [$db oid oname $net]
}
}
set name [string toupper $name] ;# ignore case
lappend ColorNets([list $type $name]) $net
zmessage print DBG \
"Supply: $net: $type = $name"
break
}
}
}
}
##
# Get all interface signals, grouped by name
#
$db foreach top top {
$db foreach port $top port {
if {[$db isConnected $port]} {
set net [$db connectedNet $port]
set name [$db oid oname $net]
lappend ColorNets([list io $name]) $net
}
}
}
##
# Clear all permanent highlights.
#
$db hilight * deleteAll -permanent
##
# Set constants
#
set minColorIdx 1
set maxColorIdx 10
set availableColors [expr {($maxColorIdx - $minColorIdx) + 1}]
##
# Process all types.
#
foreach type {power ground negpower io} {
##
# Collect uniq names per type.
#
set names {}
foreach idx [array names ColorNets $type*] {
lappend names [lindex $idx 1]
}
##
# Sort all names of one type to get 'reproducible' colors.
#
set names [lsort -dictionary $names]
##
# Calculate color 'step' for one type.
#
set cnt [llength $names]
if {$cnt == 0} {
continue
}
zmessage print DBG \
"$type: $cnt names found ($names)"
if {$cnt > $availableColors } {
set cnt $availableColors
zmessage print DBG \
"$type: limit to $cnt colors"
}
set step [expr {128 / ($cnt + 1)}]
if {$step < 1} {
set step 1
}
zmessage print DBG \
"$type: one color step is $step"
##
# Set RGB format and color idx offset per type.
#
switch -- $type {
power {
set rgbFmt "#\${c}0000" ;# red colors
set colorIdxOffset 0
}
ground {
set rgbFmt "#0000\${c}" ;# blue colors
set colorIdxOffset $availableColors
}
negpower {
set rgbFmt "#\${c}00\${c}" ;# violet colors
set colorIdxOffset [expr {$availableColors * 2}]
}
io {
set rgbFmt "#00\${c}00" ;# green colors
set colorIdxOffset [expr {$availableColors * 3}]
}
default {
error "Unexpected node type '$type'."
}
}
##
# Set all needed colors.
#
set color 255
set colorIdx $minColorIdx
for {set i 0} \
{$i < $cnt} \
{incr i} \
{
##
# Create color code, for each type.
#
set fgrgb ""
set bgrgb ""
set c [format "%02X" $color]
eval set fgrgb $rgbFmt
set c [format "%02X" [expr {int($color * 0.2)}]]
eval set bgrgb $rgbFmt
##
# Set RGB for permanent color.
#
set permColorIdx [expr {$colorIdx + $colorIdxOffset + \
$Global(permHiColorOffset)}]
set fg color:objectHighlight$permColorIdx
set bg color:hicolorbg$permColorIdx
gui settings set $fg $fgrgb
gui settings set $bg $bgrgb
set msg "$type: RGB $colorIdx + $colorIdxOffset + "
append msg "$Global(permHiColorOffset) = "
append msg "$permColorIdx: $fgrgb $bgrgb"
zmessage print DBG $msg
##
# Increment color
#
incr color -$step
incr colorIdx
}
##
# Process each name for one type.
#
set i 0
foreach name $names {
if {$i >= $availableColors} {
set i [expr {$availableColors - 1}]
}
set colorIdx [expr {$i + $minColorIdx + $colorIdxOffset}]
##
# Set color index for all nets of one name.
#
foreach net $ColorNets([list $type $name]) {
if {$type == "io"} {
set sig [$db flat signalOf $net]
$db flat foreach net $sig n {
$db flathilight $n set $colorIdx -permanent
}
zmessage print DBG \
"flat hilight: $colorIdx $net"
} else {
$db hilight $net set $colorIdx -permanent
zmessage print DBG \
"highlight: $colorIdx $net"
}
}
incr i
}
}
##
# Update GUI
#
gui settings changed
gui highlight changed
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
ColorNets:Init
|