From 50fe9dd7f26615c8e90d01bb443644096e9f6185 Mon Sep 17 00:00:00 2001 From: clemens Date: Tue, 12 Aug 2025 09:37:55 +0200 Subject: [PATCH] clean parsing code --- passes/cmds/stat.cc | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/passes/cmds/stat.cc b/passes/cmds/stat.cc index 827ee0f05..a036b1930 100644 --- a/passes/cmds/stat.cc +++ b/passes/cmds/stat.cc @@ -818,12 +818,12 @@ void read_liberty_cellarea(dict &cell_area, string libert const LibertyAst *sar = cell->find("single_area_parameterised"); if (sar != nullptr) { for (const auto &s : sar->args) { - double value = 0; - auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), value); - // ec != std::errc() means parse error, or ptr didn't consume entire string - if (ec != std::errc() || ptr != s.data() + s.size()) - break; - single_parameter_area.push_back(value); + try { + double value = std::stod(s); + single_parameter_area.push_back(value); + } catch (const std::exception &e) { + log_error("Failed to parse single parameter area value '%s': %s\n", s.c_str(), e.what()); + } } if (single_parameter_area.size() == 0) printf("error: %s\n", sar->args[single_parameter_area.size() - 1].c_str()); @@ -849,10 +849,12 @@ void read_liberty_cellarea(dict &cell_area, string libert vector cast_sub_array; for (const auto &s : sub_array) { double value = 0; - auto [ptr, ec] = std::from_chars(s.data() + 1, s.data() + s.size(), value); - if (ec != std::errc() || ptr != s.data() + s.size()) - break; - cast_sub_array.push_back(value); + try { + value = std::stod(s); + cast_sub_array.push_back(value); + } catch (const std::exception &e) { + log_error("Failed to parse double parameter area value '%s': %s\n", s.c_str(), e.what()); + } } double_parameter_area.push_back(cast_sub_array); if (cast_sub_array.size() == 0)