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 | ###############################################################################
# Copyright (c) 2004-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
# Navigate Hierarchy
# @namespace
# NavigateHier
# @section
# Miscellaneous Userware Examples
# @description
# Extend the Popup menu to traverse the design hierarchy.
# @files
# navigateHier.tcl
# @example
# demo/rtl/aquarius/aquarius.f
# @cmdline
# -F @example[0]
# -userware @files[0]
# @tag
# zdb gui
###############################################################################
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc NavigateHier:Init {} {
##
# Register a Popup menu customization procedure to add a hierarchy
# navigation menu.
#
gui popup customize "NavigateHier:_customizePopup"
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc NavigateHier:Finit {} {
gui popup removeCustomize "NavigateHier:_customizePopup"
}
# -----------------------------------------------------------------------------
# _customizePopup -
# -----------------------------------------------------------------------------
#
proc NavigateHier:_customizePopup {menu oidList} {
set db [gui database get]
if {$db == {}} {
return
}
set oid [lindex $oidList 0]
$menu add cascade -label "Navigate Hierarchy"
if {([llength $oidList] != 1) || ([$db oid type $oid] != "inst") \
|| (![$db isModule $oid])} {
$menu entryconfigure "Navigate Hierarchy" -state disabled
return
}
set mod [$db moduleOf $oid]
set path [$db oid path $mod]
set subM [string map {. _} [string tolower [lindex $path end]]]
$menu entryconfigure "Navigate Hierarchy" -menu $menu.$subM
menu $menu.$subM
$menu.$subM add command -label $mod
$menu.$subM add separator
NavigateHier:_collect $menu [expr {[llength $path] - 1}] $db $mod
}
# -----------------------------------------------------------------------------
# _collect - Collect the hierarchy.
# -----------------------------------------------------------------------------
#
proc NavigateHier:_collect {menu pathLen db node} {
$db htree foreachClass $node child type clabel ilabel {
set path [$db oid path $child]
set oname [$db oid oname $child]
set pMenu $menu
foreach element [lrange $path $pathLen end] {
append pMenu .[string map {. _ " " _} [string tolower $element]]
}
if {[llength $path] > 10} {
$pMenu add command -label "..."
return
}
if {[expr $type & 1]} {
set newMenu ${pMenu}.[string tolower $oname]
$pMenu add cascade -label $clabel -menu $newMenu
menu $newMenu
NavigateHier:_collect $menu $pathLen $db $child
} else {
set newMenu ${pMenu}.[string tolower $clabel]
$pMenu add cascade -label $clabel -menu $newMenu
menu $newMenu
set instCount 0
$db htree foreachInst $child ilabel {
if {[incr instCount] > 40} {
$newMenu add command -label "..."
break
}
set instList [list [list [lreplace $child end end $ilabel]]]
$newMenu add command \
-label $ilabel \
-command "gui goto $instList"
}
}
}
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
NavigateHier:Init
|