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 | ###############################################################################
# Copyright (c) 2021-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
# Pin Search And Driver Extraction
# @namespace
# PinSearch
# @section
# Analyze the Loaded Database
# @description
# Search for hierarchical pins and extract the driver.
# The menu entry "Search Pins/Search" opens a dialog to search
# for hierarchical pins. Results are displayed in the "Mem" window.
# The "Mem" window's popup menu entry "Search Pins/Extract to Driver"
# searches for the driver of the selected pin and appends the result to
# the "Cone" window.
# @files
# cust35/pinSearch.tcl
# @tag
# gui
###############################################################################
namespace eval PinSearch {
variable _W ".pinSearch"
variable _PinPattern ""
variable _CellPattern ""
variable _CaseInsensitive 1
variable _Globbing 1
}
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc ::PinSearch::Init {} {
##
# Add menu entries.
#
gui menu command {"Pin Search" "Search"} [list ::PinSearch::_showWidget]
gui popup append \
-menuname "Pin Search" \
"Extract to Driver" \
[list ::PinSearch::_extractDriver] \
"-class Mem"
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc ::PinSearch::Finit {} {
##
# Undo modifications of the GUI.
#
gui menu removeEntry {"Pin Search"}
gui popup remove -menuname "Pin Search" "Extract to Driver"
##
# Close widget.
#
_closeWidget
}
# =============================================================================
# Find_in_tree - Find a hierarchical pin by name.
# =============================================================================
#
proc ::PinSearch::Find_in_tree {
db
pin_pattern
cell_pattern
case_insensitive
globbing
oid_variable
body
} {
set options [list -type pin -resulttype treebased]
if {$case_insensitive} {
lappend options -case insensitive
} else {
lappend options -case sensitive
}
if {!$globbing} {
lappend options -exact
}
if {$cell_pattern ne ""} {
lappend options -cellref $cell_pattern
}
$db find {*}$options $pin_pattern $oid_variable $body
}
# -----------------------------------------------------------------------------
# _showWidget - Show the input dialog
# -----------------------------------------------------------------------------
#
proc ::PinSearch::_showWidget {} {
variable _W
variable _PinPattern
variable _CellPattern
variable _CaseInsensitive
variable _Globbing
set db [gui database get]
if {$db eq ""} {
zmessage print WAR "No Database"
return
}
if {![winfo exists $_W]} {
toplevel $_W \
-class Dialog
wm withdraw $_W
ttk::label $_W.pinLabel \
-text "Pin"
ttk::label $_W.cellLabel \
-text "Cell"
ttk::entry $_W.pin \
-textvariable ::PinSearch::_PinPattern
ttk::entry $_W.cell \
-textvariable ::PinSearch::_CellPattern
ttk::checkbutton $_W.caseInsensitive \
-text "Case Insensitive" \
-variable ::PinSearch::_CaseInsensitive
ttk::checkbutton $_W.globbing \
-text "Globbing" \
-variable ::PinSearch::_Globbing
set opt {-sticky news -padx 4 -pady 4}
ttk::frame $_W.buttons
ttk::button $_W.buttons.cancel \
-text Cancel
ttk::button $_W.buttons.search \
-text Search
grid $_W.buttons.cancel -row 0 -column 1 {*}$opt
grid $_W.buttons.search -row 0 -column 2 {*}$opt
grid rowconfigure $_W.buttons 0 -weight 1
grid columnconfigure $_W.buttons 0 -weight 1
grid $_W.pinLabel -row 0 -column 0 {*}$opt
grid $_W.pin -row 0 -column 1 {*}$opt
grid $_W.cellLabel -row 1 -column 0 {*}$opt
grid $_W.cell -row 1 -column 1 {*}$opt
grid $_W.caseInsensitive -row 2 -column 0 -columnspan 2 {*}$opt
grid $_W.globbing -row 3 -column 0 -columnspan 2 {*}$opt
grid $_W.buttons -row 5 -column 0 -columnspan 2 -sticky news
grid columnconfigure $_W 1 -weight 1
grid rowconfigure $_W 4 -weight 1
bind $_W.pin <Key-Return> [list focus $_W.cell]
bind $_W.cell <Key-Return> [list $_W.buttons.search invoke]
}
set button [gui window dialog \
$_W \
"Search Pin" \
-place "CENTER" \
-focus $_W.pin \
-buttons [list $_W.buttons.cancel $_W.buttons.search] \
]
wm withdraw $_W
if {$button != 1} {
return
}
gui mem clear
gui window show Mem
set found 0
Find_in_tree \
$db $_PinPattern $_CellPattern $_CaseInsensitive $_Globbing oid \
{
incr found
gui mem append [list $oid]
}
if {$found == 0} {
gui console print "No pins found."
}
}
# -----------------------------------------------------------------------------
# _closeWidget - Destroy the input widget
# -----------------------------------------------------------------------------
#
proc ::PinSearch::_closeWidget {} {
variable _W
if {[winfo exists $_W]} {
destroy $_W
}
}
# -----------------------------------------------------------------------------
# _extractDriver - Extract driver from pin
# -----------------------------------------------------------------------------
#
proc ::PinSearch::_extractDriver {oids} {
set db [gui database get]
set result {}
foreach oid $oids {
if {[$db oid type $oid] ne "pin"} {
zmessage print WAR "Skipping non-pin object: $oid"
continue
}
set options {-in}
lappend options -targetFlaggedCell clock
lappend options -targetIO
lappend options -unknown2IO
lappend options -checkArcs
lappend options -paths
lappend options -createNetSeg
zprogress begin
foreach path [$db cone {*}$options $oid] {
lappend result {*}[lrange $path 1 end]
}
zprogress end
}
gui cone append -highlight $result
gui window show Cone
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
::PinSearch::Init
|