@@ -12,9 +12,6 @@ use ieee.std_logic_1164.all;
1212use ieee.numeric_std.all ;
1313use ieee.math_real.all ;
1414
15- library std;
16- use std.textio.all ;
17-
1815library work;
1916use work.psi_common_array_pkg.all ;
2017
@@ -400,12 +397,75 @@ package body psi_common_math_pkg is
400397
401398 -- convert string to real
402399 function from_str(input : string ) return real is
403- variable line_v : line := new string '(input );
404- variable v : real ;
400+ constant Nbsp_c : character := character 'val (160 );
401+ variable Idx_v : integer := input 'low ;
402+ variable IsNeg_v : boolean := false ;
403+ variable ValInt_v : integer := 0 ;
404+ variable ValFrac_v : real := 0.0 ;
405+ variable FracDigits_v : integer := 0 ;
406+ variable Exp_v : integer := 0 ;
407+ variable ExpNeg_v : boolean := false ;
408+ variable ValAbs_v : real := 0.0 ;
405409 begin
406- read (line_v, v);
407- deallocate (line_v);
408- return v;
410+ -- skip leading white-spaces (space, non-breaking space or horizontal tab)
411+ while (Idx_v <= input 'high ) and (input (Idx_v) = ' ' or input (Idx_v) = Nbsp_c or input (Idx_v) = HT) loop
412+ Idx_v := Idx_v + 1 ;
413+ end loop ;
414+
415+ -- Check sign
416+ if (Idx_v <= input 'high ) and ((input (Idx_v) = '-' ) or (input (Idx_v) = ' +' )) then
417+ IsNeg_v := (input (Idx_v) = '-' );
418+ Idx_v := Idx_v + 1 ;
419+ end if ;
420+
421+ -- Parse Integer
422+ while (Idx_v <= input 'high ) and (input (Idx_v) <= ' 9' ) and (input (Idx_v) >= '0' ) loop
423+ ValInt_v := ValInt_v* 10 + (character 'pos (input (Idx_v))- character 'pos ('0' ));
424+ Idx_v := Idx_v + 1 ;
425+ end loop ;
426+
427+ -- Check decimal point
428+ if (Idx_v <= input 'high ) then
429+ if input (Idx_v) = ' .' then
430+ Idx_v := Idx_v + 1 ;
431+
432+ -- Parse Fractional
433+ while (Idx_v <= input 'high ) and (input (Idx_v) <= ' 9' ) and (input (Idx_v) >= '0' ) loop
434+ ValFrac_v := ValFrac_v* 10.0 + real ((character 'pos (input (Idx_v))- character 'pos ('0' )));
435+ FracDigits_v := FracDigits_v + 1 ;
436+ Idx_v := Idx_v + 1 ;
437+ end loop ;
438+ end if ;
439+ end if ;
440+
441+ -- Check exponent
442+ if (Idx_v <= input 'high ) then
443+ if (input (Idx_v) = ' E' ) or (input (Idx_v) = ' e' ) then
444+ Idx_v := Idx_v + 1 ;
445+ -- Check sign
446+ if (Idx_v <= input 'high ) and ((input (Idx_v) = '-' ) or (input (Idx_v) = ' +' )) then
447+ ExpNeg_v := (input (Idx_v) = '-' );
448+ Idx_v := Idx_v + 1 ;
449+ end if ;
450+
451+ -- Parse Integer
452+ while (Idx_v <= input 'high ) and (input (Idx_v) <= ' 9' ) and (input (Idx_v) >= '0' ) loop
453+ Exp_v := Exp_v* 10 + (character 'pos (input (Idx_v))- character 'pos ('0' ));
454+ Idx_v := Idx_v + 1 ;
455+ end loop ;
456+ if ExpNeg_v then
457+ Exp_v := - Exp_v;
458+ end if ;
459+ end if ;
460+ end if ;
461+
462+ -- Return
463+ ValAbs_v := (real (ValInt_v)+ ValFrac_v/ 10.0 ** real (FracDigits_v))* 10.0 ** real (Exp_v);
464+ if IsNeg_v then
465+ return - ValAbs_v;
466+ else
467+ return ValAbs_v;
468+ end if ;
409469 end function ;
410470
411471 -- convert string to real array
0 commit comments