@@ -751,12 +751,12 @@ void read_liberty_cellarea(dict<IdString, cell_area_t> &cell_area, string libert
751
751
const LibertyAst *sar = cell->find (" single_area_parameterised" );
752
752
if (sar != nullptr ) {
753
753
for (const auto &s : sar->args ) {
754
- double value = 0 ;
755
- auto [ptr, ec] = std::from_chars (s. data (), s. data () + s. size (), value );
756
- // ec != std::errc() means parse error, or ptr didn't consume entire string
757
- if (ec != std::errc () || ptr != s. data () + s. size ())
758
- break ;
759
- single_parameter_area. push_back (value);
754
+ try {
755
+ double value = std::stod (s );
756
+ single_parameter_area. push_back (value);
757
+ } catch ( const std::exception &e) {
758
+ log_error ( " Failed to parse single parameter area value '%s': %s \n " , s. c_str (), e. what ()) ;
759
+ }
760
760
}
761
761
if (single_parameter_area.size () == 0 )
762
762
printf (" error: %s\n " , sar->args [single_parameter_area.size () - 1 ].c_str ());
@@ -782,10 +782,12 @@ void read_liberty_cellarea(dict<IdString, cell_area_t> &cell_area, string libert
782
782
vector<double > cast_sub_array;
783
783
for (const auto &s : sub_array) {
784
784
double value = 0 ;
785
- auto [ptr, ec] = std::from_chars (s.data () + 1 , s.data () + s.size (), value);
786
- if (ec != std::errc () || ptr != s.data () + s.size ())
787
- break ;
788
- cast_sub_array.push_back (value);
785
+ try {
786
+ value = std::stod (s);
787
+ cast_sub_array.push_back (value);
788
+ } catch (const std::exception &e) {
789
+ log_error (" Failed to parse double parameter area value '%s': %s\n " , s.c_str (), e.what ());
790
+ }
789
791
}
790
792
double_parameter_area.push_back (cast_sub_array);
791
793
if (cast_sub_array.size () == 0 )
0 commit comments