29 namespace eval globalSettings {
42 variable LIBERO_MANDATORY_VARIABLES
47 variable HOG_EXTERNAL_PATH
49 variable TARGET_SIMULATOR
51 variable pre_synth_file
52 variable post_synth_file
53 variable pre_impl_file
54 variable post_impl_file
56 variable post_bit_file
57 variable quartus_post_module_file
65 variable synth_top_module
68 variable vitis_classic
75 variable quartus_post_module
84 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..*"}
85 set_msg_config -suppress -regexp -string {".*File '.*.xci' referenced by design '.*' could not be found..*"}
88 set_msg_config -suppress -id {IP_Flow 19-3664}
91 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} }
94 create_project -force [
file tail $globalSettings::DESIGN] $globalSettings::build_dir -part $globalSettings::PART
95 file mkdir "$globalSettings::build_dir/[
file tail $globalSettings::DESIGN].gen/sources_1"
96 if {[
IsVersal $globalSettings::PART]} {
97 Msg Info "This project uses a Versal device."
101 set obj [get_projects [
file tail $globalSettings::DESIGN]]
102 set_property "target_language" "VHDL" $obj
105 set_property "simulator_language" "Mixed" $obj
107 set_property "compxlib.${simulator}_compiled_library_dir" $globalSettings::simlib_path $obj
109 set_property "default_lib" "xil_defaultlib" $obj
111 set_param project.enableVHDL2008 1
112 set_property "enable_vhdl_2008" 1 $obj
114 set_property source_mgmt_mode All [current_project]
116 Msg Debug "Setting PART = $globalSettings::PART"
117 set_property PART $globalSettings::PART [current_project]
122 package require ::quartus::project
124 if {[
string equal $globalSettings::FAMILY "quartus_only"]} {
125 Msg Error "You must specify a device Family for Quartus"
127 file mkdir $globalSettings::build_dir
128 cd $globalSettings::build_dir
129 if {[is_project_open]} {
133 file delete {*}[glob -nocomplain $globalSettings::DESIGN.q*]
135 project_new -family $globalSettings::FAMILY -overwrite -part $globalSettings::PART $globalSettings::DESIGN
136 set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
141 if {[
file exists $globalSettings::build_dir]} {
142 file delete -force $globalSettings::build_dir
144 new_project -location $globalSettings::build_dir \
145 -name [
file tail $globalSettings::DESIGN] \
146 -die $globalSettings::DIE \
147 -package $globalSettings::PACKAGE \
148 -family $globalSettings::FAMILY \
151 if {[
file exists $globalSettings::build_dir]} {
152 file delete -force $globalSettings::build_dir
155 file mkdir $globalSettings::build_dir
156 cd $globalSettings::build_dir
157 prj_project new -name [
file tail $globalSettings::DESIGN] -dev $globalSettings::DEVICE -synthesis $globalSettings::SYNTHESIS_TOOL
161 if {[
file exists $globalSettings::build_dir/vitis_classic]} {
162 file delete -force $globalSettings::build_dir/vitis_classic
164 setws $globalSettings::build_dir/vitis_classic
166 puts "Creating project for $globalSettings::DESIGN part $globalSettings::PART"
167 puts "Configuring project settings:"
168 puts " - simulator_language: Mixed"
169 puts " - target_language: VHDL"
170 puts " - simulator: QuestaSim"
171 puts "Adding IP directory \"$globalSettings::user_ip_repo\" to the project "
175 proc AddProjectFiles {} {
179 if {[
string equal [get_filesets -quiet sources_1] ""]} {
180 create_fileset -srcset sources_1
182 set sources "sources_1"
194 if {[
string equal [get_filesets -quiet constrs_1] ""]} {
195 create_fileset -constrset constrs_1
199 set constraints [get_filesets constrs_1]
206 if {[
file isdirectory $globalSettings::list_path]} {
207 set list_files [glob -directory $globalSettings::list_path "*"]
209 Msg Error "No list directory found at $globalSettings::list_path"
213 source $globalSettings::tcl_path/utils/cmdline.tcl
217 AddHogFiles {*}[
GetHogFiles -list_files {.src,.sim,.ext} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
223 AddHogFiles {*}[
GetHogFiles -list_files {.con} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
237 proc CreateReportStrategy {obj} {
242 if {[
string equal [get_property -quiet report_strategy $obj] ""]} {
244 Msg Info "No report strategy needed for implementation"
247 set_property set_report_strategy_name 1 $obj
248 set_property report_strategy {Vivado Implementation Default Reports} $obj
249 set_property set_report_strategy_name 0 $obj
251 set reports [get_report_configs -of_objects $obj]
253 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0] ""]} {
254 create_report_config -report_name impl_1_place_report_utilization_0 -report_type report_utilization:1.0 -steps place_design -runs impl_1
256 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0]
262 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0] ""]} {
263 create_report_config -report_name impl_1_route_report_drc_0 -report_type report_drc:1.0 -steps route_design -runs impl_1
265 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0]
271 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0] ""]} {
272 create_report_config -report_name impl_1_route_report_power_0 -report_type report_power:1.0 -steps route_design -runs impl_1
274 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0]
280 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary] ""]} {
281 create_report_config -report_name impl_1_route_report_timing_summary -report_type report_timing_summary:1.0 -steps route_design -runs impl_1
283 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary]
285 Msg Info "Report timing created successfully"
289 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_utilization] ""]} {
290 create_report_config -report_name impl_1_route_report_utilization -report_type report_utilization:1.0 -steps route_design -runs impl_1
292 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_utilization]
294 Msg Info "Report utilization created successfully"
299 if {[
string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0] ""]} {
300 create_report_config -report_name impl_1_post_route_phys_opt_report_timing_summary_0 \
301 -report_type report_timing_summary:1.0 \
302 -steps post_route_phys_opt_design -runs impl_1
304 set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0]
306 set_property -name "options.max_paths" -value "10" -objects $obj
307 set_property -name "options.warn_on_violation" -value "1" -objects $obj
311 Msg Info "Won't create any report strategy, not in Vivado"
321 proc ConfigureSynthesis {} {
325 if {[
string equal [get_runs -quiet synth_1] ""]} {
326 create_run -name synth_1 -part $globalSettings::PART -constrset constrs_1
331 set obj [get_runs synth_1]
332 set_property "part" $globalSettings::PART $obj
336 if {$globalSettings::pre_synth_file ne ""} {
340 if {[get_filesets -quiet utils_1] != ""} {
341 AddFile $globalSettings::pre_synth [get_filesets -quiet utils_1]
343 set_property STEPS.SYNTH_DESIGN.TCL.PRE $globalSettings::pre_synth $obj
347 set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:$globalSettings::pre_synth
349 configure_tool -name {SYNTHESIZE} -params SYNPLIFY_TCL_FILE:$globalSettings::pre_synth
351 prj_impl pre_script "syn" $globalSettings::pre_synth
354 Msg Debug "Setting $globalSettings::pre_synth to be run before synthesis"
358 if {$globalSettings::post_synth_file ne ""} {
362 if {[get_filesets -quiet utils_1] != ""} {
363 AddFile $globalSettings::post_synth [get_filesets -quiet utils_1]
365 set_property STEPS.SYNTH_DESIGN.TCL.POST $globalSettings::post_synth $obj
369 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
371 prj_impl post_script "syn" $globalSettings::post_synth
373 Msg Debug "Setting $globalSettings::post_synth to be run after synthesis"
380 current_run -synthesis $obj
383 if {[
string equal [get_property -quiet report_strategy $obj] ""]} {
385 Msg Debug "No report strategy needed for synthesis"
388 set_property set_report_strategy_name 1 $obj
389 set_property report_strategy {Vivado Synthesis Default Reports} $obj
390 set_property set_report_strategy_name 0 $obj
392 if {[
string equal [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0] ""]} {
393 create_report_config -report_name synth_1_synth_report_utilization_0 -report_type report_utilization:1.0 -steps synth_design -runs synth_1
395 set reports [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0]
405 Msg info "Reporting strategy for synthesis"
414 proc ConfigureImplementation {} {
418 if {[
string equal [get_runs -quiet impl_1] ""]} {
419 create_run -name impl_1 -part $globalSettings::PART -constrset constrs_1 -parent_run synth_1
422 set obj [get_runs impl_1]
423 set_property "part" $globalSettings::PART $obj
425 set_property "steps.[
BinaryStepName $globalSettings::PART].args.readback_file" "0" $obj
426 set_property "steps.[
BinaryStepName $globalSettings::PART].args.verbose" "0" $obj
434 if {$globalSettings::pre_impl_file ne ""} {
438 if {[get_filesets -quiet utils_1] != ""} {
439 AddFile $globalSettings::pre_impl [get_filesets -quiet utils_1]
441 set_property STEPS.INIT_DESIGN.TCL.POST $globalSettings::pre_impl $obj
447 prj_impl pre_script "par" $globalSettings::pre_impl
449 Msg Debug "Setting $globalSettings::pre_impl to be run after implementation"
454 if {$globalSettings::post_impl_file ne ""} {
458 if {[get_filesets -quiet utils_1] != ""} {
459 AddFile $globalSettings::post_impl [get_filesets -quiet utils_1]
461 set_property STEPS.ROUTE_DESIGN.TCL.POST $globalSettings::post_impl $obj
465 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
467 prj_impl post_script "par" $globalSettings::post_impl
469 Msg Debug "Setting $globalSettings::post_impl to be run after implementation"
473 if {$globalSettings::pre_bit_file ne ""} {
477 if {[get_filesets -quiet utils_1] != ""} {
478 AddFile $globalSettings::pre_bit [get_filesets -quiet utils_1]
480 set_property STEPS.[
BinaryStepName $globalSettings::PART].TCL.PRE $globalSettings::pre_bit $obj
486 prj_impl pre_script "export" $globalSettings::pre_bit
488 Msg Debug "Setting $globalSettings::pre_bit to be run after bitfile generation"
492 if {$globalSettings::post_bit_file ne ""} {
496 if {[get_filesets -quiet utils_1] != ""} {
497 AddFile $globalSettings::post_bit [get_filesets -quiet utils_1]
499 set_property STEPS.[
BinaryStepName $globalSettings::PART].TCL.POST $globalSettings::post_bit $obj
503 set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:$globalSettings::quartus_post_module
505 prj_impl post_script "export" $globalSettings::post_bit
507 Msg Debug "Setting $globalSettings::post_bit to be run after bitfile generation"
516 proc ConfigureSimulation {} {
517 set simsets_dict [
GetSimSets "$globalSettings::group_name/$globalSettings::DESIGN" $globalSettings::repo_path]
523 Msg Debug "Setting load_glbl parameter to true for every fileset..."
524 foreach simset [get_filesets -quiet] {
525 if {[get_property FILESET_TYPE $simset] != "SimulationSrcs"} {
529 set_property -name {xsim.elaborate.load_glbl} -value {true} -objects [get_filesets $simset]
532 set sim_dict [
DictGet $simsets_dict $simset]
533 set sim_props [
DictGet $sim_dict "properties"]
535 if {$sim_props != ""} {
536 Msg Info "Setting properties for simulation set: $simset..."
537 dict for {prop_name prop_val} $sim_props {
538 set prop_name [string toupper $prop_name]
539 if {$prop_name == "ACTIVE" && $prop_val == 1} {
540 Msg Info "Setting $simset as active simulation set..."
541 current_fileset -simset [get_filesets $simset]
543 Msg Debug "Setting $prop_name = $prop_val"
544 if {[IsInList [string toupper $prop_name] [VIVADO_PATH_PROPERTIES] 1]} {
545 # Check that the file exists before setting these properties
546 if {[file exists $globalSettings::repo_path/$prop_val]} {
547 set_property $prop_name $globalSettings::repo_path/$prop_val [get_filesets $simset]
549 Msg Warning "Impossible to set property $prop_name to $prop_val. File is missing"
552 set_property $prop_name $prop_val [get_filesets $simset]
563 proc ConfigureProperties {} {
565 cd $globalSettings::repo_path
569 if {[
info exists globalSettings::PROPERTIES]} {
570 if {[dict exists $globalSettings::PROPERTIES main]} {
571 Msg Info "Setting project-wide properties..."
572 set proj_props [dict get $globalSettings::PROPERTIES main]
573 dict for {prop_name prop_val} $proj_props {
574 if {[string tolower $prop_name] != "ip_repo_paths"} {
575 if {[string tolower $prop_name] != "part"} {
576 # Part is already set
577 Msg Debug "Setting $prop_name = $prop_val"
578 set_property $prop_name $prop_val [current_project]
581 set ip_repo_list [regsub -all {\s+} $prop_val " $globalSettings::repo_path/"]
582 set ip_repo_list $globalSettings::repo_path/$ip_repo_list
584 Msg Info "Setting $ip_repo_list as user IP repository..."
586 set_property ip_repo_paths "$ip_repo_list" [current_fileset]
588 set_property ip_repo_paths "$ip_repo_list" [current_project]
595 foreach run [get_runs -quiet] {
596 if {[dict exists $globalSettings::PROPERTIES $run]} {
597 Msg Info "Setting properties for run: $run..."
598 set run_props [dict get $globalSettings::PROPERTIES $run]
600 set stragety_str "STRATEGY strategy Strategy"
601 Msg Debug "Setting Strategy and Flow for run $run (if specified in hog.conf)"
602 foreach s $stragety_str {
603 if {[dict exists $run_props $s]} {
604 set prop [dict get $run_props $s]
605 set_property $s $prop $run
606 set run_props [dict remove $run_props $s]
607 Msg Warning "A strategy for run $run has been defined inside hog.conf. This prevents Hog to compare the project properties. \
608 Please regenerate your hog.conf file using the dedicated Hog button."
609 Msg Info "Setting $s = $prop"
613 dict for {prop_name prop_val} $run_props {
614 Msg Debug "Setting $prop_name = $prop_val"
615 if {[string trim $prop_val] == ""} {
616 Msg Warning "Property $prop_name has empty value. Skipping..."
619 if {[IsInList [string toupper $prop_name] [VIVADO_PATH_PROPERTIES] 1]} {
620 # Check that the file exists before setting these properties
621 set utility_file $globalSettings::repo_path/$prop_val
622 if {[file exists $utility_file]} {
623 lassign [GetHogFiles -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path] lib prop dummy
626 lappend hog_files $ff
629 if {[lsearch $hog_files $utility_file] < 0} {
630 Msg CriticalWarning "The file: $utility_file is set as a property in hog.conf, \
631 but is not added to the project in any list file. Hog cannot track it."
633 #Add file tu utils_1 to avoid warning
634 AddFile $globalSettings::repo_path/$prop_val [get_filesets -quiet utils_1]
636 set_property $prop_name $utility_file $run
638 Msg Warning "Impossible to set property $prop_name to $prop_val. File is missing"
641 set_property $prop_name $prop_val $run
652 if {[
info exists globalSettings::PROPERTIES]} {
654 if {[dict exists $globalSettings::PROPERTIES main]} {
655 Msg Info "Setting device properties..."
656 set dev_props [dict get $globalSettings::PROPERTIES main]
657 dict for {prop_name prop_val} $dev_props {
658 if {!([string toupper $prop_name] in $globalSettings::LIBERO_MANDATORY_VARIABLES)} {
659 Msg Debug "Setting $prop_name = $prop_val"
660 set_device -[string tolower $prop_name] $prop_val
665 if {[dict exists $globalSettings::PROPERTIES project]} {
666 Msg Info "Setting project-wide properties..."
667 set dev_props [dict get $globalSettings::PROPERTIES project]
668 dict for {prop_name prop_val} $dev_props {
669 Msg Debug "Setting $prop_name = $prop_val"
670 project_settings -[string tolower $prop_name] $prop_val
674 if {[dict exists $globalSettings::PROPERTIES synth]} {
675 Msg Info "Setting Synthesis properties..."
676 set synth_props [dict get $globalSettings::PROPERTIES synth]
677 dict for {prop_name prop_val} $synth_props {
678 Msg Debug "Setting $prop_name = $prop_val"
679 configure_tool -name {SYNTHESIZE} -params "[string toupper $prop_name]:$prop_val"
683 if {[dict exists $globalSettings::PROPERTIES impl]} {
684 Msg Info "Setting Implementation properties..."
685 set impl_props [dict get $globalSettings::PROPERTIES impl]
686 dict for {prop_name prop_val} $impl_props {
687 Msg Debug "Setting $prop_name = $prop_val"
688 configure_tool -name {PLACEROUTE} -params "[string toupper $prop_name]:$prop_val"
693 if {[dict exists $globalSettings::PROPERTIES bitstream]} {
694 Msg Info "Setting Bitstream properties..."
695 set impl_props [dict get $globalSettings::PROPERTIES impl]
696 dict for {prop_name prop_val} $impl_props {
697 Msg Debug "Setting $prop_name = $prop_val"
698 configure_tool -name {GENERATEPROGRAMMINGFILE} -params "[string toupper $prop_name]:$prop_val"
702 configure_tool -name {VERIFYTIMING} -params {FORMAT:TEXT}
705 if {[
info exists globalSettings::PROPERTIES]} {
707 if {[dict exists $globalSettings::PROPERTIES main]} {
708 Msg Info "Setting project-wide properties..."
709 set dev_props [dict get $globalSettings::PROPERTIES main]
710 dict for {prop_name prop_val} $dev_props {
711 # Device is already set
712 if {[string toupper $prop_name] != "DEVICE"} {
713 Msg Debug "Setting $prop_name = $prop_val"
714 prj_project option $prop_name $prop_val
719 if {[dict exists $globalSettings::PROPERTIES impl]} {
720 Msg Info "Setting Implementation properties..."
721 set dev_props [dict get $globalSettings::PROPERTIES impl]
722 dict for {prop_name prop_val} $dev_props {
723 # Device is already set
724 Msg Debug "Setting $prop_name = $prop_val"
725 prj_impl option $prop_name $prop_val
730 Msg info "Configuring Properties"
736 proc ConfigurePlatforms {{xsa ""}} {
737 dict for {key value} [dict filter $globalSettings::PROPERTIES key {platform:*}] {
738 set value_lower [dict create]
739 dict for {vkey vvalue} $value {
740 dict set value_lower [string tolower $vkey] $vvalue
742 dict set platforms $key $value_lower
748 dict for {key value} $platforms2 {
749 Msg Info "Key: $key, Value: $value"
752 if {[dict size $platforms] == 0} {
753 Msg Info "No platforms found in the configuration file"
757 dict for {platform_key platform_config} $platforms {
758 Msg Info "Found platform with key: $platform_key with configuration: $platform_config"
759 if {[regexp {^platform:(.+)$} $platform_key -> platform_name]} {
760 set platform_name [string trim $platform_name]
761 Msg Info "Configuring platform: $platform_name"
762 CreatePlatform $platform_name $platform_config $xsa
764 Msg Warning "Invalid platform key format: $platform_key. Expected format: platform:<name>"
769 proc CreatePlatform {platform_name platform_conf {xsa ""}} {
771 set platform_create_options {
772 "desc" "hw" "out" "prebuilt" "proc" "arch"
773 "samples" "os" "xpfm" "no-boot-bsp"
776 Msg Info "Creating platform configuration..."
777 append platform_options " -name $platform_name"
780 if {[
catch {
set ws_platforms [platform list -dict]}]} {
set ws_platforms ""}
781 if {[lsearch -exact $ws_platforms $platform_name] != -1} {
782 Msg Info "Platform $platform_name already exists, removing it..."
783 platform remove $platform_name
786 dict for {p v} $platform_conf {
787 if {[IsInList [string toupper $p] [VITIS_PATH_PROPERTIES] 1]} {
789 if {[IsRelativePath $v] == 1} {
790 set v "$globalSettings::repo_path/$v"
793 if {[file exists $v]} {
798 Msg Warning "Impossible to set property $p to $v. File is missing"
803 set p_lower [string tolower $p]
804 if {[IsInList $p_lower $platform_create_options]} {
805 append platform_options " -$p_lower $v"
807 if {$p_lower ne "bif"} {
808 Msg Warning "Attempting to use unknown platform option: $p_lower"
809 append platform_options " -$p_lower $v"
816 if {![dict exists $platform_conf hw]} {
817 set xsa "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"
818 set platform_options "$platform_options -hw $xsa"
820 set platform_options "$platform_options"
824 Msg Info "Opening hardware design to check if proc to cell mapping needs to be extracted for soft processors..."
825 hsi::open_hw_design $xsa
827 set proc_cells [hsi::get_cells -filter { IP_TYPE == "PROCESSOR" }]
828 set proc_map_file [open "$globalSettings::build_dir/vitis_classic/$platform_name.PROC_MAP" "w"]
830 foreach proc $proc_cells {
832 Msg Debug "Processor found in xsa: $proc"
833 if {[regexp -nocase {microblaze|risc} $proc]} {
834 Msg Info "Extracting processor cells for soft processor: $proc"
835 set proc_hier_name [hsi::get_property HIER_NAME $proc]
836 set proc_address_tag [hsi::get_property ADDRESS_TAG $proc]
838 if {$proc_address_tag eq ""} {
839 Msg Warning "Processor $proc ($proc_hier_name) does not have an ADDRESS_TAG property set. \
840 This may cause issues when configuring the platform."
842 set proc_map_entry "$proc_hier_name $proc_address_tag"
843 puts $proc_map_file "$proc_map_entry\n"
848 hsi::close_hw_design [hsi::current_hw_design]
852 Msg Info "Creating platform \[$platform_name\] with options: \{$platform_options\}"
853 set plat_create "platform create $platform_options"
855 platform active $platform_name
860 proc ConfigureApps {} {
861 set apps [dict filter $globalSettings::PROPERTIES key {app:*}]
863 if {[dict size $apps] == 0} {
864 Msg Info "No apps found in the configuration file"
868 dict for {app_key app_config} $apps {
869 Msg Info "Found app with key: $app_key with configuration: $app_config"
870 if {[regexp {^app:(.+)$} $app_key -> app_name]} {
871 set app_name [string trim $app_name]
872 Msg Info "Configuring app: $app_name"
873 ConfigureApp $app_name $app_config
875 Msg Warning "Invalid app key format: $app_key. Expected format: app:<name>"
880 proc ConfigureApp {app_name app_conf} {
883 "platform" "domain" "sysproj" "hw"
884 "proc" "template" "os" "lang" "arch" "name"
888 "assembler-flags" "build-config" "compiler-misc" "compiler-optimization"
889 "define-compiler-symbols" "include-path" "libraries" "library-search-path"
890 "linker-misc" "linker-script" "undef-compiler-symbols"
893 Msg Info "Configuring app..."
894 append app_options " -name $app_name"
897 if {[
catch {
set sys_projs [sysproj list -dict]}]} {
set sys_projs ""}
898 if {[dict exists $app_name sysproj]} {
899 set sys_proj_name [dict get $app_name sysproj]
900 if {[lsearch -exact $sys_projs "Name $sys_proj_name"] != -1} {
901 Msg Info "Removing $sys_proj_name..."
902 sysproj remove $sys_proj_name
905 set sys_proj_name "$app_name\_system"
906 if {[lsearch -exact $sys_projs "Name $sys_proj_name"] != -1} {
907 Msg Info "Removing $sys_proj_name..."
908 sysproj remove $sys_proj_name
913 if {[
catch {
set ws_apps [app list -dict]}]} {
set ws_apps ""}
914 if {[lsearch -exact $ws_apps $app_name] != -1} {
915 Msg Info "app $app_name already exists, removing it..."
919 set app_create_options [dict create]
920 set app_conf_options [dict create]
923 dict for {p v} $app_conf {
924 set p_lower [string tolower $p]
926 if {[IsInList [string toupper $p] [VITIS_PATH_PROPERTIES] 1]} {
927 if {[IsRelativePath $v] == 1} {
928 set v "$globalSettings::repo_path/$v"
930 if {[file exists $v]} {
931 set v $globalSettings::repo_path/$v
933 Msg Warning "Impossible to set property $p to $v. File is missing"
938 if {[IsInList $p_lower $create_options]} {
939 Msg Info "$p_lower is in create options"
940 dict append app_create_options $p_lower $v
941 } elseif {[IsInList $p_lower $conf_options]} {
942 Msg Info "$p_lower is in conf options"
943 dict append app_conf_options $p_lower $v
945 Msg Warning "Unknown app option: $p_lower"
950 dict for {p v} $app_create_options {
951 if {[string equal $p "platform"]} {
952 Msg Info "Setting App $app_name platform to $v"
955 append app_options " -$p $v"
958 if {![dict exists $app_name template]} {
961 if {[dict exists $app_create_options "lang"]} {
962 set lang [dict get $app_create_options "lang"]
963 if {[
string equal -nocase $lang "C++"] || [
string equal -nocase $lang "cpp"]} {
964 append app_options " -template \{Empty Application (C++)\}"
966 append app_options " -template \{Empty Application(C)\}"
970 append app_options " -template \{Empty Application(C)\}"
974 append app_options " -template \{Empty Application\}"
978 Msg Info "Creating application \[$app_name\] with options: \{$app_options\}"
979 set app_create "app create $app_options"
981 app config -name $app_name -set build-config Release
984 dict for {p v} $app_conf_options {
985 Msg Info "Configuring app option $p to $v"
986 app config -name $app_name -set $p $v
991 proc AddAppFiles {} {
992 AddHogFiles {*}[
GetHogFiles -list_files {.src,.header} -ext_path $globalSettings::HOG_EXTERNAL_PATH $globalSettings::list_path $globalSettings::repo_path]
999 current_run -implementation [get_runs impl_1]
1006 Msg Info "Running report_ip_status, before upgrading and handling IPs..."
1010 if {$globalSettings::HOG_IP_PATH != ""} {
1011 set ip_repo_path $globalSettings::HOG_IP_PATH
1012 Msg Info "HOG_IP_PATH is set, will pull/push synthesised IPs from/to $ip_repo_path."
1014 HandleIP pull [get_property IP_FILE $ip] $ip_repo_path $globalSettings::repo_path [get_property IP_OUTPUT_DIR $ip]
1017 Msg Info "HOG_IP_PATH not set, will not push/pull synthesised IPs."
1021 proc SetGlobalVar {var {default_value HOG_NONE}} {
1023 if {[
info exists ::$var]} {
1024 Msg Debug "Setting $var to [subst $[subst ::$var]]"
1026 set globalSettings::$var [subst $[subst ::$var]]
1027 }
elseif {$default_value == "HOG_NONE"} {
1028 Msg Error "Mandatory variable $var was not defined. Please define it in hog.conf or in project tcl script."
1030 Msg Info "Setting $var to default value: \"$default_value\""
1032 set globalSettings::$var $default_value
1038 proc CreateProject {args} {
1042 if {[
catch {
package require cmdline} ERROR]} {
1043 puts "ERROR: If you are running this script on tclsh, you can fix this by installing 'tcllib'"
1047 {simlib_path.arg "" "Path of simulation libs"}
1048 {verbose "If set, launch the script in verbose mode."}
1049 {xsa.arg "" "xsa for creating platforms without a defined hw."}
1050 {vivado_only "If set, and project is vivado-vitis, vitis project will not be created."}
1053 set usage "Create Vivado/Vitis/ISE/Quartus/Libero/Diamond project.\nUsage: CreateProject \[OPTIONS\] <project> <repository path>\n Options:"
1055 if {[
catch {
array set options [
cmdline::getoptions args $parameters $usage]}] || [
llength $args] < 2 || [
lindex $args 0] eq ""} {
1060 set globalSettings::DESIGN [
lindex $args 0]
1061 if {[
file exists [
lindex $args 1]]} {
1062 set globalSettings::repo_path [
file normalize [
lindex $args 1]]
1064 Msg Error "The second argument, [
lindex $args 1], should be the repository path."
1066 set globalSettings::tcl_path $globalSettings::repo_path/Hog/Tcl
1069 if {$options(verbose) == 1} {
1070 variable ::DEBUG_MODE 1
1074 if {$options(simlib_path) != ""} {
1076 set globalSettings::simlib_path "$options(simlib_path)"
1078 set globalSettings::simlib_path "$globalSettings::repo_path/$options(simlib_path)"
1080 Msg Info "Simulation library path set to $options(simlib_path)"
1082 set globalSettings::simlib_path "$globalSettings::repo_path/SimulationLib"
1083 Msg Info "Simulation library path set to default $globalSettings::repo_path/SimulationLib"
1089 set build_dir_name "Projects"
1090 set globalSettings::group_name [
file dirname $globalSettings::DESIGN]
1091 set globalSettings::project_name $globalSettings::DESIGN
1092 set globalSettings::pre_synth_file "pre-synthesis.tcl"
1093 set globalSettings::post_synth_file "post-synthesis.tcl"
1094 set globalSettings::pre_impl_file "pre-implementation.tcl"
1095 set globalSettings::post_impl_file "post-implementation.tcl"
1096 set globalSettings::pre_bit_file "pre-bitstream.tcl"
1097 set globalSettings::post_bit_file "post-bitstream.tcl"
1098 set globalSettings::quartus_post_module_file "quartus-post-module.tcl"
1099 set globalSettings::top_path "$globalSettings::repo_path/Top/$globalSettings::DESIGN"
1100 set globalSettings::list_path "$globalSettings::top_path/list"
1101 set globalSettings::build_dir "$globalSettings::repo_path/$build_dir_name/$globalSettings::DESIGN"
1102 set globalSettings::DESIGN [
file tail $globalSettings::DESIGN]
1103 set globalSettings::top_name [
file tail $globalSettings::DESIGN]
1104 set globalSettings::top_name [
file rootname $globalSettings::top_name]
1105 set globalSettings::synth_top_module "top_$globalSettings::top_name"
1106 set globalSettings::user_ip_repo ""
1108 set globalSettings::pre_synth [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::pre_synth_file"]
1109 set globalSettings::post_synth [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::post_synth_file"]
1110 set globalSettings::pre_impl [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::pre_impl_file"]
1111 set globalSettings::post_impl [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::post_impl_file"]
1112 set globalSettings::pre_bit [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::pre_bit_file"]
1113 set globalSettings::post_bit [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::post_bit_file"]
1114 set globalSettings::quartus_post_module [
file normalize "$globalSettings::tcl_path/integrated/$globalSettings::quartus_post_module_file"]
1115 set globalSettings::LIBERO_MANDATORY_VARIABLES {"FAMILY" "PACKAGE" "DIE" }
1117 set proj_dir [
file normalize $globalSettings::repo_path/Top/$globalSettings::project_name]
1118 Msg Debug "Calling GetConfFiles with proj_dir=$proj_dir (project_name=$globalSettings::project_name)"
1119 lassign [
GetConfFiles $proj_dir] conf_file sim_file pre_file post_file
1122 if {[
file exists $conf_file]} {
1123 Msg Info "Parsing configuration file $conf_file..."
1129 if {([
string tolower $ide] eq "vivado_vitis_classic") && ($options(vivado_only) != 1)} {
1130 puts "Vitis classic detected, setting globalSettings::vitis_classic to 1"
1131 set globalSettings::vitis_classic 1
1133 set globalSettings::vitis_classic 0
1136 if {$conf_version != "0.0.0"} {
1137 set globalSettings::a_v [
split $actual_version "."]
1138 set globalSettings::c_v [
split $conf_version "."]
1140 if {[
llength $globalSettings::a_v] < 2} {
1141 Msg Error "Couldn't parse IDE version: $actual_version."
1142 }
elseif {[
llength $globalSettings::a_v] == 2} {
1143 lappend globalSettings::a_v 0
1145 if {[
llength $globalSettings::c_v] < 2} {
1146 Msg Error "Wrong version format in hog.conf: $conf_version."
1147 }
elseif {[
llength $globalSettings::c_v] == 2} {
1148 lappend globalSettings::c_v 0
1153 Msg Info "Project version and $ide version match: $conf_version."
1154 }
elseif {$comp == 1} {
1155 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\
1156 If you want update this project to version $actual_version, please update the configuration file."
1159 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."
1162 Msg CriticalWarning "No version found in the first line of $conf_file. \
1163 It is HIGHLY recommended to replace the first line of $conf_file with: \#$ide $actual_version"
1166 if {$globalSettings::vitis_classic == 1} {
1168 Msg Error "Vitis flow is not supported for versions < 2020.2. Please use Vitis 2020.2 or newer."}
1172 if {[dict exists $globalSettings::PROPERTIES main]} {
1173 set main [dict get $globalSettings::PROPERTIES main]
1174 dict for {p v} $main {
1175 # notice the dollar in front of p: creates new variables and fill them with the value
1176 Msg Info "Main property $p set to $v"
1181 Msg Error "No main section found in $conf_file, make sure it has a section called \[main\] containing the mandatory properties."
1184 Msg Error "$conf_file was not found in your project directory, please create one."
1210 if {[
info exists env(HOG_EXTERNAL_PATH)]} {
1211 set globalSettings::HOG_EXTERNAL_PATH $env(HOG_EXTERNAL_PATH)
1213 set globalSettings::HOG_EXTERNAL_PATH ""
1216 set user_hog_file "$globalSettings::repo_path/Top/hog.tcl"
1217 if {[
file exists $user_hog_file]} {
1218 Msg Info "Sourcing user hog.tcl file..."
1219 source $user_hog_file
1222 if {[
file exists $pre_file]} {
1223 Msg Info "Found pre-creation Tcl script $pre_file, executing it..."
1227 if {[
info exists env(HOG_IP_PATH)]} {
1228 set globalSettings::HOG_IP_PATH $env(HOG_IP_PATH)
1230 set globalSettings::HOG_IP_PATH ""
1236 if {$options(xsa) != ""} {
1237 Msg Info "Configuring platforms with xsa: $options(xsa)"
1259 set fileName_old [
file normalize "./hogTmp/.hogQsys.md5"]
1260 set fileDir [
file normalize "$globalSettings::build_dir/.hog/"]
1262 set fileName_new [
file normalize "$fileDir/.hogQsys.md5"]
1263 if {[
file exists $fileName_new]} {
1264 file delete $fileName_new
1266 if {[
file exists $fileName_old]} {
1267 file rename -force $fileName_old $fileName_new
1268 file delete -force -- "./hogTmp"
1272 if {[
file exists $post_file]} {
1273 Msg Info "Found post-creation Tcl script $post_file, executing it..."
1277 build_design_hierarchy
1284 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1285 -list_files ".src,.ext" \
1286 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1287 $globalSettings::repo_path] \
1288 listLibraries listProperties listSrcSets
1291 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1292 -list_files ".con" \
1293 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1294 $globalSettings::repo_path] \
1295 listConstraints listConProperties listConSets
1298 -ext_path "$globalSettings::HOG_EXTERNAL_PATH" \
1299 -list_files ".sim" \
1300 "$globalSettings::repo_path/Top/$globalSettings::project_name/list/" \
1301 $globalSettings::repo_path] \
1302 listSimLibraries listSimProperties listSimSets
1305 cd $globalSettings::build_dir
1311 cd $globalSettings::repo_path
1315 [
file normalize $globalSettings::repo_path/Top/$globalSettings::project_name] \
1316 $globalSettings::repo_path \
1317 $globalSettings::HOG_EXTERNAL_PATH
1318 ] commit version hog_hash hog_ver top_hash top_ver libs hashes vers cons_ver cons_hash ext_names ext_hashes \
1319 xml_hash xml_ver user_ip_repos user_ip_hashes user_ip_vers
1324 set commit $this_commit
1327 if {$xml_hash != ""} {
1336 $globalSettings::repo_path \
1337 $globalSettings::project_name \
1338 $date $timee $commit $version \
1339 $top_hash $top_ver $hog_hash $hog_ver \
1340 $cons_ver $cons_hash $libs $vers $hashes \
1341 $ext_names $ext_hashes $user_ip_repos $user_ip_vers \
1342 $user_ip_hashes $flavour $xml_ver $xml_hash
1355 if {($globalSettings::vitis_classic == 1)} {
1357 write_hw_platform -fixed -force -file [
file normalize "$globalSettings::build_dir/$globalSettings::DESIGN-presynth.xsa"]
1360 if {$options(xsa) == ""} {
1364 set xsa_opt "-xsa $options(xsa)"
1366 set xsa_opt "-xsa $globalSettings::repo_path/$options(xsa)"
1370 set xsct_cmd "xsct $globalSettings::tcl_path/launch.tcl C $xsa_opt -vitis_only $globalSettings::project_name"
1371 Msg Info "Running Vitis Classic project creation script with command: $xsct_cmd"
1372 set ret [
catch {
exec -ignorestderr {*}$xsct_cmd >@ stdout} result]
1374 Msg Error "xsct (vitis classic) returned an error state."
1379 Msg Info "Project $globalSettings::project_name created successfully in [
Relative $globalSettings::repo_path $globalSettings::build_dir]."