From 4d68ddc98cde7362113bb5249148cab917210f82 Mon Sep 17 00:00:00 2001 From: Donwalkar Date: Tue, 25 Nov 2025 07:27:55 -0800 Subject: [PATCH 1/4] Add loglevels to aiebu, set at runtime Signed-off-by: Donwalkar --- src/cpp/common/logger.h | 73 +++++++++++++++++++ src/cpp/elf/elfwriter.cpp | 3 +- src/cpp/encoder/aie2ps/aie2ps_encoder.cpp | 5 ++ .../aie2/aie2_blob_preprocessor_input.h | 3 + .../preprocessor/aie2ps/aie2ps_preprocessor.h | 26 ++++--- src/cpp/preprocessor/asm/asm_parser.cpp | 14 ++-- src/cpp/preprocessor/asm/asm_parser.h | 1 + src/cpp/utils/target/target.cpp | 41 ++++++++++- src/cpp/utils/target/target.h | 3 +- 9 files changed, 149 insertions(+), 20 deletions(-) create mode 100644 src/cpp/common/logger.h diff --git a/src/cpp/common/logger.h b/src/cpp/common/logger.h new file mode 100644 index 00000000..d12ae7fd --- /dev/null +++ b/src/cpp/common/logger.h @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +// Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + +#ifndef AIEBU_COMMON_LOGGER_H +#define AIEBU_COMMON_LOGGER_H + +#include +#include + +namespace aiebu { + +// Log Levels +enum class log_level { + error = 0, // Always shown + warn = 1, // Warnings + info = 2, // Informational messages (shown with verbose) + debug = 3 // Debug messages (shown with verbose) +}; + +// Global log level (default: errors and warnings) +inline log_level g_log_level = log_level::warn; + +// Set log level +inline void set_log_level(log_level level) { + g_log_level = level; +} + +// Get log level +inline log_level get_log_level() { + return g_log_level; +} + +// Enable verbose mode (shows info and debug messages) +inline void enable_verbose_logging() { + g_log_level = log_level::debug; +} + +// Disable verbose mode (back to default: errors and warnings) +inline void disable_verbose_logging() { + g_log_level = log_level::warn; +} + +} // namespace aiebu + +// Logging macros +#define LOG_ERROR(msg) \ + do { \ + std::cerr << "[ERROR] " << msg << std::endl; \ + } while (0) + +#define LOG_WARN(msg) \ + do { \ + if (aiebu::g_log_level >= aiebu::log_level::warn) { \ + std::cout << "[WARN] " << msg << std::endl; \ + } \ + } while (0) + +#define LOG_INFO(msg) \ + do { \ + if (aiebu::g_log_level >= aiebu::log_level::info) { \ + std::cout << msg << std::endl; \ + } \ + } while (0) + +#define LOG_DEBUG(msg) \ + do { \ + if (aiebu::g_log_level >= aiebu::log_level::debug) { \ + std::cout << "[DEBUG] " << msg << std::endl; \ + } \ + } while (0) + +#endif // AIEBU_COMMON_LOGGER_H + diff --git a/src/cpp/elf/elfwriter.cpp b/src/cpp/elf/elfwriter.cpp index 7eea92b7..6a849efc 100644 --- a/src/cpp/elf/elfwriter.cpp +++ b/src/cpp/elf/elfwriter.cpp @@ -2,6 +2,7 @@ // Copyright (C) 2024-2025, Advanced Micro Devices, Inc. All rights reserved. #include "elfwriter.h" +#include "logger.h" namespace aiebu { @@ -118,7 +119,7 @@ elf_writer:: finalize() { add_note(NT_XRT_UID, ".note.xrt.UID", m_uid.calculate()); - std::cout << "UID:" << m_uid.str() << "\n"; + LOG_INFO("UID:" << m_uid.str()); std::stringstream stream; stream << std::noskipws; //m_elfio.save( "hello_32" ); diff --git a/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp b/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp index e48ebe3e..d741c00b 100644 --- a/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp +++ b/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp @@ -3,6 +3,7 @@ #include "aie2ps_encoder.h" #include "aiebu/aiebu_error.h" +#include "logger.h" #include @@ -79,6 +80,10 @@ process(std::shared_ptr input) } } + // Report (only if verbose flag is set or log level is info or higher) + if (get_log_level() >= log_level::info) + m_report.summary(std::cout); + // Debug JSON serialization json dbg_json = m_debug.to_json(); diff --git a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h index c7d19fc1..f35dd938 100644 --- a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h +++ b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h @@ -9,6 +9,7 @@ #include "utils.h" #include "file_utils.h" #include "preprocessor_input.h" +#include "asm/asm_parser.h" #include #include @@ -105,6 +106,8 @@ class aie2_blob_preprocessor_input : public preprocessor_input { if (lib == legacydpuxclbin) arg_offset = 1; + else if (lib == "verbose") + enable_verbose_logging(); else std::cout << "Invalid flag: " << lib << ", ignored !!!" << std::endl; } diff --git a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h index 8f3129c8..afbf63d0 100644 --- a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h +++ b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h @@ -19,6 +19,7 @@ class aie2ps_preprocessor: public preprocessor { const std::string disable_dump_map = "disabledump"; const std::string full_dump_map = "fulldump"; + const std::string verbose_asm = "verbose"; std::shared_ptr>> m_isa; public: aie2ps_preprocessor() {} @@ -45,25 +46,32 @@ class aie2ps_preprocessor: public preprocessor { //auto keys = tinput->get_keys(); const std::string prefix = "opt_level_"; - std::shared_ptr parser(new asm_parser(tinput->get_ctrlcode_data(), tinput->get_include_paths())); - parser->parse_lines(); - auto collist = parser->get_col_list(); - isa i; - uint32_t optimize = 0; - m_isa = i.get_isamap(); - auto toutput = std::make_shared(parser->get_partition_info()); + + // Process flags before parsing to set global verbose flag auto flags = tinput->get_flags(); + uint32_t optimize = 0; + asm_dump_flag debug_flag = asm_dump_flag::text; for (const auto& flag: flags) { if (flag == disable_dump_map) - toutput->set_debug(asm_dump_flag::disable); + debug_flag = asm_dump_flag::disable; else if (flag == full_dump_map) - toutput->set_debug(asm_dump_flag::full); + debug_flag = asm_dump_flag::full; + else if (flag == verbose_asm) + enable_verbose_logging(); else if (flag.find(prefix) == 0) optimize = std::stoi(flag.substr(prefix.size())); else std::cout << "Invalid flag: " << flag << ", ignored !!!" << std::endl; } + + std::shared_ptr parser(new asm_parser(tinput->get_ctrlcode_data(), tinput->get_include_paths())); + parser->parse_lines(); + auto collist = parser->get_col_list(); + isa i; + m_isa = i.get_isamap(); + auto toutput = std::make_shared(parser->get_partition_info()); + toutput->set_debug(debug_flag); auto& controlpkts = tinput->get_controlpkt(); auto& ctrlpkt_id_map = tinput->get_ctrlpkt_id_map(); toutput->set_optmization(optimize); diff --git a/src/cpp/preprocessor/asm/asm_parser.cpp b/src/cpp/preprocessor/asm/asm_parser.cpp index 0f88b518..0d09d9bb 100644 --- a/src/cpp/preprocessor/asm/asm_parser.cpp +++ b/src/cpp/preprocessor/asm/asm_parser.cpp @@ -219,7 +219,7 @@ operate(std::shared_ptr parserptr, const boost::smatch& sm) else if (is_annotation_section(args[0])) m_parserptr->set_annotation_state(); else - std::cout << "section directive with unknown section found:" << args[0] << std::endl; + LOG_WARN("section directive with unknown section found:" << args[0]); } void @@ -229,17 +229,17 @@ operate(std::shared_ptr parserptr, const boost::smatch& sm) m_parserptr = parserptr; static const boost::regex pattern(R"(\.partition\s+(\d+)(column|core:(\d+)mem))"); boost::smatch match; - std::cout << "PARTITION:" << sm[0].str() << "\n"; + LOG_INFO("PARTITION:" << sm[0].str()); std::string line = sm[0].str(); if (boost::regex_match(line, match, pattern)) { if (match[2] == "column") { - std::cout << "Column count: " << match[1] << std::endl; + LOG_INFO("Column count: " << match[1]); m_parserptr->set_numcolumn(to_uinteger(match[1])); } else { m_parserptr->set_numcore(to_uinteger(match[1])); m_parserptr->set_nummem(to_uinteger(match[3])); - std::cout << "Core count: " << match[1] << std::endl; - std::cout << "Memory size: " << match[3] << std::endl; + LOG_INFO("Core count: " << match[1]); + LOG_INFO("Memory size: " << match[3]); } } else throw error(error::error_code::invalid_asm, "Invalid format!! " + line + "\n"); @@ -253,7 +253,7 @@ read_include_file(std::string filename) if (!file.is_open()) { return false; } -// std::cout << "Reading file:" << filename << std::endl; + LOG_INFO("Reading file:" << filename); std::string line; m_parserptr->set_data_state(false); @@ -368,7 +368,7 @@ read_pad_file(std::string& name, std::string& filename) return false; } -// std::cout << "Reading file:" << filename << std::endl; + LOG_INFO("Reading file:" << filename); std::string line; m_parserptr->set_data_state(false); diff --git a/src/cpp/preprocessor/asm/asm_parser.h b/src/cpp/preprocessor/asm/asm_parser.h index b700c9d9..079c383f 100644 --- a/src/cpp/preprocessor/asm/asm_parser.h +++ b/src/cpp/preprocessor/asm/asm_parser.h @@ -6,6 +6,7 @@ #include "code_section.h" #include "utils.h" #include "file_utils.h" +#include "logger.h" #include #include diff --git a/src/cpp/utils/target/target.cpp b/src/cpp/utils/target/target.cpp index d5178a87..05428f5c 100644 --- a/src/cpp/utils/target/target.cpp +++ b/src/cpp/utils/target/target.cpp @@ -10,6 +10,7 @@ #include "target.h" #include "utils.h" #include "file_utils.h" +#include "logger.h" std::map > aiebu::utilities:: @@ -338,13 +339,15 @@ target_aie4::assemble(const sub_cmd_options &_options) cxxopts::Options all_options("Target aie4 Options", m_description); + std::string log_level_str; try { all_options.add_options() ("outputelf,o", "ELF output file name", cxxopts::value()) ("asm,c", "ASM File", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) ("L,libpath", "libs path", cxxopts::value()) - ("f,flag", "flags", cxxopts::value()) + ("f,flag", "flags (e.g., 'verbose' for detailed output, 'disabledump', 'fulldump')", cxxopts::value()) + ("log-level", "log level: error, warn, info, debug (default: warn)", cxxopts::value()) ("help,h", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -379,6 +382,22 @@ target_aie4::assemble(const sub_cmd_options &_options) if (result.count("json")) external_buffers_file = result["json"].as(); + if (result.count("log-level")) { + log_level_str = result["log-level"].as(); + if (log_level_str == "error") + aiebu::set_log_level(aiebu::log_level::error); + else if (log_level_str == "warn") + aiebu::set_log_level(aiebu::log_level::warn); + else if (log_level_str == "info") + aiebu::set_log_level(aiebu::log_level::info); + else if (log_level_str == "debug") + aiebu::set_log_level(aiebu::log_level::debug); + else { + auto errMsg = boost::format("Invalid log level: %s. Valid options: error, warn, info, debug\n") % log_level_str; + throw std::runtime_error(errMsg.str()); + } + } + } catch (const cxxopts::exceptions::exception& e) { std::cout << all_options.help({"", "Target aie4 Options"}); @@ -408,6 +427,7 @@ aiebu::utilities:: asm_config_parser::parser(const sub_cmd_options &options) { std::string json_file; + std::string log_level_str; cxxopts::Options all_options("Target config Options", m_description); uint32_t optimization_level =0; @@ -415,8 +435,9 @@ asm_config_parser::parser(const sub_cmd_options &options) all_options.add_options() ("o,outputelf", "ELF output file name", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) - ("f,flag", "flags", cxxopts::value()) + ("f,flag", "flags (e.g., 'verbose' for detailed output, 'disabledump', 'fulldump')", cxxopts::value()) ("O,optimization", "optimization level (1-4)", cxxopts::value()->default_value("0")) + ("log-level", "log level: error, warn, info, debug (default: warn)", cxxopts::value()) ("h,help", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -451,6 +472,22 @@ asm_config_parser::parser(const sub_cmd_options &options) flags.insert(flags.end(), extra_flags.begin(), extra_flags.end()); } + if (result.count("log-level")) { + log_level_str = result["log-level"].as(); + if (log_level_str == "error") + aiebu::set_log_level(aiebu::log_level::error); + else if (log_level_str == "warn") + aiebu::set_log_level(aiebu::log_level::warn); + else if (log_level_str == "info") + aiebu::set_log_level(aiebu::log_level::info); + else if (log_level_str == "debug") + aiebu::set_log_level(aiebu::log_level::debug); + else { + auto errMsg = boost::format("Invalid log level: %s. Valid options: error, warn, info, debug\n") % log_level_str; + throw std::runtime_error(errMsg.str()); + } + } + } catch (const cxxopts::exceptions::exception& e) { std::cout << all_options.help({"", "Target config Options"}); diff --git a/src/cpp/utils/target/target.h b/src/cpp/utils/target/target.h index 00f48ef6..1a17faed 100644 --- a/src/cpp/utils/target/target.h +++ b/src/cpp/utils/target/target.h @@ -5,6 +5,7 @@ #include "aiebu/aiebu_assembler.h" #include "aiebu/aiebu_error.h" +#include "logger.h" #include #include @@ -41,7 +42,7 @@ class target inline void write_elf(const aiebu::aiebu_assembler& as, const std::string& outfile) { auto e = as.get_elf(); - std::cout << "elf size:" << e.size() << "\n"; + LOG_INFO("elf size:" << e.size()); std::ofstream output_file(outfile, std::ios_base::binary); output_file.write(e.data(), e.size()); } From 95cca61c57a63ae726b864d7c1c454ad820739fe Mon Sep 17 00:00:00 2001 From: Donwalkar Date: Tue, 25 Nov 2025 07:27:55 -0800 Subject: [PATCH 2/4] Add loglevels to aiebu, set at runtime Signed-off-by: Donwalkar --- src/cpp/preprocessor/asm/asm_parser.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/preprocessor/asm/asm_parser.h b/src/cpp/preprocessor/asm/asm_parser.h index 3e4a173c..e2c8afdd 100644 --- a/src/cpp/preprocessor/asm/asm_parser.h +++ b/src/cpp/preprocessor/asm/asm_parser.h @@ -8,6 +8,7 @@ #include "file_utils.h" #include "logger.h" #include "common/regex_wrapper.h" +#include "logger.h" #include #include From 437eda640a73fc0f62ba9caeb94558a50c5e69c2 Mon Sep 17 00:00:00 2001 From: Donwalkar Date: Wed, 3 Dec 2025 16:01:09 -0800 Subject: [PATCH 3/4] Merged loglevel in -f flag + Fix warnings Signed-off-by: Donwalkar --- src/cpp/assembler/aiebu_assembler.cpp | 11 +-- src/cpp/common/logger.h | 26 +++--- src/cpp/encoder/aie2ps/aie2ps_encoder.cpp | 2 +- src/cpp/ops/ops.cpp | 3 +- .../aie2/aie2_blob_preprocessor_input.cpp | 7 +- .../aie2/aie2_blob_preprocessor_input.h | 20 ++++- .../preprocessor/aie2ps/aie2ps_preprocessor.h | 23 +++-- .../aie2ps/aie2ps_preprocessor_input.h | 5 +- src/cpp/utils/target/target.cpp | 89 ++++++++++--------- 9 files changed, 115 insertions(+), 71 deletions(-) diff --git a/src/cpp/assembler/aiebu_assembler.cpp b/src/cpp/assembler/aiebu_assembler.cpp index 3d5feeb3..45c2c2ad 100644 --- a/src/cpp/assembler/aiebu_assembler.cpp +++ b/src/cpp/assembler/aiebu_assembler.cpp @@ -10,6 +10,7 @@ #include "utils.h" #include "file_utils.h" #include "transform_manager.h" +#include "logger.h" #include "aiebu/aiebu.h" #include "aiebu/aiebu_assembler.h" #include "aiebu/aiebu_error.h" @@ -199,19 +200,19 @@ aiebu_assembler_get_elf(enum aiebu_assembler_buffer_type type, if (buffer1 == nullptr && buffer1_size != 0) { - std::cout << "ERROR: Invalid buffer1 size" << std::endl; + LOG_ERROR("Invalid buffer1 size"); return -(static_cast(aiebu::error::error_code::invalid_input)); } if (buffer2 == nullptr && buffer2_size != 0) { - std::cout << "ERROR: Invalid buffer2 size" << std::endl; + LOG_ERROR("Invalid buffer2 size"); return -(static_cast(aiebu::error::error_code::invalid_input)); } if (patch_json == nullptr && patch_json_size !=0) { - std::cout << "ERROR: Invalid patch json size" << std::endl; + LOG_ERROR("Invalid patch json size"); return -(static_cast(aiebu::error::error_code::invalid_input)); } @@ -248,12 +249,12 @@ aiebu_assembler_get_elf(enum aiebu_assembler_buffer_type type, } catch (aiebu::error &ex) { - std::cout << "ERROR: " << ex.what() << std::endl; + LOG_ERROR(ex.what()); ret = -(ex.get_code()); } catch (std::exception &ex) { - std::cout << "ERROR: " << ex.what() << std::endl; + LOG_ERROR(ex.what()); ret = -(static_cast(aiebu::error::error_code::internal_error)); } return ret; diff --git a/src/cpp/common/logger.h b/src/cpp/common/logger.h index d12ae7fd..46b58af6 100644 --- a/src/cpp/common/logger.h +++ b/src/cpp/common/logger.h @@ -17,32 +17,35 @@ enum class log_level { debug = 3 // Debug messages (shown with verbose) }; -// Global log level (default: errors and warnings) -inline log_level g_log_level = log_level::warn; +// Internal function to access log level (thread-safe singleton pattern) +inline log_level& get_log_level_ref() { + static log_level level = log_level::warn; + return level; +} // Set log level inline void set_log_level(log_level level) { - g_log_level = level; + get_log_level_ref() = level; } // Get log level inline log_level get_log_level() { - return g_log_level; + return get_log_level_ref(); } // Enable verbose mode (shows info and debug messages) inline void enable_verbose_logging() { - g_log_level = log_level::debug; + get_log_level_ref() = log_level::debug; } // Disable verbose mode (back to default: errors and warnings) inline void disable_verbose_logging() { - g_log_level = log_level::warn; + get_log_level_ref() = log_level::warn; } } // namespace aiebu -// Logging macros +// NOLINTBEGIN(cppcoreguidelines-avoid-do-while) #define LOG_ERROR(msg) \ do { \ std::cerr << "[ERROR] " << msg << std::endl; \ @@ -50,24 +53,25 @@ inline void disable_verbose_logging() { #define LOG_WARN(msg) \ do { \ - if (aiebu::g_log_level >= aiebu::log_level::warn) { \ + if (aiebu::get_log_level_ref() >= aiebu::log_level::warn) { \ std::cout << "[WARN] " << msg << std::endl; \ } \ } while (0) #define LOG_INFO(msg) \ do { \ - if (aiebu::g_log_level >= aiebu::log_level::info) { \ - std::cout << msg << std::endl; \ + if (aiebu::get_log_level_ref() >= aiebu::log_level::info) { \ + std::cout << "[INFO]" << msg << std::endl; \ } \ } while (0) #define LOG_DEBUG(msg) \ do { \ - if (aiebu::g_log_level >= aiebu::log_level::debug) { \ + if (aiebu::get_log_level_ref() >= aiebu::log_level::debug) { \ std::cout << "[DEBUG] " << msg << std::endl; \ } \ } while (0) +// NOLINTEND(cppcoreguidelines-avoid-do-while) #endif // AIEBU_COMMON_LOGGER_H diff --git a/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp b/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp index d741c00b..51d864ee 100644 --- a/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp +++ b/src/cpp/encoder/aie2ps/aie2ps_encoder.cpp @@ -80,7 +80,7 @@ process(std::shared_ptr input) } } - // Report (only if verbose flag is set or log level is info or higher) + // Report (only if log level is info or higher) if (get_log_level() >= log_level::info) m_report.summary(std::cout); diff --git a/src/cpp/ops/ops.cpp b/src/cpp/ops/ops.cpp index ad9da9bc..5f365013 100644 --- a/src/cpp/ops/ops.cpp +++ b/src/cpp/ops/ops.cpp @@ -3,6 +3,7 @@ #include "ops.h" #include "aiebu/aiebu_error.h" +#include "logger.h" #include #include @@ -122,7 +123,7 @@ serialize(std::shared_ptr state, std::vector& symbols, // arg 0 to 6 and be patched in CERT. // Beyond that its elfloader/host responsibility to patch mandatorily if (val > 6 && val != offset_type_marker) - std::cout <<"WARNING: Apply_offset_57 has arg index " << val << " > 6, Should be mandatorily patched in host!!!\n"; + LOG_WARN("Apply_offset_57 has arg index " << val << " > 6, Should be mandatorily patched in host!!!"); else if (val != offset_type_marker) { // val is arg index, to get offset x2 diff --git a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.cpp b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.cpp index 041c0fa7..0681cf76 100644 --- a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.cpp +++ b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.cpp @@ -4,6 +4,7 @@ #include #include "file_utils.h" #include "aie2_blob_preprocessor_input.h" +#include "logger.h" #include "xaiengine.h" # if defined (AIEBU_NATIVE_BUILD) @@ -24,7 +25,7 @@ add_preemption_code(uint32_t col) auto error_msg = boost::format("Preemption save/restore code for not available for txn buffer with col:(%d)\n") % col; throw error(error::error_code::invalid_asm, error_msg.str()); } - std::cout << "Save/Restore preemption code added for col" << col << "\n"; + LOG_INFO("Save/Restore preemption code added for col " << col); m_data[preempt_save].resize(stx_save_restore_map.at(col).first.size()); std::memcpy(m_data[preempt_save].data(), stx_save_restore_map.at(col).first.data(), stx_save_restore_map.at(col).first.size()); @@ -1025,7 +1026,7 @@ add_preemption_code(uint32_t col) const auto& pdis = pt_pdis.get(); add_pdi(mangled_name, pdis, paths); } else { - std::cout << "PDIs not found\n"; + LOG_WARN("PDIs not found"); } const auto& pt_instance = ctrlcode.get_child_optional("instance"); @@ -1033,7 +1034,7 @@ add_preemption_code(uint32_t col) const auto& pinstance = pt_instance.get(); add_instance(mangled_name, pinstance, paths); } else { - std::cout << "instance not found\n"; + LOG_WARN("instance not found"); } } } diff --git a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h index f35dd938..b3c7922a 100644 --- a/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h +++ b/src/cpp/preprocessor/aie2/aie2_blob_preprocessor_input.h @@ -10,6 +10,7 @@ #include "file_utils.h" #include "preprocessor_input.h" #include "asm/asm_parser.h" +#include "logger.h" #include #include @@ -102,14 +103,27 @@ class aie2_blob_preprocessor_input : public preprocessor_input const std::vector& /*libpaths*/, const std::map >& ctrlpkt) override { + const std::string loglevel_prefix = "loglevel_"; for (const auto& lib: libs) { if (lib == legacydpuxclbin) arg_offset = 1; - else if (lib == "verbose") - enable_verbose_logging(); + else if (lib.find(loglevel_prefix) == 0) { + // Process log level for library API users + std::string log_level_str = lib.substr(loglevel_prefix.size()); + if (log_level_str == "error") + set_log_level(log_level::error); + else if (log_level_str == "warn") + set_log_level(log_level::warn); + else if (log_level_str == "info") + set_log_level(log_level::info); + else if (log_level_str == "debug") + set_log_level(log_level::debug); + else + LOG_WARN("Invalid log level flag: " << lib << ", ignored"); + } else - std::cout << "Invalid flag: " << lib << ", ignored !!!" << std::endl; + LOG_WARN("Invalid flag: " << lib << ", ignored"); } m_data[".ctrltext"] = mc_code; diff --git a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h index afbf63d0..6514ce26 100644 --- a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h +++ b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor.h @@ -12,6 +12,7 @@ #include "aie2ps_preprocessor_input.h" #include "aie2ps_preprocessed_output.h" #include "specification/aie2ps/isa.h" +#include "logger.h" namespace aiebu { @@ -19,7 +20,6 @@ class aie2ps_preprocessor: public preprocessor { const std::string disable_dump_map = "disabledump"; const std::string full_dump_map = "fulldump"; - const std::string verbose_asm = "verbose"; std::shared_ptr>> m_isa; public: aie2ps_preprocessor() {} @@ -47,22 +47,35 @@ class aie2ps_preprocessor: public preprocessor //auto keys = tinput->get_keys(); const std::string prefix = "opt_level_"; - // Process flags before parsing to set global verbose flag + // Process flags before parsing auto flags = tinput->get_flags(); uint32_t optimize = 0; asm_dump_flag debug_flag = asm_dump_flag::text; + const std::string loglevel_prefix = "loglevel_"; for (const auto& flag: flags) { if (flag == disable_dump_map) debug_flag = asm_dump_flag::disable; else if (flag == full_dump_map) debug_flag = asm_dump_flag::full; - else if (flag == verbose_asm) - enable_verbose_logging(); else if (flag.find(prefix) == 0) optimize = std::stoi(flag.substr(prefix.size())); + else if (flag.find(loglevel_prefix) == 0) { + // Process log level for library API users + std::string log_level_str = flag.substr(loglevel_prefix.size()); + if (log_level_str == "error") + set_log_level(log_level::error); + else if (log_level_str == "warn") + set_log_level(log_level::warn); + else if (log_level_str == "info") + set_log_level(log_level::info); + else if (log_level_str == "debug") + set_log_level(log_level::debug); + else + LOG_WARN("Invalid log level flag: " << flag << ", ignored"); + } else - std::cout << "Invalid flag: " << flag << ", ignored !!!" << std::endl; + LOG_WARN("Invalid flag: " << flag << ", ignored"); } std::shared_ptr parser(new asm_parser(tinput->get_ctrlcode_data(), tinput->get_include_paths())); diff --git a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor_input.h b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor_input.h index ec7f8180..5ca1cf7d 100644 --- a/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor_input.h +++ b/src/cpp/preprocessor/aie2ps/aie2ps_preprocessor_input.h @@ -9,6 +9,7 @@ #include "utils.h" #include "file_utils.h" #include "preprocessor_input.h" +#include "logger.h" #include #include @@ -133,7 +134,7 @@ class asm_config_preprocessor_input : public preprocessor_input const auto& pt_xrt_kernel_instance = pt.get_child_optional("xrt-kernels"); if (!pt_xrt_kernel_instance) { - std::cout << "xrt-kernels instance not found returning\n"; + LOG_WARN("xrt-kernels instance not found, returning"); return; } const auto& p_xrt_kernel_instance = pt_xrt_kernel_instance.get(); @@ -160,7 +161,7 @@ class asm_config_preprocessor_input : public preprocessor_input const auto& pinstance = pt_instance.get(); add_instance(mangled_name, pinstance, flags, paths); } else { - std::cout << "instance not found\n"; + LOG_WARN("instance not found"); } } } diff --git a/src/cpp/utils/target/target.cpp b/src/cpp/utils/target/target.cpp index 05428f5c..154b707e 100644 --- a/src/cpp/utils/target/target.cpp +++ b/src/cpp/utils/target/target.cpp @@ -12,6 +12,31 @@ #include "file_utils.h" #include "logger.h" +namespace { + // Helper function to process log level from flags + void process_log_level_flags(const std::vector& flags) { + const std::string loglevel_prefix = "loglevel_"; + for (const auto& flag : flags) { + if (flag.find(loglevel_prefix) == 0) { + std::string log_level_str = flag.substr(loglevel_prefix.size()); + if (log_level_str == "error") + aiebu::set_log_level(aiebu::log_level::error); + else if (log_level_str == "warn") + aiebu::set_log_level(aiebu::log_level::warn); + else if (log_level_str == "info") + aiebu::set_log_level(aiebu::log_level::info); + else if (log_level_str == "debug") + aiebu::set_log_level(aiebu::log_level::debug); + else { + auto errMsg = boost::format("Invalid log level: %s. Valid options: loglevel_error, loglevel_warn, loglevel_info, loglevel_debug\n") % flag; + throw std::runtime_error(errMsg.str()); + } + break; // Only process first log level found + } + } + } +} + std::map > aiebu::utilities:: target_aie2blob::parse_pmctrlpkt(const std::vector pm_key_value_pairs) @@ -60,7 +85,7 @@ target_aie2blob::parseOption(const sub_cmd_options &options) ("c,controlcode", "TXN control code binary or ASM file", cxxopts::value()) ("p,controlpkt", "Control packet binary", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) - ("l,lib", "linked libs", cxxopts::value()) + ("l,lib", "linked libs (also supports loglevel_error, loglevel_warn, loglevel_info, loglevel_debug)", cxxopts::value()) ("L,libpath", "libs path", cxxopts::value()) ("m,pmctrl", "pm ctrlpkt :", cxxopts::value()) ("r,report", "Generate Report", cxxopts::value()->default_value("false")) @@ -109,6 +134,9 @@ target_aie2blob::parseOption(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } + // Process log level from libs + process_log_level_flags(m_libs); + if (!m_transaction_file.empty()) readfile(m_transaction_file, m_transaction_buffer); @@ -211,7 +239,7 @@ target_aie2ps::assemble(const sub_cmd_options &options) ("asm,c", "ASM File", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) ("L,libpath", "libs path", cxxopts::value()) - ("f,flag", "flags", cxxopts::value()) + ("f,flag", "flags (e.g., 'disabledump', 'fulldump', 'loglevel_error', 'loglevel_warn', 'loglevel_info', 'loglevel_debug')", cxxopts::value()) ("help,h", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -253,6 +281,9 @@ target_aie2ps::assemble(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } + // Process log level from flags + process_log_level_flags(flags); + std::vector asmBuffer; readfile(input_file, asmBuffer); @@ -277,12 +308,14 @@ target_aie2_config::assemble(const sub_cmd_options &options) std::string output_elffile; std::string json_file; std::vector libpaths; + std::vector flags; cxxopts::Options all_options("Target aie2 config Options", m_description); try { all_options.add_options() ("o,outputelf", "ELF output file name", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) + ("f,flag", "flags (e.g., 'loglevel_error', 'loglevel_warn', 'loglevel_info', 'loglevel_debug')", cxxopts::value()) ("h,help", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -303,6 +336,9 @@ target_aie2_config::assemble(const sub_cmd_options &options) if (result.count("json")) json_file = result["json"].as(); + + if (result.count("flag")) + flags = result["flag"].as(); } catch (const cxxopts::exceptions::exception& e) { std::cout << all_options.help({"", "Target config Options"}); @@ -310,6 +346,9 @@ target_aie2_config::assemble(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } + // Process log level from flags + process_log_level_flags(flags); + std::vector json_buffer; if (!json_file.empty()) { @@ -339,15 +378,13 @@ target_aie4::assemble(const sub_cmd_options &_options) cxxopts::Options all_options("Target aie4 Options", m_description); - std::string log_level_str; try { all_options.add_options() ("outputelf,o", "ELF output file name", cxxopts::value()) ("asm,c", "ASM File", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) ("L,libpath", "libs path", cxxopts::value()) - ("f,flag", "flags (e.g., 'verbose' for detailed output, 'disabledump', 'fulldump')", cxxopts::value()) - ("log-level", "log level: error, warn, info, debug (default: warn)", cxxopts::value()) + ("f,flag", "flags (e.g., 'disabledump', 'fulldump', 'loglevel_error', 'loglevel_warn', 'loglevel_info', 'loglevel_debug')", cxxopts::value()) ("help,h", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -382,22 +419,6 @@ target_aie4::assemble(const sub_cmd_options &_options) if (result.count("json")) external_buffers_file = result["json"].as(); - if (result.count("log-level")) { - log_level_str = result["log-level"].as(); - if (log_level_str == "error") - aiebu::set_log_level(aiebu::log_level::error); - else if (log_level_str == "warn") - aiebu::set_log_level(aiebu::log_level::warn); - else if (log_level_str == "info") - aiebu::set_log_level(aiebu::log_level::info); - else if (log_level_str == "debug") - aiebu::set_log_level(aiebu::log_level::debug); - else { - auto errMsg = boost::format("Invalid log level: %s. Valid options: error, warn, info, debug\n") % log_level_str; - throw std::runtime_error(errMsg.str()); - } - } - } catch (const cxxopts::exceptions::exception& e) { std::cout << all_options.help({"", "Target aie4 Options"}); @@ -405,6 +426,9 @@ target_aie4::assemble(const sub_cmd_options &_options) throw std::runtime_error(errMsg.str()); } + // Process log level from flags + process_log_level_flags(flags); + std::vector asmBuffer; readfile(input_file, asmBuffer); @@ -427,7 +451,6 @@ aiebu::utilities:: asm_config_parser::parser(const sub_cmd_options &options) { std::string json_file; - std::string log_level_str; cxxopts::Options all_options("Target config Options", m_description); uint32_t optimization_level =0; @@ -435,9 +458,8 @@ asm_config_parser::parser(const sub_cmd_options &options) all_options.add_options() ("o,outputelf", "ELF output file name", cxxopts::value()) ("j,json", "control packet Patching json file", cxxopts::value()) - ("f,flag", "flags (e.g., 'verbose' for detailed output, 'disabledump', 'fulldump')", cxxopts::value()) + ("f,flag", "flags (e.g., 'disabledump', 'fulldump', 'loglevel_error', 'loglevel_warn', 'loglevel_info', 'loglevel_debug')", cxxopts::value()) ("O,optimization", "optimization level (1-4)", cxxopts::value()->default_value("0")) - ("log-level", "log level: error, warn, info, debug (default: warn)", cxxopts::value()) ("h,help", "show help message and exit", cxxopts::value()->default_value("false")) ; @@ -472,22 +494,6 @@ asm_config_parser::parser(const sub_cmd_options &options) flags.insert(flags.end(), extra_flags.begin(), extra_flags.end()); } - if (result.count("log-level")) { - log_level_str = result["log-level"].as(); - if (log_level_str == "error") - aiebu::set_log_level(aiebu::log_level::error); - else if (log_level_str == "warn") - aiebu::set_log_level(aiebu::log_level::warn); - else if (log_level_str == "info") - aiebu::set_log_level(aiebu::log_level::info); - else if (log_level_str == "debug") - aiebu::set_log_level(aiebu::log_level::debug); - else { - auto errMsg = boost::format("Invalid log level: %s. Valid options: error, warn, info, debug\n") % log_level_str; - throw std::runtime_error(errMsg.str()); - } - } - } catch (const cxxopts::exceptions::exception& e) { std::cout << all_options.help({"", "Target config Options"}); @@ -495,6 +501,9 @@ asm_config_parser::parser(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } + // Process log level from flags + process_log_level_flags(flags); + if (!json_file.empty()) { readfile(json_file, json_buffer); libpaths.push_back(get_parent_directory(json_file)); From d028fcf0c5f4e88c0affd8e8fc3983af01540a20 Mon Sep 17 00:00:00 2001 From: Donwalkar Date: Wed, 3 Dec 2025 18:01:29 -0800 Subject: [PATCH 4/4] Removed process_loglevel from target as preprocessor does it Signed-off-by: Donwalkar --- src/cpp/common/logger.h | 2 +- src/cpp/utils/target/target.cpp | 42 +-------------------------------- 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/src/cpp/common/logger.h b/src/cpp/common/logger.h index 46b58af6..5e689431 100644 --- a/src/cpp/common/logger.h +++ b/src/cpp/common/logger.h @@ -61,7 +61,7 @@ inline void disable_verbose_logging() { #define LOG_INFO(msg) \ do { \ if (aiebu::get_log_level_ref() >= aiebu::log_level::info) { \ - std::cout << "[INFO]" << msg << std::endl; \ + std::cout << "[INFO] " << msg << std::endl; \ } \ } while (0) diff --git a/src/cpp/utils/target/target.cpp b/src/cpp/utils/target/target.cpp index 154b707e..121fe1da 100644 --- a/src/cpp/utils/target/target.cpp +++ b/src/cpp/utils/target/target.cpp @@ -12,31 +12,6 @@ #include "file_utils.h" #include "logger.h" -namespace { - // Helper function to process log level from flags - void process_log_level_flags(const std::vector& flags) { - const std::string loglevel_prefix = "loglevel_"; - for (const auto& flag : flags) { - if (flag.find(loglevel_prefix) == 0) { - std::string log_level_str = flag.substr(loglevel_prefix.size()); - if (log_level_str == "error") - aiebu::set_log_level(aiebu::log_level::error); - else if (log_level_str == "warn") - aiebu::set_log_level(aiebu::log_level::warn); - else if (log_level_str == "info") - aiebu::set_log_level(aiebu::log_level::info); - else if (log_level_str == "debug") - aiebu::set_log_level(aiebu::log_level::debug); - else { - auto errMsg = boost::format("Invalid log level: %s. Valid options: loglevel_error, loglevel_warn, loglevel_info, loglevel_debug\n") % flag; - throw std::runtime_error(errMsg.str()); - } - break; // Only process first log level found - } - } - } -} - std::map > aiebu::utilities:: target_aie2blob::parse_pmctrlpkt(const std::vector pm_key_value_pairs) @@ -134,9 +109,6 @@ target_aie2blob::parseOption(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } - // Process log level from libs - process_log_level_flags(m_libs); - if (!m_transaction_file.empty()) readfile(m_transaction_file, m_transaction_buffer); @@ -281,9 +253,6 @@ target_aie2ps::assemble(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } - // Process log level from flags - process_log_level_flags(flags); - std::vector asmBuffer; readfile(input_file, asmBuffer); @@ -346,9 +315,6 @@ target_aie2_config::assemble(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } - // Process log level from flags - process_log_level_flags(flags); - std::vector json_buffer; if (!json_file.empty()) { @@ -357,7 +323,7 @@ target_aie2_config::assemble(const sub_cmd_options &options) } try { - aiebu::aiebu_assembler as(aiebu::aiebu_assembler::buffer_type::aie2_config, {}, {}, libpaths, json_buffer); + aiebu::aiebu_assembler as(aiebu::aiebu_assembler::buffer_type::aie2_config, {}, flags, libpaths, json_buffer); write_elf(as, output_elffile); } catch (aiebu::error &ex) { @@ -426,9 +392,6 @@ target_aie4::assemble(const sub_cmd_options &_options) throw std::runtime_error(errMsg.str()); } - // Process log level from flags - process_log_level_flags(flags); - std::vector asmBuffer; readfile(input_file, asmBuffer); @@ -501,9 +464,6 @@ asm_config_parser::parser(const sub_cmd_options &options) throw std::runtime_error(errMsg.str()); } - // Process log level from flags - process_log_level_flags(flags); - if (!json_file.empty()) { readfile(json_file, json_buffer); libpaths.push_back(get_parent_directory(json_file));