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
185
186
187
188
189
###############################################################################
# Copyright (c) 2012-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
#       Capacitor like devices between power and ground.
#
#       Algorithm
#           1. Identify all Capacitor and MOS devices in the loaded design.
#           2. Check if the S/D and gate pin is connected to a ground
#              node, while S/D is connected to a power node.
#           3. Check the Capacitor pins between power and ground nodes.
#           4. Add the devices that violate the above rule to the result list.
#
#       Example
#           demo/api/erc/testcase05.sp
###############################################################################


# =============================================================================
# Check05 -
# =============================================================================
#
proc ERC:Check05 {db} {
    ##
    # Initialize the result list.
    #
    set resList {}

    ##
    # Flag devices in the loaded database.
    #
    zprogress push "" 0.05
    ERC:FlagDevices $db {"NMOS" "PMOS" "CAP"}
    if {[zprogress pop]} {
        return
    }

    ##
    # Loop over all modules in the loaded design.
    #
    zprogress push "" 1.0
    set mcount [$db count module]
    set m 0
    $db foreach module module {
        zmessage print DBG \
            "Process module [$db oid print $module]"

        zprogress push "" [expr {double([incr m]) / $mcount}]

        ##
        # Loop over all instances in the current module.
        #
        set icount [$db count inst $module]
        set i 0
        $db foreach inst $module inst {
            if {[zprogress update "" [incr i] $icount]} {
                break
            }

            ##
            # Skip all instances where the cell referenced by the instance
            # has the green flag not set.
            #
            if {![$db flag [$db down $inst] is green]} {
                continue
            }
            zmessage print DBG \
                "  Process instance [$db oid print $inst]"

            ##
            # Get the device function of this instance.
            #
            set primFunc [$db primFuncOf $inst]
            switch -- $primFunc {
                "CAP"   {set res [_checkCap $db $inst]}
                "NMOS"  -
                "PMOS"  {set res [_checkCapLikeMos $db $inst $primFunc]}
                default {error "Function '$primFunc' not handled."}
            }

            ##
            # If this is a match then add this instance to the result list.
            #
            if {$res} {
                zmessage print DBG \
                    "      Found result: $inst"
                lappend resList $inst
            }
        }
        if {[zprogress pop]} {
            break
        }
    }
    if {[zprogress pop]} {
        return {}
    }

    ##
    # Return the calculated result.
    #
    return $resList
}


# -----------------------------------------------------------------------------
# _checkCap - On a capacitor check if the plus pin is connected to power and
#             the minus pin is connected to ground.
# -----------------------------------------------------------------------------
#
proc _checkCap {db inst} {
    ##
    # Get the plus and minus pins of the capacitor.
    #
    set plusPin  [$db getFuncPort $inst 0]
    set minusPin [$db getFuncPort $inst 1]

    ##
    # Check if plus is connected to power and minus is connected to ground.
    #
    if {[ERC:IsConnectedToPG $db $plusPin  "power"] &&
        [ERC:IsConnectedToPG $db $minusPin "ground"]} {
        return true
    }

    ##
    # Check if minus is connected to power and plus is connected to ground.
    #
    if {[ERC:IsConnectedToPG $db $plusPin  "ground"] &&
        [ERC:IsConnectedToPG $db $minusPin "power"]} {
        return true
    }

    return false
}


# -----------------------------------------------------------------------------
# _checkCapLikeMos -
# -----------------------------------------------------------------------------
#
proc _checkCapLikeMos {db inst func} {
    ##
    # Depending on the device function set power ground flags
    # to check.
    #
    if {$func == "NMOS"} {
        set gateCon "power"
        set sdCon   "ground"
    } else {
        set gateCon "ground"
        set sdCon   "power"
    }

    ##
    # Get the gate, drain and source pins of this device.
    #
    set gatePin   [$db getFuncPort $inst -name "gate"]
    set drainPin  [$db getFuncPort $inst -name "drain"]
    set sourcePin [$db getFuncPort $inst -name "source"]

    ##
    # Check if the gate pin is connected to power or ground.
    #
    if {![ERC:IsConnectedToPG $db $gatePin $gateCon]} {
        return false
    }

    ##
    # Check the drain and source connectivity.
    #
    if {[ERC:IsConnectedToPG $db $drainPin  $sdCon] &&
        [ERC:IsConnectedToPG $db $sourcePin $sdCon]} {
        return true
    }

    return false
}