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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240 | ###############################################################################
# Copyright (c) 2015-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
# Display Timing Violation
###############################################################################
# -----------------------------------------------------------------------------
# _readCckFile - Read the CCK report file.
# -----------------------------------------------------------------------------
#
proc _readCckFile {{fname ""} {db {}}} {
global _devTable
##
# First check if a database is available (netlist is loaded).
#
set db [gui database get]
if {$db == {}} {
zmessage print ERR "No database loaded."
return
}
##
# If the given file name is empty then show an open file dialog to browse
# for an input file.
#
if {$fname == ""} {
set ftype {{"CCK Report File" ".ccksoa"}}
set fname [gui window fileDialog openFile \
"Open a CCK Report File" $ftype]
}
##
# Return from this procedure if the file name is still empty.
#
if {$fname == ""} {
return
}
##
# Open the CCK report file for reading.
#
set in [open $fname rb]
##
# Initialize used variables.
#
set devName ""
set data {}
array set _devTable {}
##
# Read the CCK report file line by line.
#
while {![eof $in]} {
##
# Get the next line.
#
set line [gets $in]
##
# Check for lines starting with 'Dev #'.
#
if {[string match "Dev #*" $line]} {
set devName [lindex $line end]
if {![info exists _devTable($devName)]} {
set _devTable($devName) {}
}
continue
}
##
# Check for lines with 'Total Violation Time'.
#
if {[string match "*Total Violation Time*" $line]} {
lappend _devTable($devName) $data
set devName ""
set data {}
continue
}
##
# If a device name is set then append this line to the result data.
#
if {$devName != ""} {
if {[string trim $line] == ""} {
continue
}
switch -glob -- $line {
"*Data:*" -
"*Attributes:*" {continue}
default {append data $line\n}
}
}
}
##
# Close the input file.
#
close $in
##
# Show the results.
#
_displayCckResult $db
}
# -----------------------------------------------------------------------------
# _createCckWidget - Create a custom widget to show the violations.
# -----------------------------------------------------------------------------
#
proc _createCckWidget {name} {
##
# Return if the custom widget already exists.
#
if {[gui window exists $name]} {
return
}
##
# Show the result in a custom widget.
#
set f [gui window insertCustomWidget $name]
##
# Use a treeview to show the result as a list.
#
ttk::treeview $f.deviceList -show tree -yscrollcommand "$f.sa set"
ttk::scrollbar $f.sa -orient vertical -command "$f.deviceList yview"
bind $f.deviceList <<TreeviewSelect>> "_showViolation $f"
##
# Use a text widget to show the violation report.
#
text $f.t -state disabled -yscrollcommand "$f.sb set"
ttk::scrollbar $f.sb -orient vertical -command "$f.t yview"
##
# Layout the widgets.
#
grid $f.deviceList -row 0 -column 0 -sticky ns
grid $f.sa -row 0 -column 1 -sticky ns
grid $f.t -row 0 -column 2 -sticky nswe
grid $f.sb -row 0 -column 3 -sticky ns
grid rowconfigure $f 0 -weight 1
grid columnconfigure $f 2 -weight 1
return $f
}
# -----------------------------------------------------------------------------
# _displayCckResult - Read the CCK report file.
# -----------------------------------------------------------------------------
#
proc _displayCckResult {db} {
global _devTable
##
# Create a custom widget to show the cck results.
#
set f [_createCckWidget "CCK"]
##
# Add the results to the widgets.
#
foreach {devName data} [array get _devTable] {
set inst [$db get_inst -hiersep . $devName]
if {[$db oid isnull $inst]} {
zmessage print ERR "Device '$devName' could not be found."
continue
}
$f.deviceList insert {} end -text $devName -values $inst
}
}
# -----------------------------------------------------------------------------
# _showViolation - Show the violations for the selected device.
# -----------------------------------------------------------------------------
#
proc _showViolation {w} {
global _devTable
##
# Get the selected item and extract the device names and the corresponding
# instance OID.
#
set item [$w.deviceList focus]
set devName [$w.deviceList item $item -text]
set instOid [$w.deviceList item $item -values]
##
# Show the device in the main GUI.
#
gui goto [list $instOid]
##
# Show the corresponding violation in the text widget.
#
$w.t configure -state normal
$w.t delete 1.0 end
foreach date $_devTable($devName) {
$w.t insert end $date
}
$w.t configure -state disabled
}
# =============================================================================
# Add a new main menu entry 'Debug' to access the procedure of this script.
# =============================================================================
#
gui menu command {"Debug" "Load CCK Report File"} {_readCckFile}
# =============================================================================
# If this script was loaded using -userware2 then the given argument specifies
# the name of the CCK report file. In this case register the '_readCckFile'
# procedure to be executed as soon as the database is available (netlist read).
# =============================================================================
#
if {$argc == 1} {
gui database registerChangedCallback "_readCckFile [lindex $argv 0]"
}
|