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 | ###############################################################################
# Copyright (c) 2018-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.
# =============================================================================
# @userware
# Remove Hierarchy (Oper-Command)
# @section
# Modify the Loaded Database
# @description
# Remove all levels of hierarchy and create a flat version of the loaded
# design (using `$db oper rmhier`).
# @files
# removeHierarchy.tcl
# @example
# demo/rtl/aquarius/aquarius.f
# @cmdline
# -F @example[0]
# -userware @files[0]
# @tag
# zdb
###############################################################################
# -----------------------------------------------------------------------------
# flatDesign - Loop over all tops, unfold the design tree and
# call 'oper rmhier'.
# -----------------------------------------------------------------------------
#
proc flatDesign {db} {
global RemoveHierarchy
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# Remove the callback that is installed with 'Gui"RegisterDataBaseChanged'
# because at the end of this procedure 'gui database changed' is called.
#
if {$RemoveHierarchy(callbackRegistered)} {
gui database removeChangedCallback "flatDesign"
set RemoveHierarchy(callbackRegistered) 0
}
##
# To create a flat version of this design the paths starting from all top
# modules need to be singlized (resolve all multiple instantiations of
# the same module).
#
$db foreach top top {$db oper singlizeTree $top}
##
# All modules need to be in topological order.
#
$db oper tsort
##
# Get the current hierarchy separator.
#
set hiersep [$db hiersep]
##
# Enable the progress bar.
#
zprogress begin
##
# Create a list of all modules.
#
set moduleList {}
$db foreach module module {lappend moduleList $module}
set modCount [llength $moduleList]
##
# Loop over all modules with a progress bar.
#
set m 0
zprogress push "rmhier" 1.0
foreach module $moduleList {
set percent [expr {[incr m] / double($modCount)}]
zprogress push "Process Module [$db oid oname $module]" $percent
##
# Build a list of all hierarchical instances in this module.
#
set instList {}
$db foreach inst $module inst {
if {[$db isModule $inst]} {lappend instList $inst}
}
##
# Skip this module if there are no hierarchical instances.
#
set instCount [llength $instList]
if {$instCount == 0} {
continue
}
##
# Loop over all hierarchical instances.
#
set i 0
foreach inst $instList {
set percent [expr {[incr i] / double($instCount)}]
zprogress push "Process Inst [$db oid oname $inst]" $percent
##
# Call 'rmhier' on this instance.
#
$db oper rmhier $inst [$db oid oname $inst]$hiersep
if {[zprogress pop]} {
break
}
}
if {[zprogress pop]} {
break
}
}
zprogress pop
##
# Finish the progress bar.
#
zprogress end
##
# Clean up.
#
$db deleteZombies
set hiersep [$db oper hiersep scan]
$db hiersep $hiersep
gui database changed $db
}
# -----------------------------------------------------------------------------
# flatDesignFromMenu - Called from main menu.
# -----------------------------------------------------------------------------
#
proc flatDesignFromMenu {} {
flatDesign [gui database get]
}
# =============================================================================
# Add "Flat Design" to a new Userware main menu.
# =============================================================================
#
gui menu command {"Userware" "Flat Design"} {flatDesignFromMenu}
##
# Use gui database runOrRegisterChangedCallback to immediately run
# flatDesign
# if we have a database, or otherwise register the proc to be executed after
# the database is available.
#
set RemoveHierarchy(callbackRegistered) \
[gui database runOrRegisterChangedCallback flatDesign]
|