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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348 | ###############################################################################
# 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
# Save/Restore Highlights
# @namespace
# SaveHighlights
# @section
# Create Reports
# @description
# Traverse the loaded design database and collect all highlight
# information. The collected information is stored as an userware file
# that can be sourced to restore the highlights or loaded via the
# corresponding menu entry. The stored file contains:
# 0. Database call command
# 1. Used highlighting colors
# 2. List of module-based highlights
# 3. List of flat highlights
# 4. Code to import used colors
# 5. Code to import and create module-based highlights
# 6. Code to import and create flat highlights
# 7. If enabled as config option: Load objects of the highlights into the
# mem window
# 8. Code to restore highlights
# @test
# ModuleTest
# @configuration
# @files
# saveHilight.tcl
# @example
# demo/rtl/aquarius/aquarius.f
# @cmdline
# -F @example[0]
# -userware @files[0]
# @tag
# gui zdb report
###############################################################################
set SaveHighlights(scriptName) [info script]
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc SaveHighlights:Init {} {
##
# Add selection box to config to allow overwriting existing files
#
gui plugin addConfig SaveHighlights restoreToMemWindow 0 bool \
"Move highlighted objects to Mem window after loading"
gui menu command {"Userware" "Save Highlights"} \
[list SaveHighlights:Save]
gui menu command {"Userware" "Restore Highlights"} \
[list SaveHighlights:Restore]
if {![gui plugin check]} {
SaveHighlights:Save "restore-highlights.tcl"
}
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc SaveHighlights:Finit {} {
##
# Undo modifications of the GUI.
#
gui menu removeEntry {"Userware" "Save Highlights"}
gui menu removeEntry {"Userware" "Restore Highlights"}
}
# =============================================================================
# Save - Write highlight information to a file.
# =============================================================================
#
proc SaveHighlights:Save {{fname {}} {enableMemWindowRestore {}}} {
global SaveHighlights
set db [gui database get]
if {$db == {}} {
zmessage print WAR "SaveHighlights: no database."
return
}
##
# If the fname parameter is empty, ask the user for a file name.
#
if {$fname == {}} {
set fname [gui window fileDialog saveFile \
"Save Result" {{"Tcl File" {.tcl}}}]
if {$fname == {}} {
zmessage print INF "SaveHighlights: No filename"
return
}
}
##
# Open the output file where the collected highlight information is stored.
#
set out [open $fname "wb"]
##
# Write a header to the output file.
# 0. Get database:
#
puts $out "# Created by $SaveHighlights(scriptName)"
puts $out "set db \[gui database get\]"
##
# 1. Used highlighting colors:
#
array set usedColors {}
$db foreach top top {
$db flat foreach hilight $top oid col {
set usedColors($col) 1
}
}
puts $out "set usedColors \{"
foreach col [array names usedColors] {
if {([::Settings::Exists "color:hicolorbg$col"]) &&
([::Settings::Exists "color:objectHighlight$col"])} \
{
set bgcolor [::Settings::Get "color:hicolorbg$col"]
set fgcolor [::Settings::Get "color:objectHighlight$col"]
puts $out "\t$col $bgcolor $fgcolor"
}
}
puts $out "\}"
##
# 2. List module-based highlights
#
puts $out "array set moduleHighlights \{"
$db foreach cell cell {
SaveHighlights:_handleCell $db $out $cell
}
puts $out "\}"
##
# 3. List flat highlights
#
puts $out "array set flatHighlights \{"
$db foreach top top {
$db flat foreach hilight $top oid col {
puts $out "\t[list $oid $col]"
}
}
puts $out "\}\n"
##
# Get "restore to Mem window" information
#
if {$enableMemWindowRestore == {}} {
set enableMemWindowRestore \
[gui plugin getConfigValue SaveHighlights restoreToMemWindow]
} elseif {![string is boolean $enableMemWindowRestore]} {
zmessage print ERR "Expected type boolean for enableMemWindowRestore"
set enableMemWindowRestore false
}
puts $out "set enableMem $enableMemWindowRestore"
##
# 4. Import and set used colors
#
puts $out {
foreach {col bgcolor fgcolor} $usedColors {
::Settings::Set "color:hicolorbg$col" $bgcolor
::Settings::Set "color:objectHighlight$col" $fgcolor
}
}
##
# 5. Import module-based highlights
#
puts $out "set numberOfHighlights 0"
puts $out {
foreach {highlightedObjectInfo col} [array get moduleHighlights] {
if {![$db oid exists $highlightedObjectInfo]} {
gui console print "{$highlightedObjectInfo} not found"
continue
}
$db highlight $highlightedObjectInfo set $col
incr numberOfHighlights
}
}
##
# 6. Import flat highlights
#
puts $out {
foreach {highlightedObjectInfo col} [array get flatHighlights] {
if {![$db oid exists $highlightedObjectInfo]} {
gui console print "{$highlightedObjectInfo} not found"
continue
}
$db flathilight $highlightedObjectInfo set $col
$db highlight $highlightedObjectInfo set $col
incr numberOfHighlights
}
}
##
# Restore highlights in mem window
#
puts $out {
if {$enableMem} {
foreach highlightedObjectInfo [array names moduleHighlights] {
gui mem append [list $highlightedObjectInfo]
}
foreach highlightedObjectInfo [array names flatHighlights] {
gui mem append [list $highlightedObjectInfo]
}
}
}
##
# Inform the GUI that there are new settings and highlights.
#
puts $out {
gui settings changed
gui highlight changed
set total [expr {
[array size moduleHighlights] +
[array size flatHighlights]
}]
zmessage print INF "$numberOfHighlights/$total colors restored."
}
close $out
}
# =============================================================================
# Restore - Take the fname parameter or ask the user for a tcl script which is
# then run to restore the highlighting.
# =============================================================================
#
proc SaveHighlights:Restore {{fname {}}} {
if {![file exists $fname]} {
set fname [gui window fileDialog openFile \
"Restore Highlight" {{"Tcl File" {.tcl}}}]
if {$fname == {}} {
zmessage print INF "SaveHighlights: No filename"
return
}
}
source $fname
}
# -----------------------------------------------------------------------------
# _handleCell - Traverse one level of hierarchy starting at $cell.
# -----------------------------------------------------------------------------
#
proc SaveHighlights:_handleCell {db out cell} {
SaveHighlights:_handleObject $db $cell $out
if {[$db isModule $cell]} {
set mod $cell
} else {
return
}
##
# Loop over all nets and netBuses in the given module.
#
$db foreach net $mod oid {
SaveHighlights:_handleObject $db $oid $out
}
$db foreach netBus $mod oid {
SaveHighlights:_handleObject $db $oid $out
}
##
# Loop over all ports and portBuses of the given module.
#
$db foreach port $mod oid {
SaveHighlights:_handleObject $db $oid $out
}
$db foreach portBus $mod oid {
SaveHighlights:_handleObject $db $oid $out
}
##
# Loop over all instances in the given module.
#
$db foreach inst $mod inst {
##
# Loop over all pins and pinBuses of the current instance.
#
$db foreach pin $inst oid {
SaveHighlights:_handleObject $db $oid $out
}
$db foreach pinBus $inst oid {
SaveHighlights:_handleObject $db $oid $out
}
SaveHighlights:_handleObject $db $inst $out
}
}
# -----------------------------------------------------------------------------
# _handleObject - This procedure checks if there is a highlight set at the
# given object and writes out the highlight information to the
# output file.
# -----------------------------------------------------------------------------
#
proc SaveHighlights:_handleObject {db oid out} {
##
# Get the highlight information of the current instance.
#
set hiColor [$db highlight $oid get]
if {$hiColor eq ""} {
return
}
##
# If an object has a highlight set then write it to the outfile.
#
puts $out "\t[list $oid $hiColor]"
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
if {![info exists usedAsSubmodule]} {
SaveHighlights:Init
}
|