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 | ###############################################################################
# Copyright (c) 2008-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
# Calculate New Width
# @namespace
# CalculateNewWidth
# @section
# Miscellaneous Userware Examples
# @description
# Calculate new width based on the product of m and w.
# @configuration
# @license
# permit spice
# @non-interactive
# @files
# calculateNewWidth.tcl
# @example
# demo/spice/aquarius.sp
# @cmdline
# -hspice @example[0]
# -userware @files[0]
# @tag
# spice
###############################################################################
# =============================================================================
# Init - Initialize the plugin.
# =============================================================================
#
proc CalculateNewWidth:Init {} {
##
# Add the option to configure the name of the width and multiplier.
#
gui plugin addConfig CalculateNewWidth wName "W" text \
"Name of the width attribute"
gui plugin addConfig CalculateNewWidth mName "M" text \
"Name of the multiplier attribute"
##
# Register CalculateNewWidth:Start to be run on database changes,
# and immediately if there's already is a database.
#
gui database runAndRegisterChangedCallback [list CalculateNewWidth:Start]
}
# =============================================================================
# Finit - Finalize the plugin.
# =============================================================================
#
proc CalculateNewWidth:Finit {} {
##
# Remove the callback registration.
#
gui database removeChangedCallback "CalculateNewWidth:Start"
}
# =============================================================================
# Start -
# =============================================================================
#
proc CalculateNewWidth:Start {db} {
##
# Return if the database is empty.
#
if {$db == {}} {
return
}
set wName [gui plugin getConfigValue CalculateNewWidth wName]
set mName [gui plugin getConfigValue CalculateNewWidth mName]
$db foreach cell cell {
$db flag $cell clear red
}
$db foreach cell cell {
if {[$db primFuncOf $cell] eq "NMOS"} {
$db flag $cell set red
}
if {[$db primFuncOf $cell] eq "PMOS"} {
$db flag $cell set red
}
}
$db foreach top top {
$db flat foreach instOfCell red $top inst {
set m [CalculateNewWidth:_getValue $db $inst $mName]
if {$m eq ""} {
continue
}
set w [CalculateNewWidth:_getValue $db $inst $wName]
if {$w eq ""} {
continue
}
set w [zdb formatvalue tospice [expr {$m * $w}]]
$db flatattr $inst set "$wName=$w"
CalculateNewWidth:_removeAttribute $db $inst $mName
}
}
gui attribute changed
}
# -----------------------------------------------------------------------------
# _removeAttribute - Remove the attribute with the given name.
# -----------------------------------------------------------------------------
#
proc CalculateNewWidth:_removeAttribute {db inst name} {
$db attr $inst delete $name [string toupper $name] \
[string tolower $name]
$db flatattr $inst delete $name [string toupper $name] \
[string tolower $name]
}
# -----------------------------------------------------------------------------
# _getValue - Get the value of the given attribute name.
# -----------------------------------------------------------------------------
#
proc CalculateNewWidth:_getValue {db inst name} {
set v [$db flatattr $inst getValue [string toupper $name]]
if {$v eq ""} {
set v [$db attr $inst getValue [string toupper $name]]
}
if {$v eq ""} {
set v [$db flatattr $inst getValue [string tolower $name]]
}
if {$v eq ""} {
set v [$db attr $inst getValue [string tolower $name]]
}
if {$v ne ""} {
set v [zdb formatvalue fromspice $v]
}
return $v
}
# =============================================================================
# Call the initialization procedure.
# =============================================================================
#
CalculateNewWidth:Init
|