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
###############################################################################
# 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.
# =============================================================================
#   @plugin
#       Run ERC Checks
#   @namespace
#       ERC
#   @section
#       Analyze the Loaded Database
#   @description
#       Load the ERC checks.
#       - check01.tcl:
#         Check that the gate pin of a MOSFET device is not connected to a power
#         or ground node.
#
#       - check02.tcl:
#         Detect floating gates at the MOS devices, either directly or through
#         pins of a resistor.
#
#       - check03.tcl:
#         Check for wrong bulk connections.
#
#       - check04.tcl:
#         Forward bias diode between power and ground.
#
#       - check05.tcl:
#         Capacitor like devices between power and ground.
#
#       - check06.tcl:
#         Floating input, power and ground ports.
#
#       - check07.tcl:
#         Cell tie-off.
#   @test
#       ModuleTest
#   @files
#       erc/runerc.tcl
#       erc/utils.tcl
#       erc/check01.tcl
#       erc/check02.tcl
#       erc/check03.tcl
#       erc/check04.tcl
#       erc/check05.tcl
#       erc/check06.tcl
#       erc/check07.tcl
#       erc/check14.tcl
#   @example
#       demo/spice/ram2k.sp
#       demo/spice/amd2901.sp
#   @cmdline
#       -hspice @example[0]
#       -userware @files[0]
#   @tag
#       zdb gui spice
###############################################################################


##
# Load utility procedures used by all checks.
#
source [file join [file dirname [info script]] "utils.tcl"]


# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc ERC:Init {} {
    global ERC

    set ERC(MenuEntries) {}

    lappend ERC(MenuEntries) Check01 "Gate Connection to Supply"
    lappend ERC(MenuEntries) Check02 "Floating Gate"
    lappend ERC(MenuEntries) Check03 "Wrong Bulk Connection"
    lappend ERC(MenuEntries) Check04 "Forward Bias Diode"
    lappend ERC(MenuEntries) Check05 "Capacitor Like Devices"
    lappend ERC(MenuEntries) Check06 "Floating Input and Supply Ports"
    lappend ERC(MenuEntries) Check07 "Cell Tie-off"
    lappend ERC(MenuEntries) Check14 "Power Connectivity"

    ##
    # Add a command to the menu for each check.
    #
    set cwd [file dirname [info script]]
    foreach {check menuLabel} $ERC(MenuEntries) {
        source [file join $cwd [string tolower $check].tcl]
        gui menu command            \
            [list "ERC" $menuLabel] \
            [list ERC:_runErcCheck $menuLabel ERC:$check]
    }
}


# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc ERC:Finit {} {
    global ERC

    foreach {check menuLabel} $ERC(MenuEntries) {
        gui menu removeEntry [list "ERC" $menuLabel]
    }

    array unset ERC
}


# -----------------------------------------------------------------------------
# _runErcCheck - Run the given check and show the result.
# -----------------------------------------------------------------------------
#
proc ERC:_runErcCheck {description check} {
    ##
    # Get the currently loaded database.
    #
    set db [gui database get]

    ##
    # Return if the database is empty.
    #
    if {$db == {}} {
        zmessage print ERR "No Database Loaded."
        return
    }

    ##
    # Run the check and assign the result to a variable.
    #
    zprogress begin
    zprogress push $description 1.0
    set resultList [$check $db]
    if {[zprogress pop]} {
        return
    }
    zprogress end

    ##
    # Clear and activate the Mem Window
    #
    gui mem clear
    gui window show Mem
    gui window show Schem

    ##
    # Store the result into the Mem Window.
    #
    gui mem append $resultList
}


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