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
###############################################################################
# Copyright (c) 2019-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
#       Keep Selected Cone Objects
#   @namespace
#       ConeKeepSelected
#   @section
#       Miscellaneous Userware Examples
#   @description
#       Extend the Popup menu of the Cone window and add the option to keep the
#       selected and delete all other objects.
#   @files
#       coneKeepSelected.tcl
#   @example
#       demo/rtl/aquarius/aquarius.f
#   @cmdline
#       -F @example[0]
#       -userware @files[0]
#   @tag
#       zdb gui
###############################################################################


# =============================================================================
# Init - Extend the Popup menu to start the code.
# =============================================================================
#
proc ConeKeepSelected:Init {} {
    gui popup customize "ConeKeepSelected:_popup"
}


# =============================================================================
# Finit - Undo modifications of the GUI.
# =============================================================================
#
proc ConeKeepSelected:Finit {} {
    gui popup removeCustomize "ConeKeepSelected:_popup"
}


# -----------------------------------------------------------------------------
# _popup - Extend the Popup menu if invoked in the Cone window.
# -----------------------------------------------------------------------------
#
proc ConeKeepSelected:_popup {w oidList} {
    ##
    # Only extend the Popup menu of the Cone window.
    #
    set currentWindow [gui window getCurrent]
    if {([gui window getClass $currentWindow] ne "Cone")} {
        return
    }

    ##
    # Get the currently loaded database.
    #
    set db [gui database get]

    ##
    # Set the state of the popup menu entry to disabled if either
    # no database is loaded or no object is selected.
    #
    if {($db == {}) || ($oidList == {})} {
        set state "disabled"
    } else {
        set state "normal"
    }

    ##
    # Add a separator item and a command label to the Popup menu.
    #
    $w add separator
    $w add command \
        -label   "Keep only Selected Objects" \
        -state   $state \
        -command [list ConeKeepSelected:Start $db $oidList]
}


# =============================================================================
# Start - Keep the selected and delete all other objects.
# =============================================================================
#
proc ConeKeepSelected:Start {db oidList} {
    ##
    # Enter each given OID to a hash table.
    #
    array set _oidHash {}
    foreach oid $oidList {
        ConeKeepSelected:Collect $db $oid _oidHash
    }

    ##
    # Loop over each object in the Cone window and skip OIDs entered to the
    # hash table above. Add all other OIDs to the list of non-selected objects.
    #
    set nonSelectedOids {}
    foreach oid [gui cone contents] {
        if {![info exists _oidHash($oid)]} {
            lappend nonSelectedOids $oid
        }
    }

    ##
    # Remove all non-selected objects.
    #
    gui cone remove $nonSelectedOids
}


# =============================================================================
# Collect - Hierarchically collect parent objects starting at the given $oid.
# =============================================================================
#
proc ConeKeepSelected:Collect {db oid hashName} {
    upvar 1 $hashName hash

    if {[info exists hash($oid)]} {
        return
    }

    set hash($oid) 1

    switch -exact -- [$db oid type $oid] {
        "inst" -
        "net" -
        "netBus" {
            if {[$db oid isModBased $oid]} {
                return
            }
            ConeKeepSelected:Collect $db [$db parentInst $oid] hash
        }
        "pin" -
        "pinBus" {
            ConeKeepSelected:Collect \
                $db [$db oid convertTo inst $oid] hash
        }
        "port" -
        "portBus" {
            if {[$db oid isModBased $oid]} {
                return
            }
            set module [$db oid convertTo module $oid]
            ConeKeepSelected:Collect $db [$db oid up $module] hash
        }
        "signal" {
            $db flat foreach net $oid net {
                if {[gui cone isLoaded [list $net]]} {
                    ConeKeepSelected:Collect $db $net hash
                }
            }
        }
        default {
            zmessage print WAR "Unhandled OID type: $oid"
        }
    }
}


# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
ConeKeepSelected:Init