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
###############################################################################
# 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.
# =============================================================================
#   @userware
#       Find IP Modules
#   @section
#       Analyze the Loaded Database
#   @description
#       Based on a given list of cell name patterns create an output file to
#       list all instantiation paths to cells matching the given pattern list.
#   @files
#       listIP.tcl
#   @tag
#       zdb
###############################################################################


# -----------------------------------------------------------------------------
# List of ip cell names (glob style patterns are supported).
# -----------------------------------------------------------------------------
#
set ListIP(ip_name_pattern) {
    foo
    bar
    foo*bar
}


# -----------------------------------------------------------------------------
# Name of the created output file.
# -----------------------------------------------------------------------------
#
set ListIP(output) "ip-list.txt"


# -----------------------------------------------------------------------------
# flagIP - Flag all IP cells matching a defined pattern.
# -----------------------------------------------------------------------------
#
proc flagIP {db flag ip_name_pattern} {
    ##
    # Loop over all database cells.
    #
    $db foreach cell cell {
        ##
        # First clear the used flag.
        #
        $db flag $cell clear $flag

        ##
        # Get the name of the cell.
        #
        set cellName [$db oid oname $cell]

        ##
        # Loop over all defined IP name pattern.
        #
        foreach ip_name $ip_name_pattern {
            ##
            # If the name of this cell matches one of the defined pattern then
            # set the used flag at the cell.
            #
            if {[string match $ip_name $cellName]} {$db flag $cell set $flag}
        }
    }
}


# -----------------------------------------------------------------------------
# findIP - Find the hierarchical paths to all instances of flagged IP cells.
# -----------------------------------------------------------------------------
#
proc findIP {db flag} {
    ##
    # Initialize the result list.
    #
    set instList {}

    ##
    # Traverse the design hierarchy starting from all top modules to find
    # all paths to flagged IP cells.
    #
    $db foreach top top {
        $db flat foreach instOfCell $flag $top inst {
            lappend instList $inst
        }
    }

    ##
    # Return the result list.
    #
    return $instList
}


# -----------------------------------------------------------------------------
# listIP - Collect a list of all flagged IP cells.
# -----------------------------------------------------------------------------
#
proc listIP {db} {
    global ListIP

    if {$db == {}} {
        set db [gui database get]
        if {$db == {}} {
            return
        }
    }

    ##
    # Flag all IP cells.
    #
    flagIP $db blue $ListIP(ip_name_pattern)

    ##
    # Get a list of all instances of the flagged IP cells.
    #
    set ipList [findIP $db blue]

    ##
    # Dump the list to the output file.
    #
    set out [open $ListIP(output) w]
    foreach instPath $ipList {
        puts $out $instPath
    }
    close $out
}


##
# If we have a database, then start listIP now, else register
# listIP to be executed after the design is loaded.
#
set db [gui database get]

if {$db == ""} {
    gui database registerDesignReadyCallback [list listIP $db]
} else {
    listIP $db
}