Hog v10.10.0
post-synthesis.tcl
Go to the documentation of this file.
1 #!/usr/bin/env tclsh
2 # Copyright 2018-2026 The University of Birmingham
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 # @file
17 # The post synthesis script copies the synthesis reports and other files to the bin.
18 # This script is automatically integrated into the Vivado/Quartus workflow by the Create Project script.
19 
20 ##nagelfar variable quartus
21 ##nagelfar variable project
22 
23 set tcl_path [file normalize "[file dirname [info script]]/.."]
24 source $tcl_path/hog.tcl
25 
26 if {[IsISE]} {
27  # Vivado + PlanAhead
28  set old_path [file normalize "../../Projects/$project/$project.runs/synth_1"]
29  file mkdir $old_path
30 } else {
31  set old_path [pwd]
32 }
33 
34 if {[IsXilinx]} {
35  # Vivado + PlanAhead
36  if {[IsISE]} {
37  set proj_dir [get_property DIRECTORY [current_project]]
38  set project [file tail $proj_dir]
39  set proj_file $proj_dir/$project.prr
40  } else {
41  set proj_file [get_property parent.project_path [current_project]]
42  }
43  set proj_dir [file normalize [file dirname $proj_file]]
44  set proj_name [file rootname [file tail $proj_file]]
45  set top_name [get_property top [current_fileset]]
46 } elseif {[IsQuartus]} {
47  # Quartus
48  set proj_name [lindex $quartus(args) 1]
49  #set proj_dir [file normalize "$repo_path/Projects/$proj_name"]
50  set proj_dir [pwd]
51  set proj_file [file normalize "$proj_dir/$proj_name.qpf"]
52  # Test generated files
53  set hogQsysFileName [file normalize "$proj_dir/.hog/.hogQsys.md5"]
54  if {[file exists $hogQsysFileName] != 0} {
55  set hogQsysFile [open $hogQsysFileName r]
56  set hogQsysFileLines [split [read $hogQsysFile] "\n"]
57  foreach line $hogQsysFileLines {
58  set fileEntry [split $line "\t"]
59  set fileEntryName [lindex $fileEntry 0]
60  if {$fileEntryName != ""} {
61  if {[file exists $fileEntryName]} {
62  set newMd5Sum [Md5Sum $fileEntryName]
63  set oldMd5Sum [lindex $fileEntry 1]
64  if {$newMd5Sum != $oldMd5Sum} {
65  Msg Warning "The checksum for file $fileEntryName is not equal to the one saved in $hogQsysFileName.\n\
66  New checksum $newMd5Sum, old checksum $oldMd5Sum. \
67  Please check the any changes in the file are correctly propagated to git!"
68  }
69  } else {
70  Msg Warning "File $fileEntryName not found... Will not check Md5Sum!"
71  }
72  }
73  }
74  }
75 } elseif {[IsDiamond]} {
76  # Import tcllib
77  if {[info exists env(HOG_TCLLIB_PATH)]} {
78  lappend auto_path $env(HOG_TCLLIB_PATH)
79  } else {
80  puts "ERROR: To run Hog with Microsemi Libero SoC, you need to define the HOG_TCLLIB_PATH variable."
81  return
82  }
83  set proj_dir [file normalize "[pwd]/.."]
84  set proj_name [file tail $proj_dir]
85  set project $proj_name
86 } else {
87  #Tclssh
88  set proj_file $old_path/[file tail $old_path].xpr
89  set proj_dir [file normalize [file dirname $proj_file]]
90  set proj_name [file rootname [file tail $proj_file]]
91  Msg CriticalWarning "You seem to be running locally on tclsh, so this is a debug message. \
92  The project file will be set to $proj_file and was derived from the path you launched this script from: $old_path. \
93  If you want this script to work properly in debug mode, please launch it from the top folder of one project, \
94  for example Repo/Projects/fpga1/ or Repo/Top/fpga1/"
95 }
96 
97 if {[catch {package require struct::matrix} ERROR]} {
98  puts "$ERROR\n If you are running this script on tclsh, you can fix this by installing 'tcllib'"
99  return
100 }
101 
102 # Go to repository path
103 set repo_path [file normalize "$tcl_path/../.."]
104 set bin_dir [file normalize "$repo_path/bin"]
105 
106 cd $repo_path
107 
108 set group_name [GetGroupName $proj_dir "$tcl_path/../.."]
109 
110 Msg Info "Evaluating Hog describe for $proj_name..."
111 set describe [GetHogDescribe [file normalize ./Top/$group_name/$proj_name] $repo_path]
112 Msg Info "Git describe set to: $describe"
113 set dst_dir [file normalize "$bin_dir/$group_name/$proj_name\-$describe"]
114 
115 Msg Info "Creating $dst_dir..."
116 file mkdir $dst_dir
117 # Reports
118 file mkdir $dst_dir/reports
119 
120 
121 # Vivado
122 if {[IsXilinx]} {
123  # Vivado + PlanAhead
124  if {[IsISE]} {
125  # planAhead
126  set work_path [get_property DIRECTORY [get_runs synth_1]]
127  } else {
128  # Vivado
129  set work_path $old_path
130  }
131  set run_dir [file normalize "$work_path/.."]
132 
133  if {[IsISE]} {
134  set reps [glob -nocomplain "$run_dir/*/*{.syr,.srp,.mrp,.map,.twr,.drc,.bgn,_routed.par,_routed_pad.txt,_routed.unroutes}"]
135  } else {
136  set reps [glob -nocomplain "$run_dir/*/*.rpt"]
137  }
138  if {[file exists [lindex $reps 0]]} {
139  file copy -force {*}$reps $dst_dir/reports
140  if {[file exists [glob -nocomplain "$dst_dir/reports/${top_name}_utilization_synth.rpt"]]} {
141  set utilization_file [file normalize $dst_dir/utilization.txt]
142  set report_file [glob -nocomplain "$dst_dir/reports/${top_name}_utilization_synth.rpt"]
143  if {$group_name != ""} {
144  WriteUtilizationSummary $report_file $utilization_file $group_name/$proj_name "Synthesis"
145  } else {
146  WriteUtilizationSummary $report_file $utilization_file $proj_name "Synthesis"
147  }
148  }
149  } else {
150  Msg Warning "No reports found in $run_dir subfolders"
151  }
152 
153 
154  # Handle IPs
155  if {[IsVivado]} {
156  if {[info exists env(HOG_IP_PATH)]} {
157  set ip_repo $env(HOG_IP_PATH)
158  set ips [get_ips *]
159  set run_paths [glob -nocomplain "$run_dir/*"]
160  set runs {}
161  foreach r $run_paths {
162  if {[regexp -all {^(.+)_synth_1} $r whole_match run]} {
163  lappend runs [file tail $run]
164  }
165  }
166 
167  foreach ip $ips {
168  if {$ip in $runs} {
169  set force 1
170  } else {
171  set force 0
172  }
173  Msg Info "Copying synthesised IP $ip to $ip_repo..."
174  HandleIP push [get_property IP_FILE $ip] $ip_repo $repo_path [get_property IP_OUTPUT_DIR $ip] $force
175  }
176  }
177 
178  # Copy DCP to artifacts, if HOG_SAVE_DCP is set
179  if {[info exists env(HOG_SAVE_DCP)] && ($env(HOG_SAVE_DCP) == 1 || $env(HOG_SAVE_DCP) == 2)} {
180  set dcp_dir [file normalize "$repo_path/DCPs/$group_name/$proj_name/synth_dcp"]
181  file mkdir $dcp_dir
182  set dcps [glob -nocomplain "$run_dir/synth*/*.dcp"]
183  if {[file exists [lindex $dcps 0]]} {
184  file copy -force {*}$dcps $dcp_dir/
185  }
186  }
187  }
188 
189 
190  # Log files
191  set logs [glob -nocomplain "$run_dir/*/runme.log"]
192  foreach log $logs {
193  set run_name [file tail [file dirname $log]]
194  file copy -force $log $dst_dir/reports/$run_name.log
195  }
196 } elseif {[IsQuartus]} {
197  #Reports
198  set reps [glob -nocomplain "$proj_dir/output_files/*.rpt"]
199 
200  if {[file exists [lindex $reps 0]]} {
201  file copy -force {*}$reps $dst_dir/reports
202  } else {
203  Msg Warning "No reports found in $proj_dir/output_files subfolders"
204  }
205 } elseif {[IsDiamond]} {
206  #Logs
207  set logs [glob -nocomplain "$proj_dir/Implementation0/*.log"]
208 
209  if {[file exists [lindex $logs 0]]} {
210  file copy -force {*}$logs $dst_dir/reports
211  } else {
212  Msg Warning "No .log reports found in $proj_dir/Implementation0 subfolders"
213  }
214 
215  # Arearep
216  set areas [glob -nocomplain "$proj_dir/Implementation0/*.arearep"]
217 
218  if {[file exists [lindex $areas 0]]} {
219  file copy -force {*}$areas $dst_dir/reports
220  } else {
221  Msg Warning "No .arearep reports found in $proj_dir/Implementation0 subfolders"
222  }
223 
224  # Timing (TWR)
225  set t_reps [glob -nocomplain "$proj_dir/Implementation0/*.twr"]
226 
227  if {[file exists [lindex $t_reps 0]]} {
228  file copy -force {*}$t_reps $dst_dir/reports
229  } else {
230  Msg Warning "No .twr reports found in $proj_dir/Implementation0 subfolders"
231  }
232 }
233 
234 # Run user post-synthesis file
235 set user_post_synthesis_file "./Top/$group_name/$proj_name/post-synthesis.tcl"
236 if {[file exists $user_post_synthesis_file]} {
237  Msg Info "Sourcing user post-synthesis file $user_post_synthesis_file"
238  source $user_post_synthesis_file
239 }
240 
241 cd $old_path
242 Msg Info "All done."