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
###############################################################################
# Copyright (c) 2004-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
#       Create Images from Spice
#   @section
#       Create Reports
#   @description
#       Load all Spice files in a given folder and create a PNG image of each
#       sub-circuit.
#
#       Loop over spice files; read each spice file (by calling
#       `zspice <options>`) and then load each sub-circuit
#       into the Schem window and print it to postscript.
#
#       Terminology: ZDB uses the Verilog name Module for a Spice "sub-circuit"
#       and the name Primitive for a Spice "model".
#   @test
#       ModuleTest
#   @files
#       cust3/printSpice.tcl
#   @example
#       demo/spice/adder.sp
#   @cmdline
#       -hspice @example[0]
#       -userware @files[0]
#   @tag
#       spice report
###############################################################################


# -----------------------------------------------------------------------------
# _applySettings - Apply the given settings.
# -----------------------------------------------------------------------------
#
proc PrintSpice:_applySettings {} {
    ##
    # For Schem window
    #
    gui settings set "schem:fitpage"       1    ;# Exact Page Size
    gui settings set "schem:sheetheight"   17.0 ;# inches
    gui settings set "schem:sheetwidth"    22.0 ;# inches

    ##
    # For Schem and Cone windows
    #
    gui settings set "nlv:shownetattr"     0
    gui settings set "nlv:showcellname"    1
    gui settings set "nlv:showinstname"    1

    gui settings changed
}


# -----------------------------------------------------------------------------
# _getParserArgs - Get the parser postprocess args.
# -----------------------------------------------------------------------------
#
proc PrintSpice:_getParserArgs {file} {
    set     args {}
    lappend args -hspice
    lappend args -ignoreCase        on
    lappend args -spos              on
    lappend args                    $file
    lappend args -evalVsource2Power on
    lappend args -evalVsource2Input on
    lappend args -mergeParallelCap  off
    lappend args -ignoreCaps        0.0
    lappend args -shortRes          0.0
    lappend args -mergemos          off
    lappend args -node              * VDD power
    lappend args -node              * VCC power
    lappend args -node              * GND ground
    lappend args -node              * VSS ground

    return $args
}


# -----------------------------------------------------------------------------
# _setAdvancedAttr - Set advanced print attributes.
# -----------------------------------------------------------------------------
#
proc PrintSpice:_setAdvancedAttr {db} {
    ##
    # We may want to configure the attributes that are displayed at the
    # components.  For NMOS and PMOS, the default is W=$w\nL=$l
    # but here we add another line showing the model name, like
    # $model\nW=$w\nL=$l\nAS=$as.  We do this by modifying the
    # "meta attribute" called "@nlv" - actually, we set that meta
    # attribute to "$model\nW=\$w\nL=\$l\nAS=\$as" making SpiceVision
    # to evaluate $w, $l and $as later (when displaying the schematic)
    # but the tcl interpreter evaluates $model now.
    #
    $db foreach primitive prim {
        set primFunc [$db primFuncOf $prim]
        if {$primFunc == "NMOS" || $primFunc == "PMOS"} {
            set model [$db oid oname $prim]
            set formula "$model\nW=\$w\nL=\$l\nAS=\$as"
            $db attr $prim set @nlv=$formula
        }
    }
    gui attribute changed
}


# =============================================================================
# Run - Run this script.
# =============================================================================
#
proc PrintSpice:Run {{path "*.sp"} {advanced 0}} {
    global PrintSpice

    if {[info exists PrintSpice(searchDir)]} {
        set searchPath [file join $PrintSpice(searchDir) "*.sp"]
    } else {
        set searchPath $path
    }

    ##
    # Loop over all *.sp Files in the current working directory
    #
    foreach file [glob -nocomplain -- $searchPath] {
        ##
        # Set parser a postprocess options.
        #
        set args [PrintSpice:_getParserArgs $file]

        ##
        # Call zspice command. The created database is returned.
        #
        set db [eval zspice $args]

        ##
        # Update the GUI for the new database.
        #
        gui database changed $db

        if {$advanced} {
            PrintSpice:_setAdvancedAttr $db
        }

        ##
        # Load each module (alias sub-circuit) into the Schem window and
        # create the Schematic for it.
        #
        $db foreach module mod {
            ##
            # We got a module-based OID in $mod, but unfortunately, need
            # a tree-based OID for the SetCurrentModule command below;
            # the "searchTreeBased" just returns one possible instance
            # path to the given module.
            #
            set mod [$db oid searchTreeBased $mod]
            gui schem setCurrentModule -activate $mod
            gui tree  setCurrentModule           $mod
            set mname [$db oid oname $mod]

            set npages [gui schem pages]
            set outFname ${file}_$mname.png
            gui console print "  Printing $outFname ($npages pages)"
            gui export photo $outFname Schem Letter png
        }

        $db close
        gui database changed {}
    }
}


# =============================================================================
# Run
# =============================================================================
#
PrintSpice:Run