30 namespace eval globalSettings {
43 variable LIBERO_MANDATORY_VARIABLES
48 variable HOG_EXTERNAL_PATH
50 variable TARGET_SIMULATOR
52 variable pre_synth_file
53 variable post_synth_file
54 variable pre_impl_file
55 variable post_impl_file
57 variable post_bit_file
58 variable quartus_post_module_file
66 variable synth_top_module
69 variable vitis_classic
70 variable vitis_unified
77 variable quartus_post_module
81 proc InitProject {{vitis_only 0}} {
83 if {[
file exists $globalSettings::build_dir/vitis_classic]} {
84 file delete -force $globalSettings::build_dir/vitis_classic
86 setws $globalSettings::build_dir/vitis_classic
88 if {[
file exists $globalSettings::build_dir/vitis_unified]} {
89 file delete -force $globalSettings::build_dir/vitis_unified
91 file mkdir $globalSettings::build_dir/vitis_unified
96 set_msg_config -suppress -regexp -string {".*The IP file '.*' has been moved from its original location, as a result the outputs for this IP will now be generated in '.*'. Alternatively a copy of the IP can be imported into the project using one of the 'import_ip' or 'import_files' commands..*"}
97 set_msg_config -suppress -regexp -string {".*File '.*.xci' referenced by design '.*' could not be found..*"}
100 set_msg_config -suppress -id {IP_Flow 19-3664}
103 set_msg_config -suppress -id {Vivado 12-23660} -string {{ERROR: [Vivado 12-23660] Simulation is not supported for the target language VHDL when design contains NoC (Network-on-Chip) blocks} }
106 create_project -force [
file tail $globalSettings::DESIGN] $globalSettings::build_dir -part $globalSettings::PART
107 file mkdir "$globalSettings::build_dir/[
file tail $globalSettings::DESIGN].gen/sources_1"
108 if {[
IsVersal $globalSettings::PART]} {
109 Msg Info "This project uses a Versal device."
113 set obj [get_projects [
file tail $globalSettings::DESIGN]]
114 set_property "target_language" "VHDL" $obj
117 set_property "simulator_language" "Mixed" $obj
119 set_property "compxlib.${simulator}_compiled_library_dir" $globalSettings::simlib_path $obj
121 set_property "default_lib" "xil_defaultlib" $obj
123 set_param project.enableVHDL2008 1
124 set_property "enable_vhdl_2008" 1 $obj
126 set_property source_mgmt_mode All [current_project]
128 Msg Debug "Setting PART = $globalSettings::PART"
129 set_property PART $globalSettings::PART [current_project]
134 package require ::quartus::project
136 if {[
string equal $globalSettings::FAMILY "quartus_only"]} {
137 Msg Error "You must specify a device Family for Quartus"
139 file mkdir $globalSettings::build_dir
140 cd $globalSettings::build_dir
141 if {[is_project_open]} {
145 file delete {*}[glob -nocomplain $globalSettings::DESIGN.q*]
147 project_new -family $globalSettings::FAMILY -overwrite -part $globalSettings::PART $globalSettings::DESIGN
148 set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
153 if {[
file exists $globalSettings::build_dir]} {
154 file delete -force $globalSettings::build_dir
156 new_project -location $globalSettings::build_dir \
157 -name [
file tail $globalSettings::DESIGN] \
158 -die $globalSettings::DIE \
159 -package $globalSettings::PACKAGE \
160 -family $globalSettings::FAMILY \
163 if {[
file exists $globalSettings::build_dir]} {
164 file delete -force $globalSettings::build_dir
167 file mkdir $globalSettings::build_dir
168 cd $globalSettings::build_dir
169 prj_project new -name [
file tail $globalSettings::DESIGN] -dev $globalSettings::DEVICE -synthesis $globalSettings::SYNTHESIS_TOOL
173 puts "Creating project for $globalSettings::DESIGN part $globalSettings::PART"
174 puts "Configuring project settings:"
175 puts " - simulator_language: Mixed"
176 puts " - target_language: VHDL"
177 puts " - simulator: QuestaSim"
178 puts "Adding IP directory \"$globalSettings::user_ip_repo\" to the project "
182 proc AddProjectFiles {} {
186 if {[
string equal [get_filesets -quiet sources_1] ""]} {
187 create_fileset -srcset sources_1
189 set sources "sources_1"
201 if {[
string equal [get_filesets -quiet constrs_1] ""]} {
202 create_fileset -constrset constrs_1
206 set constraints [get_filesets constrs_1]
213 if {[
file isdirectory $globalSettings::list_path]} {
214 set list_files [glob -directory $globalSettings::list_path "*"]
216 Msg Error "No list directory found at $globalSettings::list_path"
220 source $globalSettings::tcl_path/utils/cmdline.tcl
224 AddHogFiles {*}[
GetHogFiles -list_files {.src,.sim,.ext} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
230 AddHogFiles {*}[
GetHogFiles -list_files {.con} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
244 proc CreateReportStrategy {obj} {
249 if {[
string equal [get_property -quiet report_strategy $obj] ""]} {
251 Msg Info "No report strategy needed for implementation"
254 set_property set_report_strategy_name 1 $obj
255 set_property report_strategy {Vivado Implementation Default Reports} $obj
256 set_property set_report_strategy_name 0 $obj
258 set reports [get_report_configs -of_objects $obj]
260 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0] ""]} {
261 create_report_config -report_name impl_1_place_report_utilization_0 -report_type report_utilization:1.0 -steps place_design -runs impl_1
263 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0]
269 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0] ""]} {
270 create_report_config -report_name impl_1_route_report_drc_0 -report_type report_drc:1.0 -steps route_design -runs impl_1
272 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0]
278 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0] ""]} {
279 create_report_config -report_name impl_1_route_report_power_0 -report_type report_power:1.0 -steps route_design -runs impl_1
281 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0]
287 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary] ""]} {
288 create_report_config -report_name impl_1_route_report_timing_summary -report_type report_timing_summary:1.0 -steps route_design -runs impl_1
290 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary]
292 Msg Info "Report timing created successfully"
296 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_utilization] ""]} {
297 create_report_config -report_name impl_1_route_report_utilization -report_type report_utilization:1.0 -steps route_design -runs impl_1
299 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_utilization]
301 Msg Info "Report utilization created successfully"
306 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0] ""]} {
307 create_report_config -report_name impl_1_post_route_phys_opt_report_timing_summary_0 \
308 -report_type report_timing_summary:1.0 \
309 -steps post_route_phys_opt_design -runs impl_1
311 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0]
313 set_property -name "options.max_paths" -value "10" -objects $obj
314 set_property -name "options.warn_on_violation" -value "1" -objects $obj
318 Msg Info "Won't create any report strategy, not in Vivado"
328 proc ConfigureSynthesis {} {
332 if {[
string equal [get_runs -quiet synth_1] ""]} {
333 create_run -name synth_1 -part $globalSettings::PART -constrset constrs_1
338 set obj [get_runs synth_1]
339 set_property "part" $globalSettings::PART $obj
343 if {$globalSettings::pre_synth_file ne ""} {
347 if {[get_filesets -quiet utils_1] != ""} {
348 AddFile $globalSettings::pre_synth [get_filesets -quiet utils_1]
350 set_property STEPS.SYNTH_DESIGN.TCL.PRE $globalSettings::pre_synth $obj
354 set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:$globalSettings::pre_synth
356 configure_tool -name {SYNTHESIZE} -params SYNPLIFY_TCL_FILE:$globalSettings::pre_synth
358 prj_impl pre_script "syn" $globalSettings::pre_synth
361 Msg Debug "Setting $globalSettings::pre_synth to be run before synthesis"
365 if {$globalSettings::post_synth_file ne ""} {
369 if {[get_filesets -quiet utils_1] != ""} {
370 AddFile $globalSettings::post_synth [get_filesets -quiet utils_1]
372 set_property STEPS.SYNTH_DESIGN.TCL.POST $globalSettings::post_synth $obj
376 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
378 prj_impl post_script "syn" $globalSettings::post_synth
380 Msg Debug "Setting $globalSettings::post_synth to be run after synthesis"
387 current_run -synthesis $obj
390 if {[
string equal [get_property -quiet report_strategy $obj] ""]} {
392 Msg Debug "No report strategy needed for synthesis"
395 set_property set_report_strategy_name 1 $obj
396 set_property report_strategy {Vivado Synthesis Default Reports} $obj
397 set_property set_report_strategy_name 0 $obj
399 if {[
string equal [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0] ""]} {
400 create_report_config -report_name synth_1_synth_report_utilization_0 -report_type report_utilization:1.0 -steps synth_design -runs synth_1
402 set reports [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0]
412 Msg info "Reporting strategy for synthesis"
421 proc ConfigureImplementation {} {
425 if {[
string equal [get_runs -quiet impl_1] ""]} {
426 create_run -name impl_1 -part $globalSettings::PART -constrset constrs_1 -parent_run synth_1
429 set obj [get_runs impl_1]
430 set_property "part" $globalSettings::PART $obj
432 set_property "steps.[
BinaryStepName $globalSettings::PART].args.readback_file" "0" $obj
433 set_property "steps.[
BinaryStepName $globalSettings::PART].args.verbose" "0" $obj
441 if {$globalSettings::pre_impl_file ne ""} {
445 if {[get_filesets -quiet utils_1] != ""} {
446 AddFile $globalSettings::pre_impl [get_filesets -quiet utils_1]
448 set_property STEPS.INIT_DESIGN.TCL.POST $globalSettings::pre_impl $obj
454 prj_impl pre_script "par" $globalSettings::pre_impl
456 Msg Debug "Setting $globalSettings::pre_impl to be run after implementation"
461 if {$globalSettings::post_impl_file ne ""} {
465 if {[get_filesets -quiet utils_1] != ""} {
466 AddFile $globalSettings::post_impl [get_filesets -quiet utils_1]
468 set_property STEPS.ROUTE_DESIGN.TCL.POST $globalSettings::post_impl $obj
470 if {[get_property STEPS.POST_ROUTE_PHYS_OPT_DESIGN.IS_ENABLED $obj]} {
471 set_property STEPS.POST_ROUTE_PHYS_OPT_DESIGN.TCL.POST $globalSettings::post_impl $obj
472 set_property STEPS.ROUTE_DESIGN.TCL.POST "" $obj
477 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
479 prj_impl post_script "par" $globalSettings::post_impl
481 Msg Debug "Setting $globalSettings::post_impl to be run after implementation"
485 if {$globalSettings::pre_bit_file ne ""} {
489 if {[get_filesets -quiet utils_1] != ""} {
490 AddFile $globalSettings::pre_bit [get_filesets -quiet utils_1]
492 set_property STEPS.[
BinaryStepName $globalSettings::PART].TCL.PRE $globalSettings::pre_bit $obj
498 prj_impl pre_script "export" $globalSettings::pre_bit
500 Msg Debug "Setting $globalSettings::pre_bit to be run after bitfile generation"
504 if {$globalSettings::post_bit_file ne ""} {
508 if {[get_filesets -quiet utils_1] != ""} {
509 AddFile $globalSettings::post_bit [get_filesets -quiet utils_1]
511 set_property STEPS.[
BinaryStepName $globalSettings::PART].TCL.POST $globalSettings::post_bit $obj
515 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
517 prj_impl post_script "export" $globalSettings::post_bit
519 Msg Debug "Setting $globalSettings::post_bit to be run after bitfile generation"
528 proc ConfigureSimulation {} {
529 set simsets_dict [
GetSimSets "$globalSettings::group_name/$globalSettings::DESIGN" $globalSettings::repo_path]
535 Msg Debug "Setting load_glbl parameter to true for every fileset..."
536 foreach simset [get_filesets -quiet] {
537 if {[get_property FILESET_TYPE $simset] != "SimulationSrcs"} {
541 set_property -name {xsim.elaborate.load_glbl} -value {true} -objects [get_filesets $simset]
544 set sim_dict [
DictGet $simsets_dict $simset]
545 set sim_props [
DictGet $sim_dict "properties"]
547 if {$sim_props != ""} {
548 Msg Info "Setting properties for simulation set: $simset..."
549 dict for {prop_name prop_val} $sim_props {
550 set prop_name [string toupper $prop_name]
551 if {$prop_name == "ACTIVE" && $prop_val == 1} {
552 Msg Info "Setting $simset as active simulation set..."
553 current_fileset -simset [get_filesets $simset]
555 Msg Debug "Setting $prop_name = $prop_val"
556 if {[IsInList [string toupper $prop_name] [VIVADO_PATH_PROPERTIES] 1]} {
557 # Check that the file exists before setting these properties
558 if {[file exists $globalSettings::repo_path/$prop_val]} {
559 set_property -name $prop_name -value $globalSettings::repo_path/$prop_val -objects [get_filesets $simset]
561 Msg Warning "Impossible to set property $prop_name to $prop_val. File is missing"
564 set_property -name $prop_name -value $prop_val -objects [get_filesets $simset]
575 proc ConfigureProperties {} {
577 cd $globalSettings::repo_path
581 if {[
info exists globalSettings::PROPERTIES]} {
582 if {[dict exists $globalSettings::PROPERTIES main]} {
583 Msg Info "Setting project-wide properties..."
584 set proj_props [dict get $globalSettings::PROPERTIES main]
585 dict for {prop_name prop_val} $proj_props {
586 if {[string tolower $prop_name] != "ip_repo_paths"} {
587 if {[string tolower $prop_name] != "part"} {
588 # Part is already set
589 Msg Debug "Setting $prop_name = $prop_val"
590 set_property -name $prop_name -value $prop_val -objects [current_project]
593 set ip_repo_list [regsub -all {\s+} $prop_val " $globalSettings::repo_path/"]
594 set ip_repo_list $globalSettings::repo_path/$ip_repo_list
596 Msg Info "Setting $ip_repo_list as user IP repository..."
598 set_property ip_repo_paths "$ip_repo_list" [current_fileset]
600 set_property ip_repo_paths "$ip_repo_list" [current_project]
607 foreach run [get_runs -quiet] {
608 if {[dict exists $globalSettings::PROPERTIES $run]} {
609 Msg Info "Setting properties for run: $run..."
610 set run_props [dict get $globalSettings::PROPERTIES $run]
612 set stragety_str "STRATEGY strategy Strategy"
613 Msg Debug "Setting Strategy and Flow for run $run (if specified in hog.conf)"
614 foreach s $stragety_str {
615 if {[dict exists $run_props $s]} {
616 set prop [dict get $run_props $s]
617 set_property -name $s -value $prop -objects $run
618 set run_props [dict remove $run_props $s]
619 Msg Warning "A strategy for run $run has been defined inside hog.conf. This prevents Hog to compare the project properties. \
620 Please regenerate your hog.conf file using the dedicated Hog button."
621 Msg Info "Setting $s = $prop"
625 dict for {prop_name prop_val} $run_props {
626 Msg Debug "Setting $prop_name = $prop_val"
627 if {[string trim $prop_val] == ""} {
628 Msg Warning "Property $prop_name has empty value. Skipping..."
631 if {[IsInList [string toupper $prop_name] [VIVADO_PATH_PROPERTIES] 1]} {
632 # Check that the file exists before setting these properties
633 set utility_file $globalSettings::repo_path/$prop_val
634 if {[file exists $utility_file]} {
635 lassign [GetHogFiles -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path] lib prop dummy
638 lappend hog_files $ff
641 if {[lsearch $hog_files $utility_file] < 0} {
642 Msg CriticalWarning "The file: $utility_file is set as a property in hog.conf, \
643 but is not added to the project in any list file. Hog cannot track it."
645 #Add file tu utils_1 to avoid warning
646 AddFile $globalSettings::repo_path/$prop_val [get_filesets -quiet utils_1]
648 set_property -name $prop_name -value $utility_file -objects $run
650 Msg Warning "Impossible to set property $prop_name to $prop_val. File is missing"
653 set_property -name $prop_name -value $prop_val -objects $run
664 if {[
info exists globalSettings::PROPERTIES]} {
666 if {[dict exists $globalSettings::PROPERTIES main]} {
667 Msg Info "Setting device properties..."
668 set dev_props [dict get $globalSettings::PROPERTIES main]
669 dict for {prop_name prop_val} $dev_props {
670 if {!([string toupper $prop_name] in $globalSettings::LIBERO_MANDATORY_VARIABLES)} {
671 Msg Debug "Setting $prop_name = $prop_val"
672 set_device -[string tolower $prop_name] $prop_val
677 if {[dict exists $globalSettings::PROPERTIES project]} {
678 Msg Info "Setting project-wide properties..."
679 set dev_props [dict get $globalSettings::PROPERTIES project]
680 dict for {prop_name prop_val} $dev_props {
681 Msg Debug "Setting $prop_name = $prop_val"
682 project_settings -[string tolower $prop_name] $prop_val
686 if {[dict exists $globalSettings::PROPERTIES synth]} {
687 Msg Info "Setting Synthesis properties..."
688 set synth_props [dict get $globalSettings::PROPERTIES synth]
689 dict for {prop_name prop_val} $synth_props {
690 Msg Debug "Setting $prop_name = $prop_val"
691 configure_tool -name {SYNTHESIZE} -params "[string toupper $prop_name]:$prop_val"
695 if {[dict exists $globalSettings::PROPERTIES impl]} {
696 Msg Info "Setting Implementation properties..."
697 set impl_props [dict get $globalSettings::PROPERTIES impl]
698 dict for {prop_name prop_val} $impl_props {
699 Msg Debug "Setting $prop_name = $prop_val"
700 configure_tool -name {PLACEROUTE} -params "[string toupper $prop_name]:$prop_val"
705 if {[dict exists $globalSettings::PROPERTIES bitstream]} {
706 Msg Info "Setting Bitstream properties..."
707 set impl_props [dict get $globalSettings::PROPERTIES impl]
708 dict for {prop_name prop_val} $impl_props {
709 Msg Debug "Setting $prop_name = $prop_val"
710 configure_tool -name {GENERATEPROGRAMMINGFILE} -params "[string toupper $prop_name]:$prop_val"
714 configure_tool -name {VERIFYTIMING} -params {FORMAT:TEXT}
717 if {[
info exists globalSettings::PROPERTIES]} {
719 if {[dict exists $globalSettings::PROPERTIES main]} {
720 Msg Info "Setting project-wide properties..."
721 set dev_props [dict get $globalSettings::PROPERTIES main]
722 dict for {prop_name prop_val} $dev_props {
723 # Device is already set
724 if {[string toupper $prop_name] != "DEVICE"} {
725 Msg Debug "Setting $prop_name = $prop_val"
726 prj_project option $prop_name $prop_val
731 if {[dict exists $globalSettings::PROPERTIES impl]} {
732 Msg Info "Setting Implementation properties..."
733 set dev_props [dict get $globalSettings::PROPERTIES impl]
734 dict for {prop_name prop_val} $dev_props {
735 # Device is already set
736 Msg Debug "Setting $prop_name = $prop_val"
737 prj_impl option $prop_name $prop_val
742 Msg info "Configuring Properties"
748 proc ConfigurePlatforms {{xsa ""}} {
749 dict for {key value} [dict filter $globalSettings::PROPERTIES key {platform:*}] {
750 set value_lower [dict create]
751 dict for {vkey vvalue} $value {
752 dict set value_lower [string tolower $vkey] $vvalue
754 dict set platforms $key $value_lower
760 dict for {key value} $platforms2 {
761 Msg Info "Key: $key, Value: $value"
764 if {[dict size $platforms] == 0} {
765 Msg Info "No platforms found in the configuration file"
769 dict for {platform_key platform_config} $platforms {
770 Msg Info "Found platform with key: $platform_key with configuration: $platform_config"
771 if {[regexp {^platform:(.+)$} $platform_key -> platform_name]} {
772 set platform_name [string trim $platform_name]
773 Msg Info "Configuring platform: $platform_name"
774 CreatePlatform $platform_name $platform_config $xsa
776 Msg Warning "Invalid platform key format: $platform_key. Expected format: platform:<name>"
781 proc CreatePlatform {platform_name platform_conf {xsa ""}} {
783 set platform_create_options {
784 "desc" "hw" "out" "prebuilt" "proc" "arch"
785 "samples" "os" "xpfm" "no-boot-bsp"
789 set platform_create_flags {
790 "no-boot-bsp" "prebuilt"
793 Msg Info "Creating platform configuration..."
794 append platform_options " -name $platform_name"
797 if {[
catch {
set ws_platforms [platform list -dict]}]} {
set ws_platforms ""}
798 if {[lsearch -exact $ws_platforms $platform_name] != -1} {
799 Msg Info "Platform $platform_name already exists, removing it..."
800 platform remove $platform_name
803 dict for {p v} $platform_conf {
804 if {[IsInList [string toupper $p] [VITIS_PATH_PROPERTIES] 1]} {
806 if {[IsRelativePath $v] == 1} {
807 set v "$globalSettings::repo_path/$v"
810 if {[file exists $v]} {
815 Msg Warning "Impossible to set property $p to $v. File is missing"
820 set p_lower [string tolower $p]
821 if {[IsInList $p_lower $platform_create_options]} {
822 if {[IsVitisClassic] && [IsInList $p_lower $platform_create_flags]} {
823 if {[string is true -strict $v]} {
824 append platform_options " -$p_lower"
827 append platform_options " -$p_lower $v"
830 if {$p_lower ne "bif"} {
831 Msg Warning "Attempting to use unknown platform option: $p_lower"
832 append platform_options " -$p_lower $v"
841 set xsa [
file normalize "$globalSettings::repo_path/$xsa"]
843 set xsa [
file normalize $xsa]
845 set platform_options "$platform_options -hw $xsa"
846 }
elseif {![dict exists $platform_conf hw]} {
847 set xsa [
file normalize "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"]
848 set platform_options "$platform_options -hw $xsa"
850 set platform_options "$platform_options"
855 Msg Info "Opening hardware design to check if proc to cell mapping needs to be extracted for soft processors..."
857 hsi::open_hw_design $xsa
858 set proc_cells [hsi::get_cells -filter { IP_TYPE == "PROCESSOR" }]
859 set proc_map_path [
file normalize "$globalSettings::build_dir/vitis_classic/$platform_name.PROC_MAP"]
860 set proc_map_file [open $proc_map_path "w"]
862 foreach proc $proc_cells {
864 Msg Debug "Processor found in xsa: $proc"
865 if {[regexp -nocase {microblaze|risc} $proc]} {
866 Msg Info "Extracting processor cells for soft processor: $proc"
867 set proc_hier_name [hsi::get_property HIER_NAME $proc]
868 set proc_address_tag [hsi::get_property ADDRESS_TAG $proc]
872 set proc_updatemem_path $proc_hier_name
873 if {$proc_address_tag ne ""} {
874 if {[
string match "*:*" $proc_address_tag]} {
875 set proc_updatemem_path [
lindex [
split $proc_address_tag ":"] end]
877 set proc_updatemem_path $proc_address_tag
880 Msg Warning "Processor $proc ($proc_hier_name) does not have an ADDRESS_TAG property set. Using HIER_NAME for updatemem."
882 if {$proc_updatemem_path eq ""} {
883 set proc_updatemem_path $proc
887 puts $proc_map_file "$proc $proc_updatemem_path"
888 if {$proc_hier_name ne "" && $proc_hier_name ne $proc} {
889 puts $proc_map_file "$proc_hier_name $proc_updatemem_path"
894 hsi::close_hw_design [hsi::current_hw_design]
896 Msg Info "Wrote soft-processor map to $proc_map_path"
900 Msg Info "Creating platform \[$platform_name\] with options: \{$platform_options\}"
902 set plat_create "platform create $platform_options"
904 platform active $platform_name
908 set python_script "$globalSettings::repo_path/Hog/Other/Python/VitisUnified/PlatformCommands.py"
909 Msg Info "Running Vitis Unified platform creation script..."
912 set ::env(HOG_VITIS_PLATFORM_OPTIONS) "{ $platform_options }"
913 set error_msg "Failed to create platform $platform_name"
915 [list "$globalSettings::build_dir/vitis_unified"] \
923 proc ConfigureApps {} {
924 set apps [dict filter $globalSettings::PROPERTIES key {app:*}]
926 if {[dict size $apps] == 0} {
927 Msg Info "No apps found in the configuration file"
931 dict for {app_key app_config} $apps {
932 Msg Info "Found app with key: $app_key with configuration: $app_config"
933 if {[regexp {^app:(.+)$} $app_key -> app_name]} {
934 set app_name [string trim $app_name]
935 Msg Info "Configuring app: $app_name"
936 if {[IsVitisClassic]} {
937 ConfigureApp $app_name $app_config
938 } elseif {[IsVitisUnified]} {
939 set python_script "$globalSettings::repo_path/Hog/Other/Python/VitisUnified/AppCommands.py"
940 Msg Info "Running Vitis Unified app configuration script..."
941 # Build app config string from app_config dict
942 set app_config_str "{"
943 dict for {p v} $app_config {
944 append app_config_str " -[string toupper $p] \{$v\}"
946 append app_config_str " }"
947 # The options contain spaces: pass them in the environment, as a command line
948 # argument they would be split by the Windows shell that runs vitis.bat
949 set ::env(HOG_VITIS_APP_OPTIONS) $app_config_str
950 set error_msg "Failed to configure app $app_name"
951 if {![ExecuteVitisUnifiedCommand $python_script "configure_app" \
952 [list $app_name "$globalSettings::build_dir/vitis_unified"] \
958 Msg Warning "Invalid app key format: $app_key. Expected format: app:<name>"
963 proc ConfigureApp {app_name app_conf} {
966 "platform" "domain" "sysproj" "hw"
967 "proc" "template" "os" "lang" "arch" "name"
971 "assembler-flags" "build-config" "compiler-misc" "compiler-optimization"
972 "define-compiler-symbols" "include-path" "libraries" "library-search-path"
973 "linker-misc" "linker-script" "undef-compiler-symbols"
976 Msg Info "Configuring app..."
977 append app_options " -name $app_name"
980 if {[
catch {
set sys_projs [sysproj list -dict]}]} {
set sys_projs ""}
981 if {[dict exists $app_name sysproj]} {
982 set sys_proj_name [dict get $app_name sysproj]
983 if {[lsearch -exact $sys_projs "Name $sys_proj_name"] != -1} {
984 Msg Info "Removing $sys_proj_name..."
985 sysproj remove $sys_proj_name
988 set sys_proj_name "$app_name\_system"
989 if {[lsearch -exact $sys_projs "Name $sys_proj_name"] != -1} {
990 Msg Info "Removing $sys_proj_name..."
991 sysproj remove $sys_proj_name
996 if {[
catch {
set ws_apps [app list -dict]}]} {
set ws_apps ""}
997 if {[lsearch -exact $ws_apps $app_name] != -1} {
998 Msg Info "app $app_name already exists, removing it..."
1002 set app_create_options [dict create]
1003 set app_conf_options [dict create]
1006 dict for {p v} $app_conf {
1007 set p_lower [string tolower $p]
1009 if {[IsInList [string toupper $p] [VITIS_PATH_PROPERTIES] 1]} {
1010 if {[IsRelativePath $v] == 1} {
1011 set v "$globalSettings::repo_path/$v"
1014 if {![file exists $v]} {
1015 Msg Warning "Impossible to set property $p to $v. File is missing"
1020 if {[IsInList $p_lower $create_options]} {
1021 Msg Info "$p_lower is in create options"
1022 dict append app_create_options $p_lower $v
1023 } elseif {[IsInList $p_lower $conf_options]} {
1024 Msg Info "$p_lower is in conf options"
1025 dict append app_conf_options $p_lower $v
1027 Msg Warning "Unknown app option: $p_lower"
1032 dict for {p v} $app_create_options {
1033 if {[string equal $p "platform"]} {
1034 Msg Info "Setting App $app_name platform to $v"
1037 append app_options " -$p $v"
1040 if {![dict exists $app_name template]} {
1043 if {[dict exists $app_create_options "lang"]} {
1044 set lang [dict get $app_create_options "lang"]
1045 if {[
string equal -nocase $lang "C++"] || [
string equal -nocase $lang "cpp"]} {
1046 append app_options " -template \{Empty Application (C++)\}"
1048 append app_options " -template \{Empty Application(C)\}"
1052 append app_options " -template \{Empty Application(C)\}"
1056 append app_options " -template \{Empty Application\}"
1060 Msg Info "Creating application \[$app_name\] with options: \{$app_options\}"
1061 set app_create "app create $app_options"
1063 app config -name $app_name -set build-config Release
1066 dict for {p v} $app_conf_options {
1067 Msg Info "Configuring app option $p to $v"
1068 app config -name $app_name -set $p $v
1073 proc AddAppFiles {} {
1074 AddHogFiles {*}[
GetHogFiles -list_files {.src,.header} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
1092 proc ConfigureVitisComponents {xsa_option ide post_file} {
1095 set vitis_ws [
file normalize "$globalSettings::build_dir/vitis_unified"]
1096 if {[
file exists $vitis_ws]} {
1097 Msg Info "Removing existing Vitis Unified workspace $vitis_ws..."
1098 file delete -force $vitis_ws
1100 file mkdir $vitis_ws
1103 set has_hls [
expr {[dict size [dict filter $globalSettings::PROPERTIES key {hls:*}]] > 0}]
1104 set has_platforms [
expr {[dict size [dict filter $globalSettings::PROPERTIES key {platform:*}]] > 0}]
1105 set has_apps [
expr {[dict size [dict filter $globalSettings::PROPERTIES key {app:*}]] > 0}]
1108 Msg Info "Found HLS component(s) in configuration, configuring HLS..."
1112 if {!$has_platforms && !$has_apps} {
1113 Msg Info "vitis unified HLS-only project, skipping Vivado project setup."
1117 set xsa_path $xsa_option
1119 if {$xsa_path == ""} {
1120 if {[
string match "vivado_*" [
string tolower $ide]]} {
1122 set xpr_file [
file normalize "$globalSettings::build_dir/[
file tail $globalSettings::DESIGN].xpr"]
1123 if {[
file exists $xpr_file]} {
1124 Msg Info "Opening existing Vivado project to generate pre-synth XSA..."
1125 open_project $xpr_file
1126 set xsa_path [
file normalize "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"]
1128 write_hw_platform -fixed -force -file $xsa_path
1129 Msg Info "Pre-synth XSA generated: $xsa_path"
1133 Msg Error "Vivado project not found at $xpr_file. Please run CREATE without -vitis_only first to create the Vivado project or provide an XSA file via the -xsa option."
1138 Msg Error "This is a $ide only project with platform/app sections, an XSA file must be provided via the -xsa option."
1143 set xsa_path [
file normalize "$globalSettings::repo_path/$xsa_path"]
1145 set xsa_path [
file normalize $xsa_path]
1148 Msg Info "Configuring platforms with XSA: $xsa_path"
1153 if {[
file exists $post_file]} {
1154 if {[
string match "vivado_*" [
string tolower $ide]]} {
1155 Msg Info "Skipping post-creation.tcl in -vitis_only pass for $ide \
1156 (already executed during Vivado project creation)."
1158 Msg Info "Found post-creation Tcl script $post_file, executing it..."
1176 proc ConfigureHlsComponents {} {
1177 set hls_components [dict filter $globalSettings::PROPERTIES key {hls:*}]
1179 if {[dict size $hls_components] == 0} {
1180 Msg Info "No HLS components found in the configuration file"
1184 set python_script "$globalSettings::repo_path/Hog/Other/Python/VitisUnified/HlsCommands.py"
1185 set ws_dir [
file normalize "$globalSettings::build_dir/vitis_unified"]
1187 dict for {hls_key hls_config} $hls_components {
1188 if {[regexp {^hls:(.+)$} $hls_key -> component_name]} {
1189 set component_name [string trim $component_name]
1190 Msg Info "Configuring HLS component: $component_name"
1192 # Get HLS_CONFIG path from hog.conf (mandatory)
1194 if {[dict exists $hls_config hls_config]} {
1195 set hls_cfg_rel [dict get $hls_config hls_config]
1196 } elseif {[dict exists $hls_config HLS_CONFIG]} {
1197 set hls_cfg_rel [dict get $hls_config HLS_CONFIG]
1199 if {$hls_cfg_rel eq ""} {
1200 Msg Error "HLS component '$component_name' missing HLS_CONFIG in hog.conf \[hls:$component_name\] section"
1204 set hls_cfg_file [file normalize "$globalSettings::repo_path/$hls_cfg_rel"]
1205 if {![file exists $hls_cfg_file]} {
1206 Msg Error "HLS config file not found: $hls_cfg_file (from HLS_CONFIG=$hls_cfg_rel)"
1210 Msg Info " HLS config: $hls_cfg_file"
1212 # Validate the config file
1213 set error_msg "Failed to validate HLS config for $component_name"
1214 if {![ExecuteVitisUnifiedCommand $python_script "validate" \
1215 [list $hls_cfg_file] \
1217 Msg Error $error_msg
1221 # Create Vitis workspace with HLS component for GUI compatibility
1222 set hls_work_dir [file normalize "$ws_dir/hls_$component_name"]
1223 Msg Info "Creating Vitis HLS workspace component '$component_name' in $ws_dir ..."
1224 if {![ExecuteVitisUnifiedCommand $python_script "create_workspace" \
1225 [list $ws_dir $component_name $hls_cfg_file $hls_work_dir] \
1226 "Failed to create HLS workspace for $component_name"]} {
1227 Msg Warning "Could not create Vitis workspace for HLS component '$component_name'"
1230 Msg Info "HLS component '$component_name' configured successfully"
1232 Msg Warning "Invalid HLS key format: $hls_key. Expected format: hls:<name>"
1241 current_run -implementation [get_runs impl_1]
1248 Msg Info "Running report_ip_status, before upgrading and handling IPs..."
1251 if {$globalSettings::HOG_IP_PATH != ""} {
1252 set ip_repo_path $globalSettings::HOG_IP_PATH
1253 Msg Info "HOG_IP_PATH is set, will pull/push synthesised IPs from/to $ip_repo_path."
1255 lassign [
CheckRemoteIpPath $globalSettings::repo_path $ip_repo_path] system_ready on_eos on_rclone rclone_config_path
1256 if {$system_ready == 1} {
1258 HandleIP pull [get_property IP_FILE $ip] $ip_repo_path $globalSettings::repo_path [get_property IP_OUTPUT_DIR $ip]\
1259 $on_eos $on_rclone $rclone_config_path
1263 Msg Info "HOG_IP_PATH not set, will not push/pull synthesised IPs."
1268 proc UpgradeIPs {} {
1271 foreach ip [get_ips] {
1272 set locked [get_property -quiet IS_LOCKED $ip]
1273 set upgrade_versions [get_property -quiet UPGRADE_VERSIONS $ip]
1274 if {$locked && $upgrade_versions ne ""} {
1275 Msg Info "Upgrading IP $ip..."
1281 if {$upgraded == 0} {
1282 Msg Info "No locked IPs with available upgrades found."
1284 Msg Info "Upgraded $upgraded IP(s)."
1288 proc SetGlobalVar {var {default_value HOG_NONE}} {
1290 if {[
info exists ::$var]} {
1291 Msg Debug "Setting $var to [subst $[subst ::$var]]"
1293 set globalSettings::$var [subst $[subst ::$var]]
1294 }
elseif {$default_value == "HOG_NONE"} {
1295 Msg Error "Mandatory variable $var was not defined. Please define it in hog.conf or in project tcl script."
1297 Msg Info "Setting $var to default value: \"$default_value\""
1299 set globalSettings::$var $default_value
1303 proc CreateProject {args} {
1308 if {[
catch {
package require cmdline} ERROR]} {
1309 puts "ERROR: If you are running this script on tclsh, you can fix this by installing 'tcllib'"
1313 {simlib_path.arg "" "Path of simulation libs"}
1314 {verbose "If set, launch the script in verbose mode."}
1315 {xsa.arg "" "xsa for creating platforms without a defined hw."}
1316 {vivado_only "If set, and project is vivado-vitis, vitis project will not be created."}
1317 {vitis_only "If set, and project is vivado-vitis, only vitis project will be created."}
1320 set usage "Create Vivado/Vitis/ISE/Quartus/Libero/Diamond project.\nUsage: CreateProject \[OPTIONS\] <project> <repository path>\n Options:"
1322 if {[
catch {
array set options [
cmdline::getoptions args $parameters $usage]}] || [
llength $args] < 2 || [
lindex $args 0] eq ""} {
1327 set globalSettings::DESIGN [
lindex $args 0]
1328 if {[
file exists [
lindex $args 1]]} {
1329 set globalSettings::repo_path [
file normalize [
lindex $args 1]]
1331 Msg Error "The second argument, [
lindex $args 1], should be the repository path."
1333 set globalSettings::tcl_path $globalSettings::repo_path/Hog/Tcl
1336 if {$options(verbose) == 1} {
1337 variable ::DEBUG_MODE 1
1341 if {$options(simlib_path) != ""} {
1343 set globalSettings::simlib_path "$options(simlib_path)"
1345 set globalSettings::simlib_path "${globalSettings::repo_path}/$options(simlib_path)"
1347 Msg Info "Simulation library path set to $options(simlib_path)"
1349 set globalSettings::simlib_path "${globalSettings::repo_path}/SimulationLib"
1350 Msg Info "Simulation library path set to default ${globalSettings::repo_path}/SimulationLib"
1356 set build_dir_name "Projects"
1357 set globalSettings::group_name [
file dirname ${globalSettings::DESIGN}]
1358 set globalSettings::project_name ${globalSettings::DESIGN}
1359 set globalSettings::pre_synth_file "pre-synthesis.tcl"
1360 set globalSettings::post_synth_file "post-synthesis.tcl"
1361 set globalSettings::pre_impl_file "pre-implementation.tcl"
1362 set globalSettings::post_impl_file "post-implementation.tcl"
1363 set globalSettings::pre_bit_file "pre-bitstream.tcl"
1364 set globalSettings::post_bit_file "post-bitstream.tcl"
1365 set globalSettings::quartus_post_module_file "quartus-post-module.tcl"
1366 set globalSettings::top_path "${globalSettings::repo_path}/Top/${globalSettings::DESIGN}"
1367 set globalSettings::list_path "${globalSettings::top_path}/list"
1368 set globalSettings::build_dir "${globalSettings::repo_path}/${build_dir_name}/${globalSettings::DESIGN}"
1369 set globalSettings::DESIGN [
file tail ${globalSettings::DESIGN}]
1370 set globalSettings::top_name [
file tail ${globalSettings::DESIGN}]
1371 set globalSettings::top_name [
file rootname ${globalSettings::top_name}]
1372 set globalSettings::synth_top_module "top_${globalSettings::top_name}"
1373 set globalSettings::user_ip_repo ""
1375 set globalSettings::pre_synth [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::pre_synth_file}"]
1376 set globalSettings::post_synth [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::post_synth_file}"]
1377 set globalSettings::pre_impl [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::pre_impl_file}"]
1378 set globalSettings::post_impl [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::post_impl_file}"]
1379 set globalSettings::pre_bit [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::pre_bit_file}"]
1380 set globalSettings::post_bit [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::post_bit_file}"]
1381 set globalSettings::quartus_post_module [
file normalize "${globalSettings::tcl_path}/integrated/${globalSettings::quartus_post_module_file}"]
1382 set globalSettings::LIBERO_MANDATORY_VARIABLES {"FAMILY" "PACKAGE" "DIE" }
1384 set proj_dir [
file normalize "${globalSettings::repo_path}/Top/${globalSettings::project_name}"]
1385 Msg Debug "Calling GetConfFiles with proj_dir=$proj_dir (project_name=${globalSettings::project_name})"
1386 lassign [
GetConfFiles $proj_dir] conf_file sim_file pre_file post_file pre_rtl_file
1389 if {[
file exists $conf_file]} {
1390 Msg Info "Parsing configuration file $conf_file..."
1397 if {$conf_version != "0.0.0"} {
1398 set globalSettings::a_v [
split $actual_version "."]
1399 set globalSettings::c_v [
split $conf_version "."]
1401 if {[
llength $globalSettings::a_v] < 2} {
1402 Msg Error "Couldn't parse IDE version: $actual_version."
1403 }
elseif {[
llength $globalSettings::a_v] == 2} {
1404 lappend globalSettings::a_v 0
1406 if {[
llength $globalSettings::c_v] < 2} {
1407 Msg Error "Wrong version format in hog.conf: $conf_version."
1408 }
elseif {[
llength $globalSettings::c_v] == 2} {
1409 lappend globalSettings::c_v 0
1414 Msg Info "Project version and $ide version match: $conf_version."
1415 }
elseif {$comp == 1} {
1416 Msg CriticalWarning "The $ide version in use is $actual_version, that is newer than $conf_version, as specified in the first line of $conf_file.\n\
1417 If you want update this project to version $actual_version, please update the configuration file."
1420 Msg Error "The $ide version in use is $actual_version, that is older than $conf_version as specified in $conf_file. The project will not be created.\nIf you absolutely want to create this project that was meant for version $conf_version with $ide version $actual_version, you can change the version from the first line of $conf_file.\nThis is HIGHLY discouraged as there could be unrecognised properties in the configuration file and IPs created with a newer $ide version cannot be downgraded."
1423 Msg CriticalWarning "No version found in the first line of $conf_file. \
1424 It is HIGHLY recommended to replace the first line of $conf_file with: \#$ide $actual_version"
1427 if {$globalSettings::vitis_classic == 1} {
1429 Msg Error "Vitis Classic flow is not supported for versions < 2020.2. Please use Vitis 2020.2 or newer."}
1431 if {$globalSettings::vitis_unified == 1} {
1433 Msg Error "Vitis Unified flow is not supported for versions < 2019.2. Please use Vitis 2019.2 or newer."}
1436 if {[dict exists $globalSettings::PROPERTIES main]} {
1437 set main [dict get $globalSettings::PROPERTIES main]
1438 dict for {p v} $main {
1439 # notice the dollar in front of p: creates new variables and fill them with the value
1440 Msg Info "Main property $p set to $v"
1445 Msg Error "No main section found in $conf_file, make sure it has a section called \[main\] containing the mandatory properties."
1448 Msg Error "$conf_file was not found in your project directory, please create one."
1474 if {[
info exists env(HOG_EXTERNAL_PATH)]} {
1475 set globalSettings::HOG_EXTERNAL_PATH $env(HOG_EXTERNAL_PATH)
1477 set globalSettings::HOG_EXTERNAL_PATH ""
1480 set user_hog_file "${globalSettings::repo_path}/Top/hog.tcl"
1481 if {[
file exists $user_hog_file]} {
1482 Msg Info "Sourcing user hog.tcl file..."
1483 source $user_hog_file
1486 if {[
file exists $pre_file]} {
1487 Msg Info "Found pre-creation Tcl script $pre_file, executing it..."
1491 if {[
info exists env(HOG_IP_PATH)]} {
1492 set globalSettings::HOG_IP_PATH $env(HOG_IP_PATH)
1494 set globalSettings::HOG_IP_PATH ""
1507 if {([
string tolower $ide] eq "vitis_classic" || [
string tolower $ide] eq "vitis_unified") && $options(vitis_only) == 1} {
1508 if {$options(xsa) == ""} {
1509 Msg Error "This is a $ide only project, an XSA file must be provided via -xsa option."
1527 set fileName_old [
file normalize "./hogTmp/.hogQsys.md5"]
1528 set fileDir [
file normalize "${globalSettings::build_dir}/.hog/"]
1530 set fileName_new [
file normalize "$fileDir/.hogQsys.md5"]
1531 if {[
file exists $fileName_new]} {
1532 file delete $fileName_new
1534 if {[
file exists $fileName_old]} {
1535 file rename -force $fileName_old $fileName_new
1536 file delete -force -- "./hogTmp"
1540 if {[
file exists $post_file]} {
1541 Msg Info "Found post-creation Tcl script $post_file, executing it..."
1545 build_design_hierarchy
1552 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1553 -list_files ".src,.ext" \
1554 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1555 $globalSettings::repo_path] \
1556 listLibraries listProperties listSrcSets
1559 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1560 -list_files ".con" \
1561 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1562 $globalSettings::repo_path] \
1563 listConstraints listConProperties listConSets
1566 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1567 -list_files ".sim" \
1568 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1569 $globalSettings::repo_path] \
1570 listSimLibraries listSimProperties listSimSets
1573 cd $globalSettings::build_dir
1579 cd $globalSettings::repo_path
1583 [
file normalize $globalSettings::repo_path/Top/$globalSettings::project_name] \
1584 $globalSettings::repo_path \
1585 $globalSettings::HOG_EXTERNAL_PATH
1586 ] commit version hog_hash hog_ver top_hash top_ver libs hashes vers cons_ver cons_hash ext_names ext_hashes \
1587 xml_hash xml_ver user_ip_repos user_ip_hashes user_ip_vers cheby_hash cheby_ver
1592 set commit $this_commit
1595 if {$xml_hash != ""} {
1604 $globalSettings::repo_path \
1605 $globalSettings::project_name \
1606 $date $timee $commit $version \
1607 $top_hash $top_ver $hog_hash $hog_ver \
1608 $cons_ver $cons_hash $libs $vers $hashes \
1609 $ext_names $ext_hashes $user_ip_repos $user_ip_vers \
1610 $user_ip_hashes $flavour $xml_ver $xml_hash $cheby_ver $cheby_hash
1623 if {($globalSettings::vitis_classic == 1 || $globalSettings::vitis_unified == 1)} {
1626 write_hw_platform -fixed -force -file [
file normalize "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"]
1628 if {$options(xsa) == ""} {
1629 set vitis_xsa [
file normalize "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"]
1631 set vitis_xsa [
file normalize "$globalSettings::repo_path/$options(xsa)"]
1633 set vitis_xsa [
file normalize $options(xsa)]
1636 if {$globalSettings::vitis_classic == 1} {
1638 set xsct_cmd "xsct $globalSettings::tcl_path/launch.tcl C -xsa $vitis_xsa -vitis_only $globalSettings::project_name"
1639 Msg Info "Running Vitis Classic project creation script with command: $xsct_cmd"
1640 set ret [
catch {
exec -ignorestderr {*}$xsct_cmd >@ stdout} result]
1642 Msg Error "xsct (vitis classic) returned an error state: $result"
1644 }
elseif {$globalSettings::vitis_unified == 1} {
1645 Msg Info "Configuring Vitis Unified components..."
1647 if {[
info exists globalSettings::vitis_only_pass]} {
1648 set previous_pass $globalSettings::vitis_only_pass
1652 set globalSettings::vitis_only_pass 1
1654 set globalSettings::vitis_only_pass $previous_pass
1656 Msg Error "Failed to configure the Vitis Unified components: $result"
1657 }
elseif {$result != 0} {
1658 Msg Error "Failed to configure the Vitis Unified components."
1664 Msg Info "Project $globalSettings::project_name created successfully in [
Relative $globalSettings::repo_path $globalSettings::build_dir]."
1665 Notify Info "Created project $globalSettings::project_name."