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 | ###############################################################################
# Copyright (c) 2014-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
# Generate Spice From Parasitic
# @section
# Miscellaneous Userware Examples
# @description
# Read a text file containing names of hierarchical instances. For all
# nets inside these sub-circuits the RC network will be loaded to the
# Parasitic window and a Spice netlist is created.
# @files
# parasitic/createSpiceNetlist.tcl
# @tag
# dspf parasitic spf spef
###############################################################################
# -----------------------------------------------------------------------------
# _checkForSpfFile - Check if a DSPF or SPEF file is loaded.
# -----------------------------------------------------------------------------
#
proc _checkForSpfFile {db} {
$db spos foreachfile fname mod {
set filetype [$db spos filetype $fname]
if {($filetype eq "Dpef") || ($filetype eq "Spef")} {
return 1
}
}
return 0
}
# -----------------------------------------------------------------------------
# _readConfigFile - Read the configuration file.
# -----------------------------------------------------------------------------
#
proc _readConfigFile {fname db top hiersep} {
set in [open $fname r]
set contents {}
while {![eof $in]} {
set line [gets $in]
##
# Try to create either an instance or net OID.
#
if {[catch {
set oid [$db oid createFromString inst $top $line $hiersep]
} msg]} {
if {[catch {
set oid [$db oid createFromString net $top $line $hiersep]
}]} {
zmessage print ERR "Cannot create instance '$line': $msg"
continue
}
}
lappend contents $oid
}
close $in
return $contents
}
# -----------------------------------------------------------------------------
# _expandOID - Expand the given OID to return only net OID.
# -----------------------------------------------------------------------------
#
proc _expandOID {db oid} {
set netList {}
if {[$db oid type $oid] == "inst"} {
if {[$db isModule $oid]} {
set module [$db down $oid]
$db foreach net $module net {lappend netList $net}
} else {
zmessage print ERR "Instance '$oid' is not a module."
break
}
} else {
lappend netList $oid
}
return $netList
}
# -----------------------------------------------------------------------------
# _createSpiceNetlist -
# -----------------------------------------------------------------------------
#
proc _createSpiceNetlist {configFile db} {
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
##
# Return if no DSPF or SPEF file is present.
#
if {![_checkForSpfFile $db]} {
return
}
##
# Get the top module.
#
set top [$db get_top_design]
##
# Read the configuration.
#
set oidList [_readConfigFile $configFile $db $top "/"]
##
# Show the Parasitic Window.
#
gui parasitic showWindow
##
# Configure the Parasitic window.
#
gui settings set "parasiticDetails" 0
gui settings changed
##
# Loop over each OID, expand it and load the corresponding RC network.
#
foreach oid $oidList {
##
# Expand the oidList.
#
set netList [_expandOID $db $oid]
##
# Load the RC network of all nets.
#
gui parasitic show $netList
##
# Write a Spice netlist of the contents of the Parasitic window.
#
set spcFname [$db oid print $oid -notype -noroot -hiersep _]
gui parasitic saveAs Spice $spcFname.sp
}
}
# -----------------------------------------------------------------------------
# Check for exactly one argument, the configuration file.
# Start this script as '-userware2 createSpiceNetlist.tcl config.txt'.
# -----------------------------------------------------------------------------
#
if {$argc != 1} {
error "Wrong number of args. Missing configuration file."
}
##
# Get the name of the configuration.
#
set configFile [lindex $argv 0]
##
# Use gui database runOrRegisterChangedCallback to immediately run
# _createSpiceNetlist
# if we have a database, or otherwise register the proc to be executed after
# the database is available.
#
gui database runOrRegisterChangedCallback [list _createSpiceNetlist $configFile]
|