15 namespace netlist_writer_manager
19 std::unordered_map<std::string, std::vector<std::string>> m_writer_to_extensions;
20 std::unordered_map<std::string, std::pair<std::string, WriterFactory>> m_extension_to_writer;
22 WriterFactory get_writer_factory_for_file(
const std::filesystem::path& file_name)
24 std::string extension =
utils::to_lower(file_name.extension().string());
25 if (!extension.empty() && extension[0] !=
'.')
27 extension =
"." + extension;
30 if (
auto it = m_extension_to_writer.find(extension); it != m_extension_to_writer.end())
32 log_info(
"netlist_writer",
"selected writer: {}", it->second.first);
33 return it->second.second;
36 log_error(
"netlist_writer",
"no netlist writer registered for file extension '{}'.", extension);
50 return m_writer_to_extensions;
55 for (std::string ext : supported_file_extensions)
58 if (!ext.empty() && ext[0] !=
'.')
62 if (
auto it = m_extension_to_writer.find(ext); it != m_extension_to_writer.end())
64 log_warning(
"netlist_writer",
"writer '{}' cannot be registered as file extension '{}' is already associated with writer '{}'.",
name, ext, it->second.first);
67 m_extension_to_writer.emplace(ext, std::make_pair(
name, writer_factory));
68 m_writer_to_extensions[
name].push_back(ext);
70 log_info(
"netlist_writer",
"registered netlist writer '{}' for file extension '{}'.",
name, ext);
76 if (
auto it = m_writer_to_extensions.find(
name); it != m_writer_to_extensions.end())
78 for (
const auto& ext : it->second)
80 if (
auto rm_it = m_extension_to_writer.find(ext); rm_it != m_extension_to_writer.end())
82 m_extension_to_writer.erase(rm_it);
83 log_info(
"netlist_writer",
"unregistered netlist writer '{}' for file extension '{}'.",
name, ext);
86 m_writer_to_extensions.erase(it);
92 if (
args.is_option_set(
"--write-hdl"))
94 auto output_file =
args.get_parameter(
"--write-hdl");
103 auto factory = get_writer_factory_for_file(file_path);
109 std::unique_ptr<NetlistWriter> writer = factory();
111 log_info(
"netlist_writer",
"writing netlist '{}' to file '{}'...",
netlist->get_design_name(), file_path.string());
113 auto begin_time = std::chrono::high_resolution_clock::now();
114 if (
auto res = writer->write(
netlist, file_path); res.is_error())
116 log_error(
"netlist",
"error encountered during netlist writing:\n{}", res.get_error().get());
121 "wrote netlist '{}' to file '{}' in {:2.2f} seconds.",
124 (
double)std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - begin_time).count() / 1000);
bool add(const std::string &flag, const std::string &description, const std::initializer_list< std::string > ¶meters={})
static const std::string A_REQUIRED_PARAMETER
constant to specify that a parameter is required and does not have a default value.
#define log_error(channel,...)
#define log_info(channel,...)
#define log_warning(channel,...)
ProgramOptions get_cli_options()
std::function< std::unique_ptr< NetlistWriter >()> WriterFactory
const std::unordered_map< std::string, std::vector< std::string > > & get_writer_extensions()
Retrieve the extensions for which extensions have been registered.
void unregister_writer(const std::string &name)
bool write(Netlist *netlist, const ProgramArguments &args)
void register_writer(const std::string &name, const WriterFactory &writer_factory, const std::vector< std::string > &supported_file_extensions)
CORE_API T trim(const T &s, const char *to_remove=" \t\r\n")
CORE_API T to_lower(const T &s)
This file contains various functions to create and load netlists.