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 | ###############################################################################
# Copyright (c) 2023-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
# Merge two similar design and register a selection callback to show the
# object selected in designA also in designB.
###############################################################################
set SelectionCallback(tabName) "Goto in DB_B"
# -----------------------------------------------------------------------------
# Init - Initialize the database and setup the callback.
# -----------------------------------------------------------------------------
#
proc SelectionCallback:Init {binfileA binfileB} {
global SelectionCallback
##
# Open the two design databases.
#
set dbA [zdb open $binfileA]
set dbB [zdb open $binfileB]
##
# Get the name of the top design in databaseB.
#
set topB [$dbB get_top_design -name]
##
# Merge the two design databases into one and prepend a prefix to all cells.
#
set db [zdb new]
SelectionCallback:cloneInto $db $dbA "DB_A--"
SelectionCallback:cloneInto $db $dbB "DB_B--"
##
# Close the two individual design databases.
#
$dbA close
$dbB close
##
# Get the top design module of designB in the merged database.
#
set top [$db search top "DB_B--${topB}"]
##
# Inform the GUI that the database has changed.
#
gui database changed $db
##
# Split the main window and add a schem window to the right side.
#
if {![gui window exists $SelectionCallback(tabName)]} {
set tab [gui window split [gui window defaultClassWindow Schem] right]
gui window new -tabwindow $tab "Schem" -name $SelectionCallback(tabName)
}
##
# Register a selection changed callback to call the action procedure.
#
gui selection registerCallback [list SelectionCallback:action $w $db $top]
}
# -----------------------------------------------------------------------------
# action - The action procedure for the selection changed callback.
# -----------------------------------------------------------------------------
#
proc SelectionCallback:action {db top oidList} {
global SelectionCallback
##
# Double check that the target window exists.
#
if {![gui window exists $SelectionCallback(tabName)]} {
zmessage print WAR \
"The window '$SelectionCallback(tabName)' does not exist."
return
}
##
# Find each object selected in designA also in designB.
# Here the `$b createFromString` API is used. For a more advanced search,
# the `$db find` API can be used.
#
set gotoList {}
foreach oid $oidList {
set type [$db oid type $oid]
set objName [$db oid print -noroot -notype -hiersep . $oid]
set oidB [$db oid createFromString $type $top $objName .]
lappend gotoList $oidB
}
##
# Show the corresponding OIDs in the target window.
#
gui goto -window $SelectionCallback(tabName) $gotoList
gui zoomTo -window $SelectionCallback(tabName) $gotoList
}
# -----------------------------------------------------------------------------
# cloneInto - Clone $db into $target_db and prepend $prefix to all modules.
# -----------------------------------------------------------------------------
#
proc SelectionCallback:cloneInto {target_db db prefix} {
$db foreach cell c {
set name [$db oid oname $c]
$db oper rename $c $prefix$name
}
$db oper rename -updateOIDs
$db cloneDB -into $target_db
}
##
# If two ZDb binfiles are given ion the command line, then call the
# initialization procedure.
#
if {$argc == 2} {
SelectionCallback:Init [lindex $argv 0] [lindex $argv 1]
}
|