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
###############################################################################
# Copyright (c) 2017-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
#       Demo Plugin
#   @namespace
#       DemoPlugin
#   @section
#       Miscellaneous Userware Examples
#   @description
#       A demo plugin to demonstrate all features of the plugin API:
#
#       1. Register a callback function to change the display attributes on
#          each database reload.
#
#       2. Add a menu item to print all module names to demo GUI modifications.
#
#       3. Add some configuration options for the plugin.
#   @configuration
#   @non-interactive
#   @files
#       demoPlugin.tcl
#   @example
#       demo/rtl/aquarius/aquarius.f
#   @cmdline
#       -F @example[0]
#       -userware @files[0]
#   @tag
#       gui
###############################################################################


# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc DemoPlugin:Init {} {
    ##
    # Apply default configuration
    #
    foreach {key value type doc} {
        title    "The Modules:" text   "Title of the modules list."
        indent   4              number "Indent the modules list by X spaces."
        full_oid 0              bool   "Print full OIDs"
    } {
        gui plugin addConfig DemoPlugin $key $value $type $doc
    }

    ##
    # Add a menu entry.
    #
    gui menu command {"Demo Plugin" "Print Modules"} \
        [list DemoPlugin:PrintModules]

    ##
    # Register DemoPlugin:AddDisplayAttributes to be run on database changes,
    # and immediately if there's already is a database.
    #
    gui database runAndRegisterChangedCallback \
        [list DemoPlugin:AddDisplayAttributes 1]
}


# =============================================================================
# Finit - Finalize the plugin.
#         This procedure is automatically called when deactivating the plugin.
# =============================================================================
#
proc DemoPlugin:Finit {} {
    global Global

    ##
    # Undo modifications of the GUI.
    #
    gui menu removeEntry {"Demo Plugin" "Print Modules"}

    DemoPlugin:AddDisplayAttributes 0 $Global(db)

    ##
    # Remove the callback registration.
    #
    gui database removeChangedCallback "DemoPlugin:AddDisplayAttributes"
}


# =============================================================================
# PrintModules - Demo function added to the menu.
#                Print all modules of the current db.
#                This procedure also accesses the plugin config options.
# =============================================================================
#
proc DemoPlugin:PrintModules {} {
    set db [gui database get]
    if {$db == {}} {
        return
    }

    set title  [gui plugin getConfigValue DemoPlugin title]
    set indent [string repeat " " [gui plugin getConfigValue DemoPlugin indent]]
    set full   [gui plugin getConfigValue DemoPlugin full_oid]

    set names {}
    $db foreach module m {
        if {$full} {
            lappend names $m
        } else {
            lappend names [$db oid oname $m]
        }
    }

    gui console print $title

    foreach name [lsort -dictionary $names] {
        gui console print "$indent$name"
    }
}


# =============================================================================
# AddDisplayAttributes - Demo function hooked to database updates:
#
#                        - Add an attribute to each instance with the total
#                          number of instantiations of the referenced cell type.
#                        - Add display attributes to all cells in the given
#                          database to show the reference count value.
# =============================================================================
#
proc DemoPlugin:AddDisplayAttributes {show db} {
    if {$db == {}} {
        return
    }

    ##
    # Add number of references to each instance.
    #
    $db foreach module module {
        $db foreach inst $module inst {
            if {$show} {
                $db attr $inst add count=[$db refCount [$db down $inst]]
            } else {
                $db attr $inst delete count
            }
        }
    }

    set refsAttr "REFS=%{count}"

    $db foreach cell cell {
        set attr [$db attr $cell getValue "@nlv"]
        if {$show} {
            if {![string match "*${refsAttr}*" $attr]} {
                if {[string length [string trim $attr]] > 0} {
                    append attr "\n"
                }
                append attr $refsAttr
            }
        } else {
            set attr [string trim [string map [list $refsAttr ""] $attr] "\n"]
        }
        $db attr $cell set "@nlv=$attr"
    }

    gui attribute changed
    gui schem regenerate
}


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