30 set tcl_path [
file normalize "[
file dirname [
info script]]/.."]
31 source $tcl_path/hog.tcl
36 if {[
info exists env(HOG_TCLLIB_PATH)]} {
37 lappend auto_path $env(HOG_TCLLIB_PATH)
39 puts "ERROR: To run Hog with Microsemi Libero SoC, you need to define the HOG_TCLLIB_PATH variable."
47 set proj_dir [get_property DIRECTORY [current_project]]
48 set proj_file $proj_dir/[
file tail $proj_dir].prr
49 set work_path [get_property DIRECTORY [get_runs impl_1]]
51 set proj_file [get_property parent.project_path [current_project]]
52 set work_path $old_path
54 set proj_dir [
file normalize [
file dirname $proj_file]]
55 set proj_name [
file rootname [
file tail $proj_file]]
56 set run_dir [
file normalize "$work_path/.."]
57 set top_name [get_property top [current_fileset]]
60 set proj_name [
lindex $quartus(args) 1]
61 set proj_dir $old_path
63 set proj_dir [
file normalize "[
pwd]/.."]
64 set proj_name [
file tail $proj_dir]
65 set project $proj_name
68 set proj_file $old_path/[
file tail $old_path].xpr
69 Msg CriticalWarning "You seem to be running locally on tclsh, so this is a debug message. \
70 The project file will be set to $proj_file and was derived from the path you launched this script from: $old_path. \
71 If you want this script to work properly in debug mode, please launch it from the top folder of one project, \
72 for example Repo/Projects/fpga1/ or Repo/Top/fpga1/"
75 set group_name [
GetGroupName $proj_dir "$tcl_path/../.."]
79 set repo_path "$tcl_path/../.."
81 Msg Info "Evaluating Git sha for $proj_name..."
82 lassign [
GetRepoVersions [
file normalize ./Top/$group_name/$proj_name] $repo_path] sha
85 Msg Info "Git describe set to: $describe"
87 set ts [
clock format [
clock seconds] -format {%Y-%m-%d-%H-%M}]
89 set bin_dir [
file normalize "$repo_path/bin"]
90 set dst_dir [
file normalize "$bin_dir/$group_name/$proj_name\-$describe"]
93 Msg Info "Evaluating last git SHA in which $proj_name was modified..."
98 if {[
file exists $dst_dir/diff_presynthesis.txt]} {
99 set fp [open "$dst_dir/diff_presynthesis.txt" r]
100 set file_data [read $fp]
102 if {$file_data != ""} {
103 Msg CriticalWarning "Git working directory [
pwd] not clean, git commit hash be set to 0."
104 set commit_usr "0000000"
107 lassign [
GetRepoVersions [
file normalize ./Top/$group_name/$proj_name] $repo_path] commit version
110 lassign [
GetRepoVersions [
file normalize ./Top/$group_name/$proj_name] $repo_path] commit version
114 set maxThreads [
GetMaxThreads [
file normalize ./Top/$group_name/$proj_name]]
115 if {$maxThreads != 1} {
116 Msg CriticalWarning "Multithreading enabled. Number of threads: $maxThreads"
117 set commit_usr "0000000"
119 set commit_usr $commit
123 if {[
file exists $dst_dir/diff_list_and_conf.txt]} {
124 set fp [open "$dst_dir/diff_list_and_conf.txt" r]
125 set file_data [read $fp]
127 if {$file_data != ""} {
128 Msg CriticalWarning "List files and project properties not clean, git commit hash be set to 0."
129 set commit_usr "0000000"
134 Msg Info "The git SHA value $commit will be embedded in the binary file."
140 set props [get_property "STEPS.BITGEN.ARGS.MORE OPTIONS" [get_runs impl_1]]
142 regsub -all {\{|\}} $props "" props
143 set PART [get_property part [current_project]]
145 if {[
string first "xc5v" $PART] != -1 || [
string first "xc6v" $PART] != -1 || [
string first "xc7" $PART] != -1} {
146 set props "$props -g usr_access:0x[
format %08X 0x$commit] -g userid:0x[
format %08X 0x$commit_usr]"
148 set props "$props -g userid:0x[
format %08X 0x$commit_usr]"
150 set_property -name {steps.bitgen.args.More Options} -value $props -objects [get_runs impl_1]
152 if {[
IsVersal [get_property PART [current_design]]]} {
153 Msg Info "This design uses a Versal chip, USERID does not exist."
155 set_property BITSTREAM.CONFIG.USERID $commit [current_design]
157 set_property BITSTREAM.CONFIG.USR_ACCESS $commit_usr [current_design]
161 project_open $proj_name -current_revision
163 set_global_assignment -name USE_CHECKSUM_AS_USERCODE OFF
164 set_global_assignment -name STRATIX_JTAG_USER_CODE $commit
170 set user_post_implementation_file "./Top/$group_name/$proj_name/post-implementation.tcl"
171 if {[
file exists $user_post_implementation_file]} {
172 Msg Info "Sourcing user post_implementation file $user_post_implementation_file"
173 source $user_post_implementation_file
180 Msg Info "Evaluating Git sha for $proj_name..."
181 lassign [
GetRepoVersions [
file normalize ./Top/$group_name/$proj_name] $repo_path] sha
184 Msg Info "Git describe set to: $describe"
186 set ts [
clock format [
clock seconds] -format {%Y-%m-%d-%H-%M}]
188 set dst_dir [
file normalize "$bin_dir/$group_name/$proj_name\-$describe"]
189 Msg Info "Creating $dst_dir..."
193 set confDict [dict create]
195 if {[
file exists "$tcl_path/../../Top/$group_name/$proj_name/hog.conf"]} {
196 set confDict [
ReadConf "$tcl_path/../../Top/$group_name/$proj_name/hog.conf"]
197 set full_diff_log [
DictGet [
DictGet $confDict "hog"] "FULL_DIFF_LOG" 0]
200 Msg Info "Evaluating differences with last commit..."
201 set found_uncommitted 0
203 set diff_stat [
Git "diff --stat"]
205 set found_uncommitted 1
206 Msg Warning "Found non committed changes:"
207 if {$full_diff_log} {
210 Msg Status "$diff_stat"
212 set fp [open "$dst_dir/diff_postimplementation.txt" w+]
217 if {$found_uncommitted == 0} {
218 Msg Info "No uncommitted changes found."
222 file mkdir $dst_dir/reports
226 report_utilization -hierarchical -hierarchical_percentages -file $dst_dir/reports/hierarchical_utilization.txt
230 set reps [glob -nocomplain "$run_dir/*/*{.syr,.srp,.mrp,.map,.twr,.drc,.bgn,_routed.par,_routed_pad.txt,_routed.unroutes}"]
232 set reps [glob -nocomplain "$run_dir/*/*.rpt"]
235 if {[
file exists [
lindex $reps 0]]} {
236 file copy -force {*}$reps $dst_dir/reports
237 if {[
file exists [glob -nocomplain "$dst_dir/reports/${top_name}_utilization_placed.rpt"]]} {
238 set utilization_file [
file normalize $dst_dir/utilization.txt]
239 set report_file [glob -nocomplain "$dst_dir/reports/${top_name}_utilization_placed.rpt"]
240 if {$group_name != ""} {
247 Msg Warning "No reports found in $run_dir subfolders"
251 set logs [glob -nocomplain "$run_dir/*/runme.log"]
253 set run_name [
file tail [
file dirname $log]]
254 file copy -force $log $dst_dir/reports/$run_name.log
258 if {[
info exists env(HOG_SAVE_DCP)] && ($env(HOG_SAVE_DCP) == 1 || $env(HOG_SAVE_DCP) == 3)} {
259 set dcp_dir [
file normalize "$repo_path/DCPs/$group_name/$proj_name/impl_dcp"]
261 set dcps [glob -nocomplain "$run_dir/impl*/*.dcp"]
262 if {[
file exists [
lindex $dcps 0]]} {
263 file copy -force {*}$dcps $dcp_dir
269 set logs [glob -nocomplain "$proj_dir/Implementation0/*.log"]
271 if {[
file exists [
lindex $logs 0]]} {
272 file copy -force {*}$logs $dst_dir/reports
274 Msg Warning "No .log reports found in $proj_dir/Implementation0 subfolders"
278 set areas [glob -nocomplain "$proj_dir/Implementation0/*.arearep"]
280 if {[
file exists [
lindex $areas 0]]} {
281 file copy -force {*}$areas $dst_dir/reports
283 Msg Warning "No .arearep reports found in $proj_dir/Implementation0 subfolders"
287 set t_reps [glob -nocomplain "$proj_dir/Implementation0/*.twr"]
289 if {[
file exists [
lindex $t_reps 0]]} {
290 file copy -force {*}$t_reps $dst_dir/reports
292 Msg Warning "No .twr reports found in $proj_dir/Implementation0 subfolders"
296 set m_reps [glob -nocomplain "$proj_dir/Implementation0/*.mrp"]
298 if {[
file exists [
lindex $m_reps 0]]} {
299 file copy -force {*}$m_reps $dst_dir/reports
301 Msg Warning "No .mrp reports found in $proj_dir/Implementation0 subfolders"
305 set par_reps [glob -nocomplain "$proj_dir/Implementation0/*.par"]
307 if {[
file exists [
lindex $par_reps 0]]} {
308 file copy -force {*}$par_reps $dst_dir/reports
310 Msg Warning "No .par reports found in $proj_dir/Implementation0 subfolders"
316 set user_post_implementation_file "./Top/$group_name/$proj_name/post-implementation.tcl"
317 if {[
file exists $user_post_implementation_file]} {
318 Msg Info "Sourcing user post-implementation file $user_post_implementation_file"
319 source $user_post_implementation_file