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 | ###############################################################################
# Copyright (c) 2016-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.
# =============================================================================
# @script
# Extend the Popup menu and add an entry to connect all input and output
# pins of two selected instances.
###############################################################################
# =============================================================================
# PathBetweenModuleInsts - Find all paths between the output pins of a given
# start module instance and any pin of a given target
# module instance.
# =============================================================================
#
proc PathBetweenModuleInsts {startModuleInst targetModuleInst} {
set db [gui database get]
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# Clear the target and red flag.
#
$db foreach top top {$db flatflag $top clearall target}
$db flag -db clear red
##
# Get list of start pins.
#
set startList {}
$db foreach pin $startModuleInst pin {
switch -- [$db directionOf $pin] {
"inout" -
"output" {lappend startList $pin}
}
}
##
# Flag all target pins.
#
$db foreach pin $targetModuleInst pin {
switch -- [$db directionOf $pin] {
"inout" -
"input" {$db flatflag $pin set target}
}
}
##
# If start and target instance are in the same parent module then flag
# all other instances in this module red to be excluded by the cone search.
#
set parent [$db parentModule $startModuleInst]
if {[$db oid isequal $parent [$db parentModule $targetModuleInst]]} {
$db foreach inst $parent inst {
if {[$db oid isequal $inst $startModuleInst]} {
continue
}
if {[$db oid isequal $inst $targetModuleInst]} {
continue
}
$db flag $inst set red
}
}
##
# Run the cone extraction.
#
return [$db cone -startList $startList \
-excludeFlaggedInst red \
-excludeFlaggedCell clock \
-dontDive \
-targetFlatFlagged target]
}
# -----------------------------------------------------------------------------
# _connect - Connect the two given instances.
# -----------------------------------------------------------------------------
#
proc _connect {oidList} {
set db [gui database get]
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# We expect one instance object in $oidList
#
if {[llength $oidList] != 2} {
zmessage print ERR "Expect exactly 2 objects selected."
return
}
set inst1 [lindex $oidList 0]
set inst2 [lindex $oidList 1]
if {[$db oid type $inst1] != "inst"} {
zmessage print ERR "Selected object 1 is not an instance."
return
}
if {[$db oid type $inst2] != "inst"} {
zmessage print ERR "Selected object 2 is not an instance."
return
}
set res1 [PathBetweenModuleInsts $inst1 $inst2]
set res2 [PathBetweenModuleInsts $inst2 $inst1]
set res [concat $res1 $res2]
##
# Show the results.
#
gui cone append $res
gui cone fold [list $inst1 $inst2]
gui cone regenerate
}
# =============================================================================
# Customize the Popup Menu.
# =============================================================================
#
gui popup append "Connect Selected Instances" "_connect"
|